Skip to content

Add motion design tokens (duration and easing) to @wordpress/theme#76097

Merged
ciampo merged 28 commits into
trunkfrom
add/theme-motion-tokens
May 12, 2026
Merged

Add motion design tokens (duration and easing) to @wordpress/theme#76097
ciampo merged 28 commits into
trunkfrom
add/theme-motion-tokens

Conversation

@jameskoster
Copy link
Copy Markdown
Contributor

@jameskoster jameskoster commented Mar 3, 2026

Screen.Recording.2026-03-03.at.16.33.21.mov

What

Adds motion design tokens to @wordpress/theme — a set of duration and easing curve tokens for standardizing animation timing across components — and adopts them in Dialog, Modal, and Menu/DropdownMenu.

Duration tokens

Token Value Guidance
--wpds-motion-duration-xs 50ms Micro-delays and transition offsets
--wpds-motion-duration-sm 100ms Micro-interactions like focus rings and state changes
--wpds-motion-duration-md 200ms Standard transitions like menus and popovers
--wpds-motion-duration-lg 300ms Deliberate animations like slides and reveals
--wpds-motion-duration-xl 400ms Extended animations like complex or multi-step transitions

Easing tokens

Token Value Guidance
--wpds-motion-easing-subtle cubic-bezier(0.15, 0, 0.15, 1) Nearly imperceptible easing for hover, color, and background transitions
--wpds-motion-easing-balanced cubic-bezier(0.4, 0, 0.2, 1) General-purpose easing for on-screen movement like resizing, morphing, and layout shifts
--wpds-motion-easing-expressive cubic-bezier(0.25, 0, 0, 1) Noticeable easing for enter/exit and spatial transitions like menus, popovers, dialogs, and drawers

Why

Animation timing is currently hardcoded across components with magic numbers. The Dialog component, for example, uses 0.2s cubic-bezier(0.29, 0, 0, 1) for its entrance and 0.2s cubic-bezier(1, 0, 0.2, 1) for its exit — values that were chosen thoughtfully but aren't reusable by other components.

Centralizing these values as tokens:

  • Ensures consistent motion feel across the design system
  • Makes it easy for new components to adopt the same curves
  • Creates a single place to tune animation timing system-wide
  • Provides clear guidance on which token to reach for in a given scenario

Design decisions

Easing model — decelerate for both enter and exit: Rather than providing separate accelerate/decelerate pairs, the system uses decelerating easing for both entrances and exits. This follows the logic that all enter/exit animations should start fast and feel responsive. Accelerating easing (slow start, fast end) can feel jarring for exits like fades and scale-downs, where the element lingers visibly before vanishing abruptly. Decelerating easing front-loads the visual change and finishes gently, which feels smoother for the opacity and scale-based animations used by dialogs, modals, and menus.

Three easing tokens, three roles: The easing tokens map to a simple decision tree:

  1. Is the element entering or exiting? → expressive
  2. Is it moving or morphing on screen? → balanced
  3. Is it a hover, color, or background change? → subtle
  4. Is it constant motion (progress bar, marquee)? → CSS linear keyword (no token needed)

Intent-based naming: Easing tokens are named by perceptual intensity (subtlebalancedexpressive) rather than by curve direction or physics model. This keeps the API intuitive — you pick the token that matches how noticeable you want the easing to feel — and avoids overloading the scale with direction-modifier combinations.

Perceptually distinct curves: The three curves are designed for clear separation across the scale. subtle is near-linear, keeping transitions almost imperceptible. balanced has a noticeable slow start with moderate deceleration. expressive has a snappy deceleration that makes enter/exit transitions feel responsive. Each curve differs meaningfully from its neighbors in both halves of the animation.

Duration scale: The five-step xsxl scale provides enough granularity without being overwhelming. The descriptions intentionally avoid prescribing specific components to specific durations, since the right choice depends on the element's size, prominence, and context.

How

Token definition

  • New token definition file: packages/theme/tokens/motion.json (DTCG format, with duration and cubicBezier types)
  • Updated terrazzo.config.ts to include the new file and generate DurationSize and Easing TypeScript types
  • Rebuilt prebuilt outputs: CSS custom properties, JS token list, JS fallback values, TypeScript types, and token documentation
  • Added a Storybook story (motion.story.tsx) with interactive animation demos

Token adoption

UI/Dialog (packages/ui/src/dialog/style.module.css): Replaced all hardcoded duration+easing pairs. The backdrop uses --wpds-motion-easing-subtle (background opacity transition), while the popup uses --wpds-motion-easing-expressive for both enter and exit.

Components/Modal (packages/components/src/modal/):

  • Overlay fade uses --wpds-motion-easing-subtle (background opacity transition).
  • Frame enter and exit both use --wpds-motion-easing-expressive.
  • Replaced the JS-injected --modal-frame-animation-duration custom property with --wpds-motion-duration-md applied directly in CSS, removing frameStyle from the exit animation hook and the component.
  • Replaced the @wordpress/base-styles fade mixins with local keyframes using --wpds-motion-duration-sm for the backdrop fade.

Components/Menu and DropdownMenu (packages/components/src/utils/dropdown-motion.ts, packages/ui/src/utils/css/dropdown-motion.module.css):

  • The UI-side CSS module (dropdown-motion.module.css) now uses --wpds-motion-duration-md, --wpds-motion-easing-expressive, and --wpds-motion-duration-sm tokens directly.
  • The components-side JS constants (dropdown-motion.ts) retain hardcoded values because the no-ds-tokens ESLint rule prevents --wpds-* usage in packages/components/src/ (incompatible with Emotion's build-time fallback injection). A comment documents the constraint and notes that values should stay in sync with the tokens.

Testing

  1. npm run --workspace @wordpress/theme build to verify the token build succeeds
  2. Open Storybook and navigate to Design System > Tokens > Motion to see the interactive demo
  3. Verify CSS custom properties are available in the generated design-tokens.css
  4. Open the Modal story in Storybook and verify the open/close animations behave correctly (scale + fade entrance, reverse on exit)
  5. Open the Dialog story and verify open/close animations are unchanged
  6. Open the Menu story and verify the slide + fade entrance animation is unchanged

@jameskoster jameskoster requested a review from a team as a code owner March 3, 2026 16:39
@jameskoster jameskoster added Design System Issues related to the system of combining components according to best practices. [Package] Theme /packages/theme labels Mar 3, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 3, 2026

Size Change: +331 B (0%)

Total Size: 7.93 MB

📦 View Changed
Filename Size Change
build/modules/boot/index.min.js 19.2 kB +94 B (+0.49%)
build/scripts/components/index.min.js 266 kB +44 B (+0.02%)
build/styles/components/style-rtl.css 17.6 kB +49 B (+0.28%)
build/styles/components/style-rtl.min.css 14.4 kB +47 B (+0.33%)
build/styles/components/style.css 17.7 kB +49 B (+0.28%)
build/styles/components/style.min.css 14.4 kB +48 B (+0.33%)
ℹ️ View Unchanged
Filename Size
build/modules/a11y/index.min.js 355 B
build/modules/abilities/index.min.js 42.3 kB
build/modules/block-editor/utils/fit-text-frontend.min.js 617 B
build/modules/block-library/accordion/view.min.js 595 B
build/modules/block-library/file/view.min.js 346 B
build/modules/block-library/form/view.min.js 528 B
build/modules/block-library/image/view.min.js 2.64 kB
build/modules/block-library/navigation/view.min.js 1.14 kB
build/modules/block-library/playlist/view.min.js 10.9 kB
build/modules/block-library/query/view.min.js 518 B
build/modules/block-library/search/view.min.js 498 B
build/modules/block-library/tabs/view.min.js 946 B
build/modules/connectors/index.min.js 2.05 kB
build/modules/content-types/index.min.js 136 kB
build/modules/core-abilities/index.min.js 907 B
build/modules/edit-site-init/index.min.js 1.4 kB
build/modules/interactivity-router/full-page.min.js 451 B
build/modules/interactivity-router/index.min.js 11.6 kB
build/modules/interactivity/index.min.js 15.3 kB
build/modules/latex-to-mathml/index.min.js 56.5 kB
build/modules/latex-to-mathml/loader.min.js 131 B
build/modules/lazy-editor/index.min.js 14.1 kB
build/modules/route/index.min.js 25.2 kB
build/modules/vips/loader.min.js 127 B
build/modules/vips/worker.min.js 4.56 MB
build/modules/workflow/index.min.js 19.9 kB
build/scripts/a11y/index.min.js 1.06 kB
build/scripts/annotations/index.min.js 2.49 kB
build/scripts/api-fetch/index.min.js 2.83 kB
build/scripts/autop/index.min.js 2.18 kB
build/scripts/base-styles/index.min.js 98 B
build/scripts/blob/index.min.js 631 B
build/scripts/block-directory/index.min.js 10.3 kB
build/scripts/block-editor/index.min.js 343 kB
build/scripts/block-library/index.min.js 319 kB
build/scripts/block-serialization-default-parser/index.min.js 1.16 kB
build/scripts/block-serialization-spec-parser/index.min.js 3.08 kB
build/scripts/blocks/index.min.js 57 kB
build/scripts/commands/index.min.js 21 kB
build/scripts/compose/index.min.js 11.1 kB
build/scripts/core-commands/index.min.js 4.33 kB
build/scripts/core-data/index.min.js 31 kB
build/scripts/customize-widgets/index.min.js 14.6 kB
build/scripts/data-controls/index.min.js 795 B
build/scripts/data/index.min.js 9.66 kB
build/scripts/date/index.min.js 23.6 kB
build/scripts/deprecated/index.min.js 756 B
build/scripts/dom-ready/index.min.js 476 B
build/scripts/dom/index.min.js 5 kB
build/scripts/edit-post/index.min.js 18.7 kB
build/scripts/edit-site/index.min.js 265 kB
build/scripts/edit-widgets/index.min.js 22.2 kB
build/scripts/editor/index.min.js 428 kB
build/scripts/element/index.min.js 5.17 kB
build/scripts/escape-html/index.min.js 587 B
build/scripts/format-library/index.min.js 13.1 kB
build/scripts/hooks/index.min.js 1.83 kB
build/scripts/html-entities/index.min.js 494 B
build/scripts/i18n/index.min.js 2.47 kB
build/scripts/is-shallow-equal/index.min.js 572 B
build/scripts/keyboard-shortcuts/index.min.js 1.61 kB
build/scripts/keycodes/index.min.js 1.56 kB
build/scripts/list-reusable-blocks/index.min.js 2.49 kB
build/scripts/media-utils/index.min.js 79.9 kB
build/scripts/notices/index.min.js 1.85 kB
build/scripts/nux/index.min.js 1.89 kB
build/scripts/patterns/index.min.js 7.96 kB
build/scripts/plugins/index.min.js 2.15 kB
build/scripts/preferences-persistence/index.min.js 2.15 kB
build/scripts/preferences/index.min.js 3.3 kB
build/scripts/primitives/index.min.js 1.01 kB
build/scripts/priority-queue/index.min.js 1.62 kB
build/scripts/private-apis/index.min.js 1.11 kB
build/scripts/react-i18n/index.min.js 833 B
build/scripts/redux-routine/index.min.js 3.37 kB
build/scripts/reusable-blocks/index.min.js 3.1 kB
build/scripts/rich-text/index.min.js 14 kB
build/scripts/router/index.min.js 5.96 kB
build/scripts/server-side-render/index.min.js 1.91 kB
build/scripts/shortcode/index.min.js 1.59 kB
build/scripts/style-engine/index.min.js 2.42 kB
build/scripts/sync/index.min.js 38.8 kB
build/scripts/theme/index.min.js 22.3 kB
build/scripts/token-list/index.min.js 739 B
build/scripts/undo-manager/index.min.js 918 B
build/scripts/upload-media/index.min.js 11.2 kB
build/scripts/url/index.min.js 3.98 kB
build/scripts/vendors/react-dom.min.js 43.3 kB
build/scripts/vendors/react-jsx-runtime.min.js 667 B
build/scripts/vendors/react.min.js 2.77 kB
build/scripts/viewport/index.min.js 1.22 kB
build/scripts/warning/index.min.js 454 B
build/scripts/widgets/index.min.js 7.8 kB
build/scripts/wordcount/index.min.js 1.04 kB
build/styles/base-styles/admin-schemes-rtl.css 1.71 kB
build/styles/base-styles/admin-schemes-rtl.min.css 775 B
build/styles/base-styles/admin-schemes.css 1.71 kB
build/styles/base-styles/admin-schemes.min.css 775 B
build/styles/block-directory/style-rtl.css 1.97 kB
build/styles/block-directory/style-rtl.min.css 1.06 kB
build/styles/block-directory/style.css 1.98 kB
build/styles/block-directory/style.min.css 1.06 kB
build/styles/block-editor/content-rtl.css 5.44 kB
build/styles/block-editor/content-rtl.min.css 4.01 kB
build/styles/block-editor/content.css 5.44 kB
build/styles/block-editor/content.min.css 4.01 kB
build/styles/block-editor/default-editor-styles-rtl.css 697 B
build/styles/block-editor/default-editor-styles-rtl.min.css 224 B
build/styles/block-editor/default-editor-styles.css 697 B
build/styles/block-editor/default-editor-styles.min.css 224 B
build/styles/block-editor/style-rtl.css 18.7 kB
build/styles/block-editor/style-rtl.min.css 15.9 kB
build/styles/block-editor/style.css 18.7 kB
build/styles/block-editor/style.min.css 15.9 kB
build/styles/block-library/accordion-heading/style-rtl.css 346 B
build/styles/block-library/accordion-heading/style-rtl.min.css 325 B
build/styles/block-library/accordion-heading/style.css 346 B
build/styles/block-library/accordion-heading/style.min.css 325 B
build/styles/block-library/accordion-item/style-rtl.css 239 B
build/styles/block-library/accordion-item/style-rtl.min.css 180 B
build/styles/block-library/accordion-item/style.css 238 B
build/styles/block-library/accordion-item/style.min.css 180 B
build/styles/block-library/accordion-panel/style-rtl.css 110 B
build/styles/block-library/accordion-panel/style-rtl.min.css 99 B
build/styles/block-library/accordion-panel/style.css 110 B
build/styles/block-library/accordion-panel/style.min.css 99 B
build/styles/block-library/accordion/style-rtl.css 69 B
build/styles/block-library/accordion/style-rtl.min.css 62 B
build/styles/block-library/accordion/style.css 69 B
build/styles/block-library/accordion/style.min.css 62 B
build/styles/block-library/archives/style-rtl.css 101 B
build/styles/block-library/archives/style-rtl.min.css 90 B
build/styles/block-library/archives/style.css 101 B
build/styles/block-library/archives/style.min.css 90 B
build/styles/block-library/audio/editor-rtl.css 166 B
build/styles/block-library/audio/editor-rtl.min.css 149 B
build/styles/block-library/audio/editor.css 166 B
build/styles/block-library/audio/editor.min.css 151 B
build/styles/block-library/audio/style-rtl.css 945 B
build/styles/block-library/audio/style-rtl.min.css 132 B
build/styles/block-library/audio/style.css 945 B
build/styles/block-library/audio/style.min.css 132 B
build/styles/block-library/audio/theme-rtl.css 967 B
build/styles/block-library/audio/theme-rtl.min.css 134 B
build/styles/block-library/audio/theme.css 967 B
build/styles/block-library/audio/theme.min.css 134 B
build/styles/block-library/avatar/editor-rtl.css 127 B
build/styles/block-library/avatar/editor-rtl.min.css 115 B
build/styles/block-library/avatar/editor.css 127 B
build/styles/block-library/avatar/editor.min.css 115 B
build/styles/block-library/avatar/style-rtl.css 117 B
build/styles/block-library/avatar/style-rtl.min.css 104 B
build/styles/block-library/avatar/style.css 117 B
build/styles/block-library/avatar/style.min.css 104 B
build/styles/block-library/breadcrumbs/style-rtl.css 233 B
build/styles/block-library/breadcrumbs/style-rtl.min.css 203 B
build/styles/block-library/breadcrumbs/style.css 233 B
build/styles/block-library/breadcrumbs/style.min.css 203 B
build/styles/block-library/button/editor-rtl.css 306 B
build/styles/block-library/button/editor-rtl.min.css 265 B
build/styles/block-library/button/editor.css 317 B
build/styles/block-library/button/editor.min.css 265 B
build/styles/block-library/button/style-rtl.css 651 B
build/styles/block-library/button/style-rtl.min.css 596 B
build/styles/block-library/button/style.css 662 B
build/styles/block-library/button/style.min.css 596 B
build/styles/block-library/buttons/editor-rtl.css 391 B
build/styles/block-library/buttons/editor-rtl.min.css 291 B
build/styles/block-library/buttons/editor.css 391 B
build/styles/block-library/buttons/editor.min.css 291 B
build/styles/block-library/buttons/style-rtl.css 452 B
build/styles/block-library/buttons/style-rtl.min.css 349 B
build/styles/block-library/buttons/style.css 453 B
build/styles/block-library/buttons/style.min.css 349 B
build/styles/block-library/calendar/style-rtl.css 271 B
build/styles/block-library/calendar/style-rtl.min.css 239 B
build/styles/block-library/calendar/style.css 271 B
build/styles/block-library/calendar/style.min.css 239 B
build/styles/block-library/categories/editor-rtl.css 171 B
build/styles/block-library/categories/editor-rtl.min.css 132 B
build/styles/block-library/categories/editor.css 170 B
build/styles/block-library/categories/editor.min.css 131 B
build/styles/block-library/categories/style-rtl.css 226 B
build/styles/block-library/categories/style-rtl.min.css 169 B
build/styles/block-library/categories/style.css 235 B
build/styles/block-library/categories/style.min.css 169 B
build/styles/block-library/classic-rtl.css 402 B
build/styles/block-library/classic-rtl.min.css 358 B
build/styles/block-library/classic.css 402 B
build/styles/block-library/classic.min.css 358 B
build/styles/block-library/code/editor-rtl.css 59 B
build/styles/block-library/code/editor-rtl.min.css 53 B
build/styles/block-library/code/editor.css 59 B
build/styles/block-library/code/editor.min.css 53 B
build/styles/block-library/code/style-rtl.css 158 B
build/styles/block-library/code/style-rtl.min.css 140 B
build/styles/block-library/code/style.css 178 B
build/styles/block-library/code/style.min.css 140 B
build/styles/block-library/code/theme-rtl.css 135 B
build/styles/block-library/code/theme-rtl.min.css 122 B
build/styles/block-library/code/theme.css 135 B
build/styles/block-library/code/theme.min.css 122 B
build/styles/block-library/columns/editor-rtl.css 119 B
build/styles/block-library/columns/editor-rtl.min.css 108 B
build/styles/block-library/columns/editor.css 119 B
build/styles/block-library/columns/editor.min.css 108 B
build/styles/block-library/columns/style-rtl.css 1.3 kB
build/styles/block-library/columns/style-rtl.min.css 421 B
build/styles/block-library/columns/style.css 1.3 kB
build/styles/block-library/columns/style.min.css 421 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 136 B
build/styles/block-library/comment-author-avatar/editor-rtl.min.css 124 B
build/styles/block-library/comment-author-avatar/editor.css 136 B
build/styles/block-library/comment-author-avatar/editor.min.css 124 B
build/styles/block-library/comment-author-name/style-rtl.css 79 B
build/styles/block-library/comment-author-name/style-rtl.min.css 72 B
build/styles/block-library/comment-author-name/style.css 79 B
build/styles/block-library/comment-author-name/style.min.css 72 B
build/styles/block-library/comment-content/style-rtl.css 137 B
build/styles/block-library/comment-content/style-rtl.min.css 120 B
build/styles/block-library/comment-content/style.css 137 B
build/styles/block-library/comment-content/style.min.css 120 B
build/styles/block-library/comment-date/style-rtl.css 72 B
build/styles/block-library/comment-date/style-rtl.min.css 65 B
build/styles/block-library/comment-date/style.css 72 B
build/styles/block-library/comment-date/style.min.css 65 B
build/styles/block-library/comment-edit-link/style-rtl.css 77 B
build/styles/block-library/comment-edit-link/style-rtl.min.css 70 B
build/styles/block-library/comment-edit-link/style.css 77 B
build/styles/block-library/comment-edit-link/style.min.css 70 B
build/styles/block-library/comment-reply-link/style-rtl.css 78 B
build/styles/block-library/comment-reply-link/style-rtl.min.css 71 B
build/styles/block-library/comment-reply-link/style.css 78 B
build/styles/block-library/comment-reply-link/style.min.css 71 B
build/styles/block-library/comment-template/style-rtl.css 213 B
build/styles/block-library/comment-template/style-rtl.min.css 191 B
build/styles/block-library/comment-template/style.css 213 B
build/styles/block-library/comment-template/style.min.css 191 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 135 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.min.css 122 B
build/styles/block-library/comments-pagination-numbers/editor.css 144 B
build/styles/block-library/comments-pagination-numbers/editor.min.css 121 B
build/styles/block-library/comments-pagination/editor-rtl.css 184 B
build/styles/block-library/comments-pagination/editor-rtl.min.css 168 B
build/styles/block-library/comments-pagination/editor.css 184 B
build/styles/block-library/comments-pagination/editor.min.css 168 B
build/styles/block-library/comments-pagination/style-rtl.css 224 B
build/styles/block-library/comments-pagination/style-rtl.min.css 201 B
build/styles/block-library/comments-pagination/style.css 236 B
build/styles/block-library/comments-pagination/style.min.css 201 B
build/styles/block-library/comments-title/editor-rtl.css 83 B
build/styles/block-library/comments-title/editor-rtl.min.css 75 B
build/styles/block-library/comments-title/editor.css 83 B
build/styles/block-library/comments-title/editor.min.css 75 B
build/styles/block-library/comments/editor-rtl.css 968 B
build/styles/block-library/comments/editor-rtl.min.css 842 B
build/styles/block-library/comments/editor.css 968 B
build/styles/block-library/comments/editor.min.css 842 B
build/styles/block-library/comments/style-rtl.css 754 B
build/styles/block-library/comments/style-rtl.min.css 637 B
build/styles/block-library/comments/style.css 752 B
build/styles/block-library/comments/style.min.css 637 B
build/styles/block-library/common-rtl.css 2.48 kB
build/styles/block-library/common-rtl.min.css 1.12 kB
build/styles/block-library/common.css 2.5 kB
build/styles/block-library/common.min.css 1.12 kB
build/styles/block-library/cover/editor-rtl.css 1.05 kB
build/styles/block-library/cover/editor-rtl.min.css 631 B
build/styles/block-library/cover/editor.css 1.05 kB
build/styles/block-library/cover/editor.min.css 631 B
build/styles/block-library/cover/style-rtl.css 2.5 kB
build/styles/block-library/cover/style-rtl.min.css 1.82 kB
build/styles/block-library/cover/style.css 2.51 kB
build/styles/block-library/cover/style.min.css 1.81 kB
build/styles/block-library/details/editor-rtl.css 72 B
build/styles/block-library/details/editor-rtl.min.css 65 B
build/styles/block-library/details/editor.css 72 B
build/styles/block-library/details/editor.min.css 65 B
build/styles/block-library/details/style-rtl.css 97 B
build/styles/block-library/details/style-rtl.min.css 86 B
build/styles/block-library/details/style.css 97 B
build/styles/block-library/details/style.min.css 86 B
build/styles/block-library/editor-elements-rtl.css 117 B
build/styles/block-library/editor-elements-rtl.min.css 75 B
build/styles/block-library/editor-elements.css 117 B
build/styles/block-library/editor-elements.min.css 75 B
build/styles/block-library/editor-rtl.css 12.5 kB
build/styles/block-library/editor-rtl.min.css 10.3 kB
build/styles/block-library/editor.css 12.5 kB
build/styles/block-library/editor.min.css 10.3 kB
build/styles/block-library/elements-rtl.css 84 B
build/styles/block-library/elements-rtl.min.css 54 B
build/styles/block-library/elements.css 84 B
build/styles/block-library/elements.min.css 54 B
build/styles/block-library/embed/editor-rtl.css 391 B
build/styles/block-library/embed/editor-rtl.min.css 331 B
build/styles/block-library/embed/editor.css 390 B
build/styles/block-library/embed/editor.min.css 331 B
build/styles/block-library/embed/style-rtl.css 1.29 kB
build/styles/block-library/embed/style-rtl.min.css 448 B
build/styles/block-library/embed/style.css 1.29 kB
build/styles/block-library/embed/style.min.css 448 B
build/styles/block-library/embed/theme-rtl.css 967 B
build/styles/block-library/embed/theme-rtl.min.css 133 B
build/styles/block-library/embed/theme.css 967 B
build/styles/block-library/embed/theme.min.css 133 B
build/styles/block-library/file/editor-rtl.css 352 B
build/styles/block-library/file/editor-rtl.min.css 324 B
build/styles/block-library/file/editor.css 353 B
build/styles/block-library/file/editor.min.css 324 B
build/styles/block-library/file/style-rtl.css 318 B
build/styles/block-library/file/style-rtl.min.css 278 B
build/styles/block-library/file/style.css 331 B
build/styles/block-library/file/style.min.css 278 B
build/styles/block-library/footnotes/style-rtl.css 220 B
build/styles/block-library/footnotes/style-rtl.min.css 198 B
build/styles/block-library/footnotes/style.css 219 B
build/styles/block-library/footnotes/style.min.css 197 B
build/styles/block-library/form-input/editor-rtl.css 286 B
build/styles/block-library/form-input/editor-rtl.min.css 265 B
build/styles/block-library/form-input/editor.css 285 B
build/styles/block-library/form-input/editor.min.css 264 B
build/styles/block-library/form-input/style-rtl.css 467 B
build/styles/block-library/form-input/style-rtl.min.css 366 B
build/styles/block-library/form-input/style.css 467 B
build/styles/block-library/form-input/style.min.css 366 B
build/styles/block-library/form-submission-notification/editor-rtl.css 368 B
build/styles/block-library/form-submission-notification/editor-rtl.min.css 344 B
build/styles/block-library/form-submission-notification/editor.css 368 B
build/styles/block-library/form-submission-notification/editor.min.css 341 B
build/styles/block-library/form-submit-button/style-rtl.css 77 B
build/styles/block-library/form-submit-button/style-rtl.min.css 69 B
build/styles/block-library/form-submit-button/style.css 77 B
build/styles/block-library/form-submit-button/style.min.css 69 B
build/styles/block-library/freeform/editor-rtl.css 1.12 kB
build/styles/block-library/freeform/editor-rtl.min.css 288 B
build/styles/block-library/freeform/editor.css 1.12 kB
build/styles/block-library/freeform/editor.min.css 288 B
build/styles/block-library/gallery/editor-rtl.css 1.52 kB
build/styles/block-library/gallery/editor-rtl.min.css 615 B
build/styles/block-library/gallery/editor.css 1.52 kB
build/styles/block-library/gallery/editor.min.css 616 B
build/styles/block-library/gallery/style-rtl.css 2.84 kB
build/styles/block-library/gallery/style-rtl.min.css 1.84 kB
build/styles/block-library/gallery/style.css 2.84 kB
build/styles/block-library/gallery/style.min.css 1.84 kB
build/styles/block-library/gallery/theme-rtl.css 941 B
build/styles/block-library/gallery/theme-rtl.min.css 108 B
build/styles/block-library/gallery/theme.css 941 B
build/styles/block-library/gallery/theme.min.css 108 B
build/styles/block-library/group/editor-rtl.css 772 B
build/styles/block-library/group/editor-rtl.min.css 335 B
build/styles/block-library/group/editor.css 772 B
build/styles/block-library/group/editor.min.css 335 B
build/styles/block-library/group/style-rtl.css 120 B
build/styles/block-library/group/style-rtl.min.css 103 B
build/styles/block-library/group/style.css 120 B
build/styles/block-library/group/style.min.css 103 B
build/styles/block-library/group/theme-rtl.css 468 B
build/styles/block-library/group/theme-rtl.min.css 79 B
build/styles/block-library/group/theme.css 468 B
build/styles/block-library/group/theme.min.css 79 B
build/styles/block-library/heading/style-rtl.css 604 B
build/styles/block-library/heading/style-rtl.min.css 205 B
build/styles/block-library/heading/style.css 604 B
build/styles/block-library/heading/style.min.css 205 B
build/styles/block-library/html/editor-rtl.css 1.29 kB
build/styles/block-library/html/editor-rtl.min.css 464 B
build/styles/block-library/html/editor.css 1.3 kB
build/styles/block-library/html/editor.min.css 464 B
build/styles/block-library/icon/editor-rtl.css 776 B
build/styles/block-library/icon/editor-rtl.min.css 377 B
build/styles/block-library/icon/editor.css 776 B
build/styles/block-library/icon/editor.min.css 377 B
build/styles/block-library/icon/style-rtl.css 218 B
build/styles/block-library/icon/style-rtl.min.css 154 B
build/styles/block-library/icon/style.css 218 B
build/styles/block-library/icon/style.min.css 154 B
build/styles/block-library/image/editor-rtl.css 1.64 kB
build/styles/block-library/image/editor-rtl.min.css 782 B
build/styles/block-library/image/editor.css 1.64 kB
build/styles/block-library/image/editor.min.css 780 B
build/styles/block-library/image/style-rtl.css 2.92 kB
build/styles/block-library/image/style-rtl.min.css 1.86 kB
build/styles/block-library/image/style.css 2.92 kB
build/styles/block-library/image/style.min.css 1.85 kB
build/styles/block-library/image/theme-rtl.css 971 B
build/styles/block-library/image/theme-rtl.min.css 137 B
build/styles/block-library/image/theme.css 971 B
build/styles/block-library/image/theme.min.css 137 B
build/styles/block-library/latest-comments/style-rtl.css 392 B
build/styles/block-library/latest-comments/style-rtl.min.css 352 B
build/styles/block-library/latest-comments/style.css 390 B
build/styles/block-library/latest-comments/style.min.css 352 B
build/styles/block-library/latest-posts/editor-rtl.css 154 B
build/styles/block-library/latest-posts/editor-rtl.min.css 139 B
build/styles/block-library/latest-posts/editor.css 153 B
build/styles/block-library/latest-posts/editor.min.css 138 B
build/styles/block-library/latest-posts/style-rtl.css 1.36 kB
build/styles/block-library/latest-posts/style-rtl.min.css 520 B
build/styles/block-library/latest-posts/style.css 1.37 kB
build/styles/block-library/latest-posts/style.min.css 520 B
build/styles/block-library/list/style-rtl.css 498 B
build/styles/block-library/list/style-rtl.min.css 107 B
build/styles/block-library/list/style.css 498 B
build/styles/block-library/list/style.min.css 107 B
build/styles/block-library/loginout/style-rtl.css 68 B
build/styles/block-library/loginout/style-rtl.min.css 61 B
build/styles/block-library/loginout/style.css 68 B
build/styles/block-library/loginout/style.min.css 61 B
build/styles/block-library/math/editor-rtl.css 491 B
build/styles/block-library/math/editor-rtl.min.css 105 B
build/styles/block-library/math/editor.css 502 B
build/styles/block-library/math/editor.min.css 105 B
build/styles/block-library/math/style-rtl.css 70 B
build/styles/block-library/math/style-rtl.min.css 61 B
build/styles/block-library/math/style.css 70 B
build/styles/block-library/math/style.min.css 61 B
build/styles/block-library/media-text/editor-rtl.css 389 B
build/styles/block-library/media-text/editor-rtl.min.css 321 B
build/styles/block-library/media-text/editor.css 389 B
build/styles/block-library/media-text/editor.min.css 320 B
build/styles/block-library/media-text/style-rtl.css 873 B
build/styles/block-library/media-text/style-rtl.min.css 552 B
build/styles/block-library/media-text/style.css 901 B
build/styles/block-library/media-text/style.min.css 550 B
build/styles/block-library/more/editor-rtl.css 796 B
build/styles/block-library/more/editor-rtl.min.css 393 B
build/styles/block-library/more/editor.css 798 B
build/styles/block-library/more/editor.min.css 393 B
build/styles/block-library/navigation-link/editor-rtl.css 1.28 kB
build/styles/block-library/navigation-link/editor-rtl.min.css 710 B
build/styles/block-library/navigation-link/editor.css 1.27 kB
build/styles/block-library/navigation-link/editor.min.css 713 B
build/styles/block-library/navigation-link/style-rtl.css 579 B
build/styles/block-library/navigation-link/style-rtl.min.css 190 B
build/styles/block-library/navigation-link/style.css 579 B
build/styles/block-library/navigation-link/style.min.css 188 B
build/styles/block-library/navigation-overlay-close/style-rtl.css 260 B
build/styles/block-library/navigation-overlay-close/style-rtl.min.css 237 B
build/styles/block-library/navigation-overlay-close/style.css 260 B
build/styles/block-library/navigation-overlay-close/style.min.css 237 B
build/styles/block-library/navigation-submenu/editor-rtl.css 1.12 kB
build/styles/block-library/navigation-submenu/editor-rtl.min.css 295 B
build/styles/block-library/navigation-submenu/editor.css 1.12 kB
build/styles/block-library/navigation-submenu/editor.min.css 294 B
build/styles/block-library/navigation/editor-rtl.css 3.28 kB
build/styles/block-library/navigation/editor-rtl.min.css 2.28 kB
build/styles/block-library/navigation/editor.css 3.29 kB
build/styles/block-library/navigation/editor.min.css 2.28 kB
build/styles/block-library/navigation/style-rtl.css 3.59 kB
build/styles/block-library/navigation/style-rtl.min.css 2.52 kB
build/styles/block-library/navigation/style.css 3.59 kB
build/styles/block-library/navigation/style.min.css 2.5 kB
build/styles/block-library/nextpage/editor-rtl.css 799 B
build/styles/block-library/nextpage/editor-rtl.min.css 392 B
build/styles/block-library/nextpage/editor.css 800 B
build/styles/block-library/nextpage/editor.min.css 392 B
build/styles/block-library/page-list/editor-rtl.css 1.18 kB
build/styles/block-library/page-list/editor-rtl.min.css 356 B
build/styles/block-library/page-list/editor.css 1.18 kB
build/styles/block-library/page-list/editor.min.css 356 B
build/styles/block-library/page-list/style-rtl.css 207 B
build/styles/block-library/page-list/style-rtl.min.css 192 B
build/styles/block-library/page-list/style.css 207 B
build/styles/block-library/page-list/style.min.css 192 B
build/styles/block-library/paragraph/editor-rtl.css 315 B
build/styles/block-library/paragraph/editor-rtl.min.css 292 B
build/styles/block-library/paragraph/editor.css 314 B
build/styles/block-library/paragraph/editor.min.css 292 B
build/styles/block-library/paragraph/style-rtl.css 746 B
build/styles/block-library/paragraph/style-rtl.min.css 341 B
build/styles/block-library/paragraph/style.css 752 B
build/styles/block-library/paragraph/style.min.css 340 B
build/styles/block-library/playlist-track/style-rtl.css 453 B
build/styles/block-library/playlist-track/style-rtl.min.css 420 B
build/styles/block-library/playlist-track/style.css 453 B
build/styles/block-library/playlist-track/style.min.css 420 B
build/styles/block-library/playlist/editor-rtl.css 120 B
build/styles/block-library/playlist/editor-rtl.min.css 112 B
build/styles/block-library/playlist/editor.css 120 B
build/styles/block-library/playlist/editor.min.css 112 B
build/styles/block-library/playlist/style-rtl.css 1.52 kB
build/styles/block-library/playlist/style-rtl.min.css 1.42 kB
build/styles/block-library/playlist/style.css 1.52 kB
build/styles/block-library/playlist/style.min.css 1.42 kB
build/styles/block-library/post-author-biography/style-rtl.css 96 B
build/styles/block-library/post-author-biography/style-rtl.min.css 86 B
build/styles/block-library/post-author-biography/style.css 96 B
build/styles/block-library/post-author-biography/style.min.css 86 B
build/styles/block-library/post-author-name/style-rtl.css 76 B
build/styles/block-library/post-author-name/style-rtl.min.css 69 B
build/styles/block-library/post-author-name/style.css 76 B
build/styles/block-library/post-author-name/style.min.css 69 B
build/styles/block-library/post-author/editor-rtl.css 490 B
build/styles/block-library/post-author/editor-rtl.min.css 104 B
build/styles/block-library/post-author/editor.css 490 B
build/styles/block-library/post-author/editor.min.css 104 B
build/styles/block-library/post-author/style-rtl.css 213 B
build/styles/block-library/post-author/style-rtl.min.css 188 B
build/styles/block-library/post-author/style.css 214 B
build/styles/block-library/post-author/style.min.css 189 B
build/styles/block-library/post-comments-count/style-rtl.css 79 B
build/styles/block-library/post-comments-count/style-rtl.min.css 72 B
build/styles/block-library/post-comments-count/style.css 79 B
build/styles/block-library/post-comments-count/style.min.css 72 B
build/styles/block-library/post-comments-form/editor-rtl.css 104 B
build/styles/block-library/post-comments-form/editor-rtl.min.css 96 B
build/styles/block-library/post-comments-form/editor.css 104 B
build/styles/block-library/post-comments-form/editor.min.css 96 B
build/styles/block-library/post-comments-form/style-rtl.css 585 B
build/styles/block-library/post-comments-form/style-rtl.min.css 525 B
build/styles/block-library/post-comments-form/style.css 584 B
build/styles/block-library/post-comments-form/style.min.css 525 B
build/styles/block-library/post-comments-link/style-rtl.css 78 B
build/styles/block-library/post-comments-link/style-rtl.min.css 71 B
build/styles/block-library/post-comments-link/style.css 78 B
build/styles/block-library/post-comments-link/style.min.css 71 B
build/styles/block-library/post-content/style-rtl.css 68 B
build/styles/block-library/post-content/style-rtl.min.css 61 B
build/styles/block-library/post-content/style.css 68 B
build/styles/block-library/post-content/style.min.css 61 B
build/styles/block-library/post-date/style-rtl.css 69 B
build/styles/block-library/post-date/style-rtl.min.css 62 B
build/styles/block-library/post-date/style.css 69 B
build/styles/block-library/post-date/style.min.css 62 B
build/styles/block-library/post-excerpt/editor-rtl.css 78 B
build/styles/block-library/post-excerpt/editor-rtl.min.css 71 B
build/styles/block-library/post-excerpt/editor.css 78 B
build/styles/block-library/post-excerpt/editor.min.css 71 B
build/styles/block-library/post-excerpt/style-rtl.css 171 B
build/styles/block-library/post-excerpt/style-rtl.min.css 155 B
build/styles/block-library/post-excerpt/style.css 171 B
build/styles/block-library/post-excerpt/style.min.css 155 B
build/styles/block-library/post-featured-image/editor-rtl.css 1.14 kB
build/styles/block-library/post-featured-image/editor-rtl.min.css 719 B
build/styles/block-library/post-featured-image/editor.css 1.14 kB
build/styles/block-library/post-featured-image/editor.min.css 717 B
build/styles/block-library/post-featured-image/style-rtl.css 392 B
build/styles/block-library/post-featured-image/style-rtl.min.css 347 B
build/styles/block-library/post-featured-image/style.css 392 B
build/styles/block-library/post-featured-image/style.min.css 347 B
build/styles/block-library/post-navigation-link/style-rtl.css 234 B
build/styles/block-library/post-navigation-link/style-rtl.min.css 215 B
build/styles/block-library/post-navigation-link/style.css 245 B
build/styles/block-library/post-navigation-link/style.min.css 214 B
build/styles/block-library/post-template/style-rtl.css 1.27 kB
build/styles/block-library/post-template/style-rtl.min.css 441 B
build/styles/block-library/post-template/style.css 1.27 kB
build/styles/block-library/post-template/style.min.css 441 B
build/styles/block-library/post-terms/style-rtl.css 108 B
build/styles/block-library/post-terms/style-rtl.min.css 96 B
build/styles/block-library/post-terms/style.css 108 B
build/styles/block-library/post-terms/style.min.css 96 B
build/styles/block-library/post-time-to-read/style-rtl.css 77 B
build/styles/block-library/post-time-to-read/style-rtl.min.css 70 B
build/styles/block-library/post-time-to-read/style.css 77 B
build/styles/block-library/post-time-to-read/style.min.css 70 B
build/styles/block-library/post-title/style-rtl.css 175 B
build/styles/block-library/post-title/style-rtl.min.css 162 B
build/styles/block-library/post-title/style.css 175 B
build/styles/block-library/post-title/style.min.css 162 B
build/styles/block-library/preformatted/style-rtl.css 511 B
build/styles/block-library/preformatted/style-rtl.min.css 125 B
build/styles/block-library/preformatted/style.css 511 B
build/styles/block-library/preformatted/style.min.css 125 B
build/styles/block-library/pullquote/editor-rtl.css 146 B
build/styles/block-library/pullquote/editor-rtl.min.css 133 B
build/styles/block-library/pullquote/editor.css 146 B
build/styles/block-library/pullquote/editor.min.css 133 B
build/styles/block-library/pullquote/style-rtl.css 765 B
build/styles/block-library/pullquote/style-rtl.min.css 365 B
build/styles/block-library/pullquote/style.css 764 B
build/styles/block-library/pullquote/style.min.css 365 B
build/styles/block-library/pullquote/theme-rtl.css 195 B
build/styles/block-library/pullquote/theme-rtl.min.css 176 B
build/styles/block-library/pullquote/theme.css 195 B
build/styles/block-library/pullquote/theme.min.css 176 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 134 B
build/styles/block-library/query-pagination-numbers/editor-rtl.min.css 121 B
build/styles/block-library/query-pagination-numbers/editor.css 144 B
build/styles/block-library/query-pagination-numbers/editor.min.css 118 B
build/styles/block-library/query-pagination/editor-rtl.css 168 B
build/styles/block-library/query-pagination/editor-rtl.min.css 154 B
build/styles/block-library/query-pagination/editor.css 168 B
build/styles/block-library/query-pagination/editor.min.css 154 B
build/styles/block-library/query-pagination/style-rtl.css 254 B
build/styles/block-library/query-pagination/style-rtl.min.css 237 B
build/styles/block-library/query-pagination/style.css 265 B
build/styles/block-library/query-pagination/style.min.css 237 B
build/styles/block-library/query-title/style-rtl.css 71 B
build/styles/block-library/query-title/style-rtl.min.css 64 B
build/styles/block-library/query-title/style.css 71 B
build/styles/block-library/query-title/style.min.css 64 B
build/styles/block-library/query-total/style-rtl.css 71 B
build/styles/block-library/query-total/style-rtl.min.css 64 B
build/styles/block-library/query-total/style.css 71 B
build/styles/block-library/query-total/style.min.css 64 B
build/styles/block-library/query/editor-rtl.css 1.28 kB
build/styles/block-library/query/editor-rtl.min.css 438 B
build/styles/block-library/query/editor.css 1.28 kB
build/styles/block-library/query/editor.min.css 438 B
build/styles/block-library/quote/style-rtl.css 255 B
build/styles/block-library/quote/style-rtl.min.css 238 B
build/styles/block-library/quote/style.css 256 B
build/styles/block-library/quote/style.min.css 238 B
build/styles/block-library/quote/theme-rtl.css 253 B
build/styles/block-library/quote/theme-rtl.min.css 233 B
build/styles/block-library/quote/theme.css 254 B
build/styles/block-library/quote/theme.min.css 236 B
build/styles/block-library/read-more/style-rtl.css 146 B
build/styles/block-library/read-more/style-rtl.min.css 131 B
build/styles/block-library/read-more/style.css 146 B
build/styles/block-library/read-more/style.min.css 131 B
build/styles/block-library/reset-rtl.css 936 B
build/styles/block-library/reset-rtl.min.css 467 B
build/styles/block-library/reset.css 936 B
build/styles/block-library/reset.min.css 467 B
build/styles/block-library/rss/editor-rtl.css 144 B
build/styles/block-library/rss/editor-rtl.min.css 126 B
build/styles/block-library/rss/editor.css 144 B
build/styles/block-library/rss/editor.min.css 126 B
build/styles/block-library/rss/style-rtl.css 1.11 kB
build/styles/block-library/rss/style-rtl.min.css 284 B
build/styles/block-library/rss/style.css 1.12 kB
build/styles/block-library/rss/style.min.css 283 B
build/styles/block-library/search/editor-rtl.css 217 B
build/styles/block-library/search/editor-rtl.min.css 199 B
build/styles/block-library/search/editor.css 217 B
build/styles/block-library/search/editor.min.css 199 B
build/styles/block-library/search/style-rtl.css 1.1 kB
build/styles/block-library/search/style-rtl.min.css 665 B
build/styles/block-library/search/style.css 1.1 kB
build/styles/block-library/search/style.min.css 666 B
build/styles/block-library/search/theme-rtl.css 130 B
build/styles/block-library/search/theme-rtl.min.css 113 B
build/styles/block-library/search/theme.css 130 B
build/styles/block-library/search/theme.min.css 113 B
build/styles/block-library/separator/editor-rtl.css 106 B
build/styles/block-library/separator/editor-rtl.min.css 100 B
build/styles/block-library/separator/editor.css 106 B
build/styles/block-library/separator/editor.min.css 100 B
build/styles/block-library/separator/style-rtl.css 284 B
build/styles/block-library/separator/style-rtl.min.css 248 B
build/styles/block-library/separator/style.css 297 B
build/styles/block-library/separator/style.min.css 248 B
build/styles/block-library/separator/theme-rtl.css 226 B
build/styles/block-library/separator/theme-rtl.min.css 195 B
build/styles/block-library/separator/theme.css 226 B
build/styles/block-library/separator/theme.min.css 195 B
build/styles/block-library/shortcode/editor-rtl.css 1.1 kB
build/styles/block-library/shortcode/editor-rtl.min.css 286 B
build/styles/block-library/shortcode/editor.css 1.1 kB
build/styles/block-library/shortcode/editor.min.css 286 B
build/styles/block-library/site-logo/editor-rtl.css 1.12 kB
build/styles/block-library/site-logo/editor-rtl.min.css 696 B
build/styles/block-library/site-logo/editor.css 1.12 kB
build/styles/block-library/site-logo/editor.min.css 692 B
build/styles/block-library/site-logo/style-rtl.css 239 B
build/styles/block-library/site-logo/style-rtl.min.css 218 B
build/styles/block-library/site-logo/style.css 238 B
build/styles/block-library/site-logo/style.min.css 218 B
build/styles/block-library/site-tagline/editor-rtl.css 94 B
build/styles/block-library/site-tagline/editor-rtl.min.css 87 B
build/styles/block-library/site-tagline/editor.css 94 B
build/styles/block-library/site-tagline/editor.min.css 87 B
build/styles/block-library/site-tagline/style-rtl.css 72 B
build/styles/block-library/site-tagline/style-rtl.min.css 65 B
build/styles/block-library/site-tagline/style.css 72 B
build/styles/block-library/site-tagline/style.min.css 65 B
build/styles/block-library/site-title/editor-rtl.css 93 B
build/styles/block-library/site-title/editor-rtl.min.css 85 B
build/styles/block-library/site-title/editor.css 93 B
build/styles/block-library/site-title/editor.min.css 85 B
build/styles/block-library/site-title/style-rtl.css 153 B
build/styles/block-library/site-title/style-rtl.min.css 143 B
build/styles/block-library/site-title/style.css 153 B
build/styles/block-library/site-title/style.min.css 143 B
build/styles/block-library/social-link/editor-rtl.css 346 B
build/styles/block-library/social-link/editor-rtl.min.css 314 B
build/styles/block-library/social-link/editor.css 348 B
build/styles/block-library/social-link/editor.min.css 314 B
build/styles/block-library/social-links/editor-rtl.css 737 B
build/styles/block-library/social-links/editor-rtl.min.css 339 B
build/styles/block-library/social-links/editor.css 738 B
build/styles/block-library/social-links/editor.min.css 338 B
build/styles/block-library/social-links/style-rtl.css 1.57 kB
build/styles/block-library/social-links/style-rtl.min.css 1.51 kB
build/styles/block-library/social-links/style.css 1.57 kB
build/styles/block-library/social-links/style.min.css 1.51 kB
build/styles/block-library/spacer/editor-rtl.css 774 B
build/styles/block-library/spacer/editor-rtl.min.css 346 B
build/styles/block-library/spacer/editor.css 774 B
build/styles/block-library/spacer/editor.min.css 346 B
build/styles/block-library/spacer/style-rtl.css 55 B
build/styles/block-library/spacer/style-rtl.min.css 48 B
build/styles/block-library/spacer/style.css 55 B
build/styles/block-library/spacer/style.min.css 48 B
build/styles/block-library/style-rtl.css 21.5 kB
build/styles/block-library/style-rtl.min.css 18 kB
build/styles/block-library/style.css 21.6 kB
build/styles/block-library/style.min.css 18 kB
build/styles/block-library/tab-list/editor-rtl.css 107 B
build/styles/block-library/tab-list/editor-rtl.min.css 97 B
build/styles/block-library/tab-list/editor.css 107 B
build/styles/block-library/tab-list/editor.min.css 97 B
build/styles/block-library/tab-panel/style-rtl.css 238 B
build/styles/block-library/tab-panel/style-rtl.min.css 215 B
build/styles/block-library/tab-panel/style.css 238 B
build/styles/block-library/tab-panel/style.min.css 215 B
build/styles/block-library/tab-panels/style-rtl.css 76 B
build/styles/block-library/tab-panels/style-rtl.min.css 65 B
build/styles/block-library/tab-panels/style.css 76 B
build/styles/block-library/tab-panels/style.min.css 65 B
build/styles/block-library/tab/editor-rtl.css 160 B
build/styles/block-library/tab/editor-rtl.min.css 148 B
build/styles/block-library/tab/editor.css 160 B
build/styles/block-library/tab/editor.min.css 148 B
build/styles/block-library/tab/style-rtl.css 397 B
build/styles/block-library/tab/style-rtl.min.css 352 B
build/styles/block-library/tab/style.css 398 B
build/styles/block-library/tab/style.min.css 356 B
build/styles/block-library/table-of-contents/style-rtl.css 89 B
build/styles/block-library/table-of-contents/style-rtl.min.css 83 B
build/styles/block-library/table-of-contents/style.css 89 B
build/styles/block-library/table-of-contents/style.min.css 83 B
build/styles/block-library/table/editor-rtl.css 1.25 kB
build/styles/block-library/table/editor-rtl.min.css 394 B
build/styles/block-library/table/editor.css 1.25 kB
build/styles/block-library/table/editor.min.css 394 B
build/styles/block-library/table/style-rtl.css 1.06 kB
build/styles/block-library/table/style-rtl.min.css 641 B
build/styles/block-library/table/style.css 1.06 kB
build/styles/block-library/table/style.min.css 640 B
build/styles/block-library/table/theme-rtl.css 985 B
build/styles/block-library/table/theme-rtl.min.css 152 B
build/styles/block-library/table/theme.css 985 B
build/styles/block-library/table/theme.min.css 152 B
build/styles/block-library/tabs/style-rtl.css 64 B
build/styles/block-library/tabs/style-rtl.min.css 57 B
build/styles/block-library/tabs/style.css 64 B
build/styles/block-library/tabs/style.min.css 57 B
build/styles/block-library/tag-cloud/style-rtl.css 283 B
build/styles/block-library/tag-cloud/style-rtl.min.css 248 B
build/styles/block-library/tag-cloud/style.css 283 B
build/styles/block-library/tag-cloud/style.min.css 248 B
build/styles/block-library/template-part/editor-rtl.css 1.2 kB
build/styles/block-library/template-part/editor-rtl.min.css 368 B
build/styles/block-library/template-part/editor.css 1.2 kB
build/styles/block-library/template-part/editor.min.css 368 B
build/styles/block-library/template-part/theme-rtl.css 492 B
build/styles/block-library/template-part/theme-rtl.min.css 113 B
build/styles/block-library/template-part/theme.css 492 B
build/styles/block-library/template-part/theme.min.css 113 B
build/styles/block-library/term-count/style-rtl.css 70 B
build/styles/block-library/term-count/style-rtl.min.css 63 B
build/styles/block-library/term-count/style.css 70 B
build/styles/block-library/term-count/style.min.css 63 B
build/styles/block-library/term-description/style-rtl.css 138 B
build/styles/block-library/term-description/style-rtl.min.css 126 B
build/styles/block-library/term-description/style.css 138 B
build/styles/block-library/term-description/style.min.css 126 B
build/styles/block-library/term-name/style-rtl.css 69 B
build/styles/block-library/term-name/style-rtl.min.css 62 B
build/styles/block-library/term-name/style.css 69 B
build/styles/block-library/term-name/style.min.css 62 B
build/styles/block-library/term-template/editor-rtl.css 267 B
build/styles/block-library/term-template/editor-rtl.min.css 225 B
build/styles/block-library/term-template/editor.css 267 B
build/styles/block-library/term-template/editor.min.css 225 B
build/styles/block-library/term-template/style-rtl.css 124 B
build/styles/block-library/term-template/style-rtl.min.css 114 B
build/styles/block-library/term-template/style.css 124 B
build/styles/block-library/term-template/style.min.css 114 B
build/styles/block-library/text-columns/editor-rtl.css 481 B
build/styles/block-library/text-columns/editor-rtl.min.css 95 B
build/styles/block-library/text-columns/editor.css 481 B
build/styles/block-library/text-columns/editor.min.css 95 B
build/styles/block-library/text-columns/style-rtl.css 177 B
build/styles/block-library/text-columns/style-rtl.min.css 165 B
build/styles/block-library/text-columns/style.css 177 B
build/styles/block-library/text-columns/style.min.css 165 B
build/styles/block-library/theme-rtl.css 1.59 kB
build/styles/block-library/theme-rtl.min.css 715 B
build/styles/block-library/theme.css 1.6 kB
build/styles/block-library/theme.min.css 719 B
build/styles/block-library/verse/style-rtl.css 155 B
build/styles/block-library/verse/style-rtl.min.css 137 B
build/styles/block-library/verse/style.css 155 B
build/styles/block-library/verse/style.min.css 137 B
build/styles/block-library/video/editor-rtl.css 839 B
build/styles/block-library/video/editor-rtl.min.css 428 B
build/styles/block-library/video/editor.css 840 B
build/styles/block-library/video/editor.min.css 428 B
build/styles/block-library/video/style-rtl.css 1.02 kB
build/styles/block-library/video/style-rtl.min.css 202 B
build/styles/block-library/video/style.css 1.02 kB
build/styles/block-library/video/style.min.css 202 B
build/styles/block-library/video/theme-rtl.css 967 B
build/styles/block-library/video/theme-rtl.min.css 134 B
build/styles/block-library/video/theme.css 967 B
build/styles/block-library/video/theme.min.css 134 B
build/styles/commands/style-rtl.css 2.07 kB
build/styles/commands/style-rtl.min.css 1.17 kB
build/styles/commands/style.css 2.06 kB
build/styles/commands/style.min.css 1.17 kB
build/styles/customize-widgets/style-rtl.css 2.35 kB
build/styles/customize-widgets/style-rtl.min.css 1.44 kB
build/styles/customize-widgets/style.css 2.35 kB
build/styles/customize-widgets/style.min.css 1.44 kB
build/styles/edit-post/classic-rtl.css 1.29 kB
build/styles/edit-post/classic-rtl.min.css 425 B
build/styles/edit-post/classic.css 1.31 kB
build/styles/edit-post/classic.min.css 428 B
build/styles/edit-post/style-rtl.css 3.51 kB
build/styles/edit-post/style-rtl.min.css 2.21 kB
build/styles/edit-post/style.css 3.51 kB
build/styles/edit-post/style.min.css 2.21 kB
build/styles/edit-site/style-rtl.css 20.3 kB
build/styles/edit-site/style-rtl.min.css 16.5 kB
build/styles/edit-site/style.css 20.3 kB
build/styles/edit-site/style.min.css 16.5 kB
build/styles/edit-widgets/style-rtl.css 4.85 kB
build/styles/edit-widgets/style-rtl.min.css 3.52 kB
build/styles/edit-widgets/style.css 4.85 kB
build/styles/edit-widgets/style.min.css 3.52 kB
build/styles/editor/style-rtl.css 28.4 kB
build/styles/editor/style-rtl.min.css 24 kB
build/styles/editor/style.css 28.4 kB
build/styles/editor/style.min.css 24 kB
build/styles/format-library/style-rtl.css 735 B
build/styles/format-library/style-rtl.min.css 326 B
build/styles/format-library/style.css 746 B
build/styles/format-library/style.min.css 326 B
build/styles/list-reusable-blocks/style-rtl.css 1.07 kB
build/styles/list-reusable-blocks/style-rtl.min.css 250 B
build/styles/list-reusable-blocks/style.css 1.07 kB
build/styles/list-reusable-blocks/style.min.css 249 B
build/styles/media-utils/style-rtl.css 2.08 kB
build/styles/media-utils/style-rtl.min.css 1.17 kB
build/styles/media-utils/style.css 2.08 kB
build/styles/media-utils/style.min.css 1.17 kB
build/styles/nux/style-rtl.css 1.48 kB
build/styles/nux/style-rtl.min.css 622 B
build/styles/nux/style.css 1.5 kB
build/styles/nux/style.min.css 618 B
build/styles/patterns/style-rtl.css 1.46 kB
build/styles/patterns/style-rtl.min.css 611 B
build/styles/patterns/style.css 1.46 kB
build/styles/patterns/style.min.css 611 B
build/styles/preferences/style-rtl.css 1.26 kB
build/styles/preferences/style-rtl.min.css 415 B
build/styles/preferences/style.css 1.26 kB
build/styles/preferences/style.min.css 415 B
build/styles/reusable-blocks/style-rtl.css 1.11 kB
build/styles/reusable-blocks/style-rtl.min.css 275 B
build/styles/reusable-blocks/style.css 1.11 kB
build/styles/reusable-blocks/style.min.css 275 B
build/styles/widgets/style-rtl.css 2.05 kB
build/styles/widgets/style-rtl.min.css 1.16 kB
build/styles/widgets/style.css 2.06 kB
build/styles/widgets/style.min.css 1.16 kB

compressed-size-action

@jameskoster jameskoster added the [Type] Enhancement A suggestion for improvement. label Mar 4, 2026
Copy link
Copy Markdown
Member

@mirka mirka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's some context on why I'm hesitant to add motion tokens in this manner.

  1. If motion is not going to be themed dynamically through ThemeProvider, it isn't necessary to manage as a official design token. (Which is good for avoiding token bloat in the stylesheet. But @aduth has suggested that we can manage tokens in the theme package as a central "data store", while still omitting them from the tokens stylesheet, so that could be a mitigation option.)
  2. Most motion is already encapsulated at relatively higher levels (e.g. Tooltip/Dialog components, dropdown motion module, focus module). Which is both sufficient and easier for motion sharing across similar components.
  3. At the moment, there are Framer Motion usages that can't use values from CSS variables (not a blocker per se, but needs some planning on what to do).

So motion is one of those categories where I think we need to weight the cost–benefit. Maybe my intuition of the cost is overblown, and benefit underestimated.

These are just my hesitations — open to everyone's thoughts!

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 4, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @nick-a8c.

Contributors, please read how to link your accounts to ensure your work is properly credited in WordPress releases.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Unlinked contributors: nick-a8c.

Co-authored-by: jameskoster <jameskoster@git.wordpress.org>
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
Co-authored-by: aduth <aduth@git.wordpress.org>
Co-authored-by: fcoveram <fcoveram@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@jameskoster
Copy link
Copy Markdown
Contributor Author

I defer to y'all on the implementation :) What's not clear to me is how we'd ensure consistent profiles (easing, duration) across components without tokens. Is that something we'd have to maintain manually?

If motion is not going to be themed dynamically

Could there be a world where it is theme-able? For instance would it make sense for prefers-reduced-motion be handled here?

@aduth
Copy link
Copy Markdown
Member

aduth commented Mar 4, 2026

If motion is not going to be themed dynamically through ThemeProvider, it isn't necessary to manage as a official design token.

I think this strikes at an interesting question about what values make sense to be a design token. This interpretation reads to me as being based on the ability to customize, though I've personally approached it more as encoding design decisions that apply uniformly across components, that we can update in one place and cascade (single source of truth), and that can be used in the design process (e.g. Figma variables) for better code/design parity. In particular, the way these are being proposed feel to me like they aren't tied to any one specific component but apply generally across the system. I'm not as sure about design tooling, but it feels like a value we'd want to expose and use in motion design.

Or maybe reframing: What is it about what's said about how we can manage motion through higher-level abstractions that is untrue about how we think about typography or color, for example?

@mirka
Copy link
Copy Markdown
Member

mirka commented Mar 4, 2026

encoding design decisions that apply uniformly across components

I guess a large part of my skepticism is about the validity of encoding the motion design decisions at the individual CSS property level.

  • Is there value in having all xs durations be exactly 50ms, or a certain easing sharing the exact same value across the entire system? Couldn't they just be tweaked just right at a higher level (e.g. all dropdown-like things share the same motion module)?
  • Are durations and easings truly independent factors? Changing one aspect of motion can greatly alter how all the other aspects feel. For example, is the duration/easing for a fade, or a slide? What is the slide distance? What is the average size of the element? In that sense, I feel like it would be very hard to anticipate the effects of changing a global duration/easing token, when consumers could be using them in so many different contexts.

@mirka
Copy link
Copy Markdown
Member

mirka commented Mar 4, 2026

Another fun thought that came to mind in support of higher-level encapsulation!

Let's say we had an "intensity" setting for motion, where high intensity is very fun and low intensity is more calm. Could this be achieved globally by changing token values at a CSS property level? I'd say no. Each motion module (tooltips, dialogs, etc) needs to tweak itself appropriately for each intensity level, which would probably be switched by entire declaration blocks via a data attribute.

@jameskoster
Copy link
Copy Markdown
Contributor Author

Let's say we had an "intensity" setting for motion, where high intensity is very fun and low intensity is more calm.

Doesn't it make sense to handle this via ThemeProvider though, like all other theming aspects?

With higher-level encapsulation could motion still be themeable if we introduced and utilised a wider range of motion primitives in the theme package, maybe with modes for different styles?

@ciampo
Copy link
Copy Markdown
Contributor

ciampo commented Mar 6, 2026

I see both sides of the argument. Personally, I like the idea that shared variables all come as DS tokens. If we keep the stylesheet around, we don't really have to include these tokens in ThemeProvider, unless they become dymanyc depenging on user preferences (eg the "intensity" setting that Lena flagged)

@mirka
Copy link
Copy Markdown
Member

mirka commented Mar 9, 2026

Doesn't it make sense to handle this via ThemeProvider though, like all other theming aspects?

It will be handled by ThemeProvider, but what I'm saying is that any meaningful motion variants will often need to be implemented like this:

// ThemeProvider div for the "high" motion preset
<div data-wpds-motion="high"></div>

// Dropdown motion module
.popup[data-wpds-motion="low"] {
	transition-property: opacity;
	transition-duration: 100ms;
	transition-timing-function: linear;
}
.popup[data-wpds-motion="high"] {
	transition-property: opacity, transform; /* added a transform to increase motion */
	transition-duration:
		100ms, /* opacity duration is actually the same! */
		300ms;
	transition-timing-function:
		linear,
		cubic-bezier(0, 0, 0, 1);
	transform: translateY(4px);
}

rather than:

// ThemeProvider div for the "high" motion preset
<div style="--wpds-motion-duration-sm: 200ms;"></div>

// Dropdown motion module
.popup {
	transition-property: opacity;
	transition-duration: var(--wpds-motion-duration-sm);
	transition-timing-function: linear;
}

So while tokens could be beneficial if it's important to "quantize" durations and easings across the ecosystem to a certain set of values, it's not a requirement for overall motion consistency or motion theming. Consistency and theming will need to be addressed at higher levels anyway.

@jameskoster
Copy link
Copy Markdown
Contributor Author

jameskoster commented Mar 10, 2026

Would it not be useful to have a set of tokens to utilise like so?

// ThemeProvider div for the "high" motion preset
<div data-wpds-motion="high"></div>

// Dropdown motion module
.popup[data-wpds-motion="low"] {
	transition-property: opacity;
	transition-duration: var(--wpds-motion-duration-sm);
	transition-timing-function: linear;
}
.popup[data-wpds-motion="high"] {
	transition-property: opacity, transform; /* added a transform to increase motion */
	transition-duration:
		var(--wpds-motion-duration-sm), /* opacity duration is actually the same! */
		var(--wpds-motion-duration-lg);
	transition-timing-function:
		linear,
		var(--wpds-motion-easing-decelerate);
	transform: translateY(4px);
}

This would give third parties building custom components a set of tokens to maintain coherent animation profiles with the system (and inherit any updates we make automatically).

Or is the point that tokens like --wpds-motion-easing-decelerate will be too inflexible, and these encapsulations will always need to be 'custom'?

Sorry if I'm missing something obvious.

@mirka
Copy link
Copy Markdown
Member

mirka commented Mar 10, 2026

This would give third parties building custom components a set of tokens to maintain coherent animation profiles with the system (and inherit any updates we make automatically).

Yes, if the point is to quantize values across the system, I'm not against that or anything. Let's try it out.

@jameskoster
Copy link
Copy Markdown
Contributor Author

I think the duration tokens are probably okay for a start, but how do you feel about the easing tokens? I'm wondering if there should be more of a scale, e.g. decelerate-sm, decelerate-md, decelerate-lg...

@mirka
Copy link
Copy Markdown
Member

mirka commented Mar 13, 2026

how do you feel about the easing tokens?

I have no idea actually. I think it's something that needs to be factored out of the actual animations that are going to be used? In other words, if we aren't sure yet, it could be fine to leave it out for now and add the tokens when we have a better idea of what is needed.

@jameskoster
Copy link
Copy Markdown
Contributor Author

Heh, I (softly) take the opposite position where the system provides some guardrails that inform what's possible rather than trying to extract tokens from patterns. I worry the latter could result in a lack of cohesion.

Because the tokens would be semantic, introducing something lightweight now shouldn’t lock us in. We could start consuming them in a few prominent examples (Modal/Dialog, Menu, etc.) – maybe even in this PR to test – then iterate (and expand the tokens) later as needed.

@mirka
Copy link
Copy Markdown
Member

mirka commented Mar 17, 2026

Sure, I'm fine with that too 👍

@jameskoster jameskoster requested a review from ajitbohra as a code owner March 17, 2026 16:57
@github-actions github-actions Bot added [Package] Components /packages/components [Package] UI /packages/ui labels Mar 17, 2026
@jameskoster
Copy link
Copy Markdown
Contributor Author

I updated components/modal, components/menu, components/dropdownmenu and ui/dialog to consume the tokens so we can test things out.

@jameskoster jameskoster force-pushed the add/theme-motion-tokens branch from d234848 to 93122b3 Compare March 17, 2026 17:02
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Mar 17, 2026

Flaky tests detected in 450e37f.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/25430476251
📝 Reported issues:

Comment thread packages/theme/src/stories/motion.story.tsx Outdated
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably makes sense to move this file to the root storybook folder so we can just use @wordpress/ui components and avoid a lot of custom CSS?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean just this file or the whole story?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I worked out what you meant, and updated accordingly. We'll need to consolidate our separate token folders at some point, but that doesn't need to happen here(?).

If I got it wrong let me know 😅

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah my wording was off. What you did is correct, thanks 😄

Comment on lines +37 to +48
const EASING_TOKENS = [
{
name: 'standard',
variable: 'var(--wpds-motion-easing-standard)',
description: 'State changes like hover, color, and toggle transitions.',
},
{
name: 'decelerate',
variable: 'var(--wpds-motion-easing-decelerate)',
description:
'Elements entering the screen, such as menus and popovers.',
},
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It isn't great that we need to define these manually when the data is all already available in the token store, but just not fully exposed in @wordpress/theme/design-tokens.js. Not a blocker, but I will see what we can do to make this easier.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coincidentally, this ☝️ can also help us with the token usage in all the JS files! We can expose the actual token data, not just the metadata. Win.

Copy link
Copy Markdown
Member

@mirka mirka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can do further clean up after #76604, but looks good enough to merge for now 👍

Comment thread packages/components/src/utils/dropdown-motion.ts Outdated
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah my wording was off. What you did is correct, thanks 😄

Comment on lines +37 to +48
const EASING_TOKENS = [
{
name: 'standard',
variable: 'var(--wpds-motion-easing-standard)',
description: 'State changes like hover, color, and toggle transitions.',
},
{
name: 'decelerate',
variable: 'var(--wpds-motion-easing-decelerate)',
description:
'Elements entering the screen, such as menus and popovers.',
},
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coincidentally, this ☝️ can also help us with the token usage in all the JS files! We can expose the actual token data, not just the metadata. Win.

@jameskoster jameskoster force-pushed the add/theme-motion-tokens branch from 2f2b871 to ffcefc6 Compare March 19, 2026 09:57
jameskoster and others added 15 commits May 11, 2026 13:45
Rename the easing tokens to describe their visual weight rather than
their technical curve behavior:

- gentle → subtle
- standard → balanced
- decelerate → expressive
- decelerate-emphasized → dramatic

Made-with: Cursor
Remove the non-existent `css-modules` type package from tsconfig and
add a local type declaration file for `.module.css` imports instead.

Made-with: Cursor
Merge `dramatic` into `expressive` and adjust all three curves for
better perceptual separation: `subtle` is now near-linear, `balanced`
remains the general-purpose curve, and `expressive` covers all
enter/exit and spatial transitions.

Made-with: Cursor
The Storybook Vite setup doesn't serve CSS modules correctly from
the storybook/stories/ directory. Use inline styles and an injected
style tag for keyframes instead, consistent with other design system
stories.

Made-with: Cursor
Add entries for components and ui packages noting the adoption of
--wpds-motion-* design tokens in Modal, Menu, DropdownMenu, and Dialog.

Made-with: Cursor
React supports rendering string children inside <style> tags directly,
so we can drop dangerouslySetInnerHTML (and its eslint-disable comment).

Co-authored-by: Cursor <cursoragent@cursor.com>
Terrazzo's CSS duration transform expects $value as the object form
{ value, unit } per the DTCG spec. The string form ("400ms") caused
the generator to emit 'undefinedundefined' for both the CSS variables
and the JS fallback map, which left consumers (such as the motion
Storybook story) with effectively zero-duration animations.

Switching motion.json to the object form and regenerating the prebuilt
files restores correct values throughout.

Co-authored-by: Cursor <cursoragent@cursor.com>
After rebasing onto trunk, relocate PR #76097 notes from shipped version
sections into each package Unreleased section (consolidate duplicate
components entries).

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Explain that FRAME_ANIMATION_DURATION_MS (from CONFIG.transitionDuration)
must stay aligned with --wpds-motion-duration-md on the modal frame in SCSS.

Co-authored-by: Cursor <cursoragent@cursor.com>
Use --wpds-motion-duration-xs as the scrim fade-out delay so xs+sm
finishes before the frame’s md disappear animation (unmount timing).

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
.popup already defines the same opacity/transform transitions; the nested
[data-open] rule was redundant.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Replace components SelectControl/TextControl/Button with Field, Select,
  InputControl, and brand-tone Button from @wordpress/ui.
- Drop design-system-tokens package-styles entry; stories still match the
  broader design-system rule (design tokens only, no duplicate bundle).

Co-authored-by: Cursor <cursoragent@cursor.com>
@jameskoster jameskoster force-pushed the add/theme-motion-tokens branch from 450e37f to 66945cb Compare May 11, 2026 13:43
Copy link
Copy Markdown
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 🚀

A couple of caveats / potential final changes / follow-ups:

  • easing-balanced is not used yet by any components — I assume we'll be able to make changes if needed, but we may also consider not exporting the token at all until we have a need for it?
  • I'll put emphasis once again on the duplication of values for modal and dropdown animations (config-values.js, use-modal-exit-animation.ts, dropdown-motion.ts, @wordpress/theme tokens). The obivous long-term fix is to either parse the DS token value in JS, or switch to CSS/Sass-based styles (so that the token can be consumed directly).
  • we should consider including support for prefers-reduced-motion directly at the token level — although that should be discussed/specced/implemented in a follow-up

@jameskoster
Copy link
Copy Markdown
Contributor Author

Of these points the first seems most suitable to consider addressing in this PR. I don't think it would hurt to export – I suspect it will get used relatively soon, and it rounds out the set for third party consumers. I think there are several unused tokens exported already so it's not a new precedent.

@ciampo ciampo merged commit 3e0f9fb into trunk May 12, 2026
42 checks passed
@ciampo ciampo deleted the add/theme-motion-tokens branch May 12, 2026 14:52
@github-actions github-actions Bot added this to the Gutenberg 23.2 milestone May 12, 2026
@ciampo
Copy link
Copy Markdown
Contributor

ciampo commented May 12, 2026

Of these points the first seems most suitable to consider addressing in this PR. I don't think it would hurt to export – I suspect it will get used relatively soon, and it rounds out the set for third party consumers. I think there are several unused tokens exported already so it's not a new precedent.

Let's merge and iterate 👌

ciampo added a commit that referenced this pull request May 14, 2026
Three Unreleased entries were inadvertently removed when the
Draggable migration commit was rebased onto trunk:

- @wordpress/components Internal: `Modal`, `Menu`, `DropdownMenu`
  motion-token adoption (#76097).
- @wordpress/components Internal: `Popover` close-button z-index
  cleanup (#78180).
- @wordpress/ui Bug Fixes: `Text` CSS-defense values for paragraph
  and heading variants (#78172).

Restore them under their original headings.
ciampo added a commit that referenced this pull request May 15, 2026
Three Unreleased entries were inadvertently removed when the
Draggable migration commit was rebased onto trunk:

- @wordpress/components Internal: `Modal`, `Menu`, `DropdownMenu`
  motion-token adoption (#76097).
- @wordpress/components Internal: `Popover` close-button z-index
  cleanup (#78180).
- @wordpress/ui Bug Fixes: `Text` CSS-defense values for paragraph
  and heading variants (#78172).

Restore them under their original headings.
ciampo added a commit that referenced this pull request May 15, 2026
Three Unreleased entries were inadvertently removed when the
Draggable migration commit was rebased onto trunk:

- @wordpress/components Internal: `Modal`, `Menu`, `DropdownMenu`
  motion-token adoption (#76097).
- @wordpress/components Internal: `Popover` close-button z-index
  cleanup (#78180).
- @wordpress/ui Bug Fixes: `Text` CSS-defense values for paragraph
  and heading variants (#78172).

Restore them under their original headings.
ciampo added a commit that referenced this pull request May 15, 2026
Three Unreleased entries were inadvertently removed when the
Draggable migration commit was rebased onto trunk:

- @wordpress/components Internal: `Modal`, `Menu`, `DropdownMenu`
  motion-token adoption (#76097).
- @wordpress/components Internal: `Popover` close-button z-index
  cleanup (#78180).
- @wordpress/ui Bug Fixes: `Text` CSS-defense values for paragraph
  and heading variants (#78172).

Restore them under their original headings.
ciampo added a commit that referenced this pull request May 15, 2026
…ot (#78183)

* Draggable: Migrate clone wrapper to wp compat overlay slot

Replace the legacy body-level / element-wrapper placement and its
`z-index: 1000000000` with a portal-style migration onto the
`@wordpress/ui` compat overlay slot (#77851). When the slot is
available, the drag clone joins the slot's body-level stacking context
across all three placement modes, so an active drag automatically
shares stacking with any `@wordpress/ui` overlay opened mid-drag
without needing per-version z-index races.

Auto-enabled in WordPress environments via the slot helper's
`window.wp.components` auto-detect; standalone hosts that bundle
`@wordpress/components` directly fall back to the previous placement
until they call `useEnableWpCompatOverlaySlot()`.

`@wordpress/components` imports `getWpCompatOverlaySlot()` directly
from `@wordpress/ui`'s public exports (also promoted from internal in
this change). The `@wordpress/components` dep on `@wordpress/ui` is
transitional, scoped to the legacy-overlay migration.

Cross-document drags (e.g. dragging an element inside an iframe while
the slot is in the parent document) fall back to the previous
placement so the clone's viewport-relative geometry stays in a single
coordinate space.

The default placement mode (`appendToOwnerDocument: false`, no
`dragComponent`) previously appended the clone to the dragged
element's parent. In WP environments where the slot is now in effect,
the clone instead lives in the slot — a body-level location. In-repo
ripgrep finds no CSS or event-delegation scoping anchored to the
clone's previous in-flow parent; external consumers that relied on
that ancestry must either not opt into the slot or migrate their
scoping.

* Draggable: Storybook: render docs-page stories in iframes

The drag clone uses `position: fixed`, which Storybook's docs-page
wrappers break because they apply `transform`s that establish new
containing blocks. As a result the clone resolves against those
wrappers instead of the viewport and lands in the wrong place on
the autodocs page.

Render each Draggable story in its own iframe on the autodocs page
via `parameters.docs.story.inline: false`, which restores
viewport-relative positioning for the clone.

* Draggable: Storybook: polish cross-document fallback playground story

Three small follow-ups on the iframe regression story:

- Inject the Draggable SCSS into the iframe via Vite's `?inline`
  import (same pattern `WithGlobalCSS` uses with
  `global-basic.scss?inline`) instead of duplicating rule bodies
  in `srcDoc`. Single source of truth; future SCSS edits flow
  through automatically.
- Guard the style injection on `iframeDoc?.head` so the brief
  about:blank → srcDoc transition doesn't throw on the initial
  `useEffect` pass.
- Align the slot-presence display with the public
  `getWpCompatOverlaySlot()` API: it now returns `undefined`
  rather than `null` when no slot is registered.

* CHANGELOG: Restore entries dropped during rebase

Three Unreleased entries were inadvertently removed when the
Draggable migration commit was rebased onto trunk:

- @wordpress/components Internal: `Modal`, `Menu`, `DropdownMenu`
  motion-token adoption (#76097).
- @wordpress/components Internal: `Popover` close-button z-index
  cleanup (#78180).
- @wordpress/ui Bug Fixes: `Text` CSS-defense values for paragraph
  and heading variants (#78172).

Restore them under their original headings.

* Storybook: Fix popover-with-slotfill cross-iframe collision boundary

`Popover.Popup` stopped accepting `collisionBoundary` directly when
#78168 introduced the `Popover.Positioner` slot subcomponent. The
prop is now silently ignored on `Popup`, so the cross-iframe story's
collision avoidance regressed after the rebase onto trunk.

Route the boundary through `Popover.Positioner` (matching the
modern `Popover.Popup`'s `positioner` slot pattern) so the popup
honors the iframe's clipping edge again.

This file is `.jsx` so the type system didn't catch the silent
prop-drop.

* Draggable: Storybook: refresh AppendElementToOwnerDocument JSDoc

The story's JSDoc still described the legacy "escape ancestor
stacking context" rationale, which now contradicts the updated
`appendToOwnerDocument` JSDoc in `types.ts` for hosts that opt
into the `@wordpress/ui` compat overlay slot — where the clone
always lives in the body-level slot and the prop is a no-op.

Update the story's docblock to mirror the type-level guidance and
call out the cross-document fallback exception.

* Draggable: CHANGELOG: Call out default-mode in-flow ancestor change

The original Draggable entry covered the stacking + cross-document
fallback story, but left the load-bearing behavior change for
third-party consumers in the PR description only: in the default
placement mode (no `appendToOwnerDocument`, no `__experimentalDragComponent`),
the clone used to be a DOM descendant of the dragged element's
parent. With the slot active, it now lives at the body-level slot
regardless.

Surface that change directly in the CHANGELOG entry, including a
migration hint for consumers that scoped CSS or event delegation
on the clone's previous ancestry.

* Draggable: Add e2e regression for chip-inside-compat-slot

Lock in the structural guarantee that underpins the stacking
claim in #78183: when `@wordpress/components`'s `Draggable` runs
in a WordPress environment, the drag chip is rendered inside the
body-level `[data-wp-compat-overlay-slot]`.

That single structural assertion subsumes the visual stacking
contract — the slot creates an isolated stacking context with
`z-index: 1000000003`, so anything appended into it stacks above
any `@wordpress/components` overlay opened mid-drag (which live
outside the slot at lower `z-index`s).

Asserting structure rather than visual layering keeps the test
robust against unrelated overlay z-index churn, and avoids a
brittle `elementFromPoint`-style probe across the
parent-doc/canvas-iframe boundary.

* Storybook: Trim file-level docblocks on playground stories

Drop the file-level brain-dump JSDoc from the
`draggable-cross-document-fallback` and `popover-with-slotfill`
playground stories. The story body and any per-story copy carry
the user-facing explanation; the file-level prose was internal
reasoning that doesn't belong in the story source.

Per mirka's review on PR #78183 (empty-suggestion blocks).

* Storybook: popover-with-slotfill story: use public @wordpress/ui API

Switch the playground story to consume `Popover` from the public
`@wordpress/ui` entry point instead of reaching into
`packages/ui/src/popover`. Inline a small `IframePortal` helper
locally so the story no longer depends on
`packages/ui/src/popover/stories/utils` either (those story
utilities are not part of any public surface).

Also swap the `Slot` ref from `useRef` to a state setter so the
popup re-renders once the slot's container element mounts, which
removes a first-render race the previous `useRef` pattern had.

Per mirka's review on PR #78183.

* Storybook: draggable cross-doc story: load components styles via Storybook bundle

Swap the iframe's style injection from a `?inline` import of
`packages/components/src/draggable/style.scss` (reaching into
another package's source) to Storybook's own
`storybook/package-styles/components-ltr.lazy.scss`, which is the
canonical bundle of `@wordpress/components` styles for stories.

The injected CSS is now broader than strictly necessary (the
whole package stylesheet rather than only Draggable's rules),
but this is a debug fixture and the cost is negligible. In
exchange we drop the cross-package src reach.

Per mirka's review on PR #78183.

* Storybook: Move cross-document fallback story under "Debug fixtures"

The cross-document fallback story is strictly defensive
regression coverage and doesn't illustrate a pattern non-
maintainers would seek out. Move it under a `Debug fixtures`
sub-section in the sidebar so the main `Playground/` namespace
stays focused on intended-usage demos.

Per mirka's review on PR #78183.

* Storybook: Drop redundant `parameters.sourceLink` from playground stories

The `source-link` Storybook addon already derives the GitHub
source path from `storyData.importPath` when no explicit
`parameters.sourceLink` is provided (see
`storybook/addons/source-link/manager.ts`). For stories living
under `storybook/stories/playground/`, that fallback resolves to
the same value the explicit `sourceLink` was hard-coding, so the
declaration is pure duplication.

Per mirka's review on PR #78183 (empty-suggestion blocks
covering the `parameters: { sourceLink: ... }` literal).

* Draggable: Migrate styles from SCSS to a CSS module

Move the (already small) Draggable stylesheet to a CSS module so
its rules travel via `@wordpress/style-runtime` (and therefore
into any iframe wrapped in `<StyleProvider>` — e.g. the
block-editor canvas) without needing the package-level
`build-style/style.css` bundle. Drops the `@use` line from
`packages/components/src/style.scss`, following the same shape
as the `AlignmentMatrixControl` (#73714/#73757) and
`AnglePickerControl` (#73786) migrations.

The CSS-module class names are standard (hashed). The legacy
`components-draggable__*` / `is-dragging-components-draggable`
class names are kept by adding them alongside the hashed ones
in the JS `classList.add(...)` calls, since several other
Gutenberg packages reference them in their own stylesheets
(block-editor's `list-view`, `block-tools`, `block-library`'s
`navigation` editor, `edit-widgets`' `widget-area` editor) and
block-editor runtime JS reads `is-dragging-components-draggable`
off `document.body`. Dropping those names would silently break
those consumers.

Per mirka's review on PR #78183 (CSS-module option for the
iframe story); the corresponding Storybook simplification
follows in a separate commit.

* Storybook: Simplify cross-document fallback story with StyleProvider

Now that Draggable's styles ship as a CSS module routed through
`@wordpress/style-runtime`, the cross-document fallback story no
longer needs to manually `?inline`-import and inject the whole
`components-ltr` SCSS bundle into the iframe's `<head>`.

Wrap the portaled iframe content in
`<StyleProvider document={iframeDoc}>` from
`@wordpress/components` instead — `StyleProvider` calls
`registerDocument()` on the iframe document, and the style
registry replays every registered CSS module (Draggable
included) into that document. The visible behavior is
unchanged: the orange clone still tracks the cursor inside the
iframe, demonstrating the cross-document fallback.

Per mirka's review on PR #78183.

* Draggable: CHANGELOG: Move entry to Unreleased and slim it down

The Enhancements entry for this PR ended up rolled into the
already-cut `33.1.0` release section during an earlier rebase,
and had grown to a 700-character paragraph spelling out every
edge case (cross-document fallback, `appendToOwnerDocument`
semantics, in-flow ancestor migration hints).

Move it back to `## Unreleased` and trim to a two-sentence
summary in line with the surrounding entries. The dropped
detail still lives in the JSDoc, the code comments, and the PR
description's <details> blocks.

* Draggable: Trim verbose inline code comments

Sweep across the comments added by this PR, dropping
redundant duplication, narration of self-evident code, and
prose that already lives in the PR description / JSDoc:

-   Drop the duplicate compat-slot note from the
    `AppendElementToOwnerDocument` story JSDoc (the
    interaction is already described on the prop's TS
    JSDoc in `types.ts`).
-   Tighten the prop JSDoc for `appendToOwnerDocument` to a
    single short paragraph.
-   Slim the same-document-only slot guard comment in
    `Draggable.start()` (the conditional itself reads as
    "slot if same document").
-   Compact the rationale comment for
    `parameters.docs.story.inline: false` in the Draggable
    autodocs config to a single explanation.
-   Trim the structural-stacking assertion comment in the
    Playwright `draggable-blocks` spec.
-   Drop the forward-looking "can be removed on a future
    Stylelint upgrade" note from `CSS_BASELINE_2024_FUNCTIONS`.

No behavior change.

* @wordpress/ui CHANGELOG: Move #78183 entry to Unreleased

The `getWpCompatOverlaySlot()` export bullet was left inside the
already-released `## 0.13.0` section when the parallel
`@wordpress/components` entry was moved to `## Unreleased`.

* Draggable: Keep physical `left` for the invisible drag image

Mirroring this offscreen stand-in in RTL has no benefit — either side
hides it equally — so revert to the original physical property and
silence the logical-properties lint with a targeted comment.

* @wordpress/ui CHANGELOG: Trim #78183 entry

* @wordpress/ui: Restore unrelated tsconfig change

* Storybook: Drop redundant story-name overrides

* Draggable: Keep body cursor class global

The cursor flip is also triggered by external code (block-editor
keyboard drag, etc.) that toggles `is-dragging-components-draggable`
directly. Targeting the legacy class globally preserves that flow,
which a module-hashed selector silently broke.

* Draggable: Guard class arrays against the Jest CSS-module mock

`jest-preset-default`'s style mock returns `undefined` for any class,
which `classList.add()` would coerce to a literal "undefined" token.
Filter falsy entries to keep test DOM clean.

* Draggable: Address minor self-review nits

- Note why the invisible drag image bypasses the compat slot.
- Drop a redundant chip-count assertion in the e2e spec.
- Flag the SCSS-only stylelint override pattern explicitly.

* Storybook: Group compat-slot fixtures under Debug fixtures

Consolidates the manual verification stories (`WP Compat Overlay Slot`,
`Popover with SlotFill`) alongside the existing Draggable fixture.

* Draggable: Use kebab-case for CSS module class names

---

Co-authored-by: ciampo <mciampini@git.wordpress.org>
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Design System Issues related to the system of combining components according to best practices. [Package] Components /packages/components [Package] Theme /packages/theme [Package] UI /packages/ui [Type] Enhancement A suggestion for improvement.

Projects

Status: 💫 Done

Development

Successfully merging this pull request may close these issues.

6 participants