@birdycom/omniacss 0.11.0 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +44 -44
  3. package/dist/oc-theme.css +1 -1
  4. package/dist/omnia.css +2 -1
  5. package/dist/omnia.min.css +1 -1
  6. package/dist/omnia.starter.css +2 -0
  7. package/dist/omnia.starter.min.css +1 -1
  8. package/dist/tokens/omnia.dtcg.json +2 -2
  9. package/dist/tokens/omnia.tokens.json +1 -1
  10. package/dist/tokens/omnia_tokens.py +2 -2
  11. package/package.json +63 -63
  12. package/scss/utilities/_anchor_positioning.scss +65 -65
  13. package/scss/utilities/_animation_properties.scss +143 -143
  14. package/scss/utilities/_borders_extended.scss +97 -97
  15. package/scss/utilities/_borders_outlines.scss +161 -161
  16. package/scss/utilities/_containment.scss +82 -82
  17. package/scss/utilities/_css_functions.scss +34 -34
  18. package/scss/utilities/_dark_mode.scss +117 -117
  19. package/scss/utilities/_drop_shadow_colors.scss +26 -26
  20. package/scss/utilities/_experimental_css.scss +149 -149
  21. package/scss/utilities/_flexbox.scss +317 -317
  22. package/scss/utilities/_font_variants.scss +139 -139
  23. package/scss/utilities/_gap.scss +103 -103
  24. package/scss/utilities/_gradient_stops.scss +48 -48
  25. package/scss/utilities/_grid.scss +672 -672
  26. package/scss/utilities/_layout_extras.scss +171 -171
  27. package/scss/utilities/_layout_flow.scss +210 -210
  28. package/scss/utilities/_mask_extras.scss +62 -62
  29. package/scss/utilities/_motion_transforms.scss +167 -167
  30. package/scss/utilities/_scroll_animations.scss +80 -80
  31. package/scss/utilities/_scrollbar.scss +2 -1
  32. package/scss/utilities/_shadow_tokens.scss +21 -21
  33. package/scss/utilities/_shapes.scss +72 -72
  34. package/scss/utilities/_sizing_logical.scss +99 -99
  35. package/scss/utilities/_starting_style.scss +53 -53
  36. package/scss/utilities/_state_variants.scss +196 -196
  37. package/scss/utilities/_svg.scss +100 -100
  38. package/scss/utilities/_table_advanced.scss +19 -19
  39. package/scss/utilities/_typography_advanced.scss +124 -124
  40. package/scss/utilities/_typography_modern.scss +83 -83
  41. package/scss/utilities/_view_transitions.scss +64 -64
  42. package/scss/utilities/_writing_modes.scss +72 -72
  43. package/scss/variables/_hulp.scss +107 -107
  44. package/scss/variables/_variables_effects.scss +108 -108
  45. package/src/postcss.mjs +43 -43
  46. package/src/tokens.mjs +377 -377
  47. package/src/variants.mjs +278 -278
  48. package/tokens/semantic.json +80 -80
package/package.json CHANGED
@@ -1,63 +1,63 @@
1
- {
2
- "name": "@birdycom/omniacss",
3
- "version": "0.11.0",
4
- "description": "OmniaCSS utilities: modern CSS (anchor positioning, container queries, view transitions, light-dark()) as utility classes, generated on demand.",
5
- "type": "module",
6
- "license": "MIT",
7
- "author": "Serge Cools (Birdycom)",
8
- "homepage": "https://omniacss.eu",
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/Birdycom/omniacss.git",
12
- "directory": "packages/core"
13
- },
14
- "bugs": {
15
- "url": "https://github.com/Birdycom/omniacss/issues"
16
- },
17
- "keywords": [
18
- "css",
19
- "utility-first",
20
- "design-system",
21
- "light-dark",
22
- "container-queries",
23
- "anchor-positioning",
24
- "omniacss"
25
- ],
26
- "engines": {
27
- "node": ">=22"
28
- },
29
- "exports": {
30
- ".": "./dist/omnia.css",
31
- "./min": "./dist/omnia.min.css",
32
- "./starter": "./dist/omnia.starter.min.css",
33
- "./tokens": "./dist/oc-colors.css",
34
- "./theme": "./dist/oc-theme.css",
35
- "./tokens/semantic.json": "./tokens/semantic.json",
36
- "./tokens/export": "./src/tokens.mjs",
37
- "./engine": "./src/engine.mjs",
38
- "./postcss": "./src/postcss.mjs",
39
- "./scss/*": "./scss/*",
40
- "./dist/*": "./dist/*",
41
- "./package.json": "./package.json"
42
- },
43
- "style": "./dist/omnia.css",
44
- "files": [
45
- "dist",
46
- "scss",
47
- "src",
48
- "tokens",
49
- "README.md",
50
- "LICENSE"
51
- ],
52
- "dependencies": {
53
- "postcss": "^8.5.3"
54
- },
55
- "unpkg": "./dist/omnia.starter.min.css",
56
- "jsdelivr": "./dist/omnia.starter.min.css",
57
- "sideEffects": [
58
- "*.css"
59
- ],
60
- "publishConfig": {
61
- "access": "public"
62
- }
63
- }
1
+ {
2
+ "name": "@birdycom/omniacss",
3
+ "version": "0.11.2",
4
+ "description": "OmniaCSS utilities: modern CSS (anchor positioning, container queries, view transitions, light-dark()) as utility classes, generated on demand.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Serge Cools (Birdycom)",
8
+ "homepage": "https://omniacss.eu",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/Birdycom/OmniaCSS.git",
12
+ "directory": "packages/core"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/Birdycom/OmniaCSS/issues"
16
+ },
17
+ "keywords": [
18
+ "css",
19
+ "utility-first",
20
+ "design-system",
21
+ "light-dark",
22
+ "container-queries",
23
+ "anchor-positioning",
24
+ "omniacss"
25
+ ],
26
+ "engines": {
27
+ "node": ">=22"
28
+ },
29
+ "exports": {
30
+ ".": "./dist/omnia.css",
31
+ "./min": "./dist/omnia.min.css",
32
+ "./starter": "./dist/omnia.starter.min.css",
33
+ "./tokens": "./dist/oc-colors.css",
34
+ "./theme": "./dist/oc-theme.css",
35
+ "./tokens/semantic.json": "./tokens/semantic.json",
36
+ "./tokens/export": "./src/tokens.mjs",
37
+ "./engine": "./src/engine.mjs",
38
+ "./postcss": "./src/postcss.mjs",
39
+ "./scss/*": "./scss/*",
40
+ "./dist/*": "./dist/*",
41
+ "./package.json": "./package.json"
42
+ },
43
+ "style": "./dist/omnia.css",
44
+ "files": [
45
+ "dist",
46
+ "scss",
47
+ "src",
48
+ "tokens",
49
+ "README.md",
50
+ "LICENSE"
51
+ ],
52
+ "dependencies": {
53
+ "postcss": "^8.5.3"
54
+ },
55
+ "unpkg": "./dist/omnia.starter.min.css",
56
+ "jsdelivr": "./dist/omnia.starter.min.css",
57
+ "sideEffects": [
58
+ "*.css"
59
+ ],
60
+ "publishConfig": {
61
+ "access": "public"
62
+ }
63
+ }
@@ -1,65 +1,65 @@
1
- // SCSS Document
2
- // File: src/scss/utilities/_anchor_positioning.scss
3
- // Description: CSS Anchor Positioning utilities — tether an element to an anchor without JavaScript.
4
- // Copyright: 2021-2026 Birdycom
5
- // Author: Serge Cools
6
- // Version: 0.3.0
7
- // Framework: OmniaCSS
8
- // Purpose: Generate .anchor-*, .anchored-*, .anchor-area-*, .anchor-try-* and .anchor-visibility-* classes.
9
- // Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning
10
- // Note: the anchored element needs position: absolute or fixed (.absolute / .fixed).
11
- // Pair .anchor-{name} on the trigger with .anchored-{name} on the positioned element.
12
- // Map: anchor-name -> position-anchor -> anchor-scope -> position-area -> position-try -> position-visibility
13
-
14
- $_anchor-names: ('oc', 'trigger', 'menu', 'tooltip');
15
-
16
- /* Anchor name — register an element as anchor */
17
- @each $name in $_anchor-names {
18
- .anchor-#{$name} { anchor-name: --#{$name}; }
19
- }
20
- .anchor-none { anchor-name: none; }
21
-
22
- /* Position anchor — attach a positioned element to a named anchor */
23
- @each $name in $_anchor-names {
24
- .anchored-#{$name} { position-anchor: --#{$name}; }
25
- }
26
- .anchored-auto { position-anchor: auto; }
27
-
28
- /* Anchor scope — limit anchor name lookup to a subtree (repeated components) */
29
- .anchor-scope-all { anchor-scope: all; }
30
- .anchor-scope-none { anchor-scope: none; }
31
-
32
- /* Position area — place the element in a region of the 3×3 grid around the anchor */
33
- .anchor-area-top { position-area: top; }
34
- .anchor-area-bottom { position-area: bottom; }
35
- .anchor-area-left { position-area: left; }
36
- .anchor-area-right { position-area: right; }
37
- .anchor-area-center { position-area: center; }
38
- .anchor-area-top-left { position-area: top left; }
39
- .anchor-area-top-right { position-area: top right; }
40
- .anchor-area-bottom-left { position-area: bottom left; }
41
- .anchor-area-bottom-right { position-area: bottom right; }
42
- .anchor-area-top-span-right { position-area: top span-right; }
43
- .anchor-area-bottom-span-right { position-area: bottom span-right; }
44
- .anchor-area-block-start { position-area: block-start; }
45
- .anchor-area-block-end { position-area: block-end; }
46
- .anchor-area-inline-start { position-area: inline-start; }
47
- .anchor-area-inline-end { position-area: inline-end; }
48
-
49
- /* Position try fallbacks — alternatives when the element overflows */
50
- .anchor-try-none { position-try-fallbacks: none; }
51
- .anchor-try-flip-block { position-try-fallbacks: flip-block; }
52
- .anchor-try-flip-inline { position-try-fallbacks: flip-inline; }
53
- .anchor-try-flip-both { position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline; }
54
- .anchor-try-order-normal { position-try-order: normal; }
55
- .anchor-try-order-most-width { position-try-order: most-width; }
56
- .anchor-try-order-most-height { position-try-order: most-height; }
57
-
58
- /* Position visibility — hide the element when its anchor is hidden or it overflows */
59
- .anchor-visibility-always { position-visibility: always; }
60
- .anchor-visibility-anchors-visible { position-visibility: anchors-visible; }
61
- .anchor-visibility-no-overflow { position-visibility: no-overflow; }
62
-
63
- /* Anchor size — match the anchor's width (dropdown menus) */
64
- .w-anchor { width: anchor-size(width); }
65
- .min-w-anchor { min-width: anchor-size(width); }
1
+ // SCSS Document
2
+ // File: src/scss/utilities/_anchor_positioning.scss
3
+ // Description: CSS Anchor Positioning utilities — tether an element to an anchor without JavaScript.
4
+ // Copyright: 2021-2026 Birdycom
5
+ // Author: Serge Cools
6
+ // Version: 0.3.0
7
+ // Framework: OmniaCSS
8
+ // Purpose: Generate .anchor-*, .anchored-*, .anchor-area-*, .anchor-try-* and .anchor-visibility-* classes.
9
+ // Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning
10
+ // Note: the anchored element needs position: absolute or fixed (.absolute / .fixed).
11
+ // Pair .anchor-{name} on the trigger with .anchored-{name} on the positioned element.
12
+ // Map: anchor-name -> position-anchor -> anchor-scope -> position-area -> position-try -> position-visibility
13
+
14
+ $_anchor-names: ('oc', 'trigger', 'menu', 'tooltip');
15
+
16
+ /* Anchor name — register an element as anchor */
17
+ @each $name in $_anchor-names {
18
+ .anchor-#{$name} { anchor-name: --#{$name}; }
19
+ }
20
+ .anchor-none { anchor-name: none; }
21
+
22
+ /* Position anchor — attach a positioned element to a named anchor */
23
+ @each $name in $_anchor-names {
24
+ .anchored-#{$name} { position-anchor: --#{$name}; }
25
+ }
26
+ .anchored-auto { position-anchor: auto; }
27
+
28
+ /* Anchor scope — limit anchor name lookup to a subtree (repeated components) */
29
+ .anchor-scope-all { anchor-scope: all; }
30
+ .anchor-scope-none { anchor-scope: none; }
31
+
32
+ /* Position area — place the element in a region of the 3×3 grid around the anchor */
33
+ .anchor-area-top { position-area: top; }
34
+ .anchor-area-bottom { position-area: bottom; }
35
+ .anchor-area-left { position-area: left; }
36
+ .anchor-area-right { position-area: right; }
37
+ .anchor-area-center { position-area: center; }
38
+ .anchor-area-top-left { position-area: top left; }
39
+ .anchor-area-top-right { position-area: top right; }
40
+ .anchor-area-bottom-left { position-area: bottom left; }
41
+ .anchor-area-bottom-right { position-area: bottom right; }
42
+ .anchor-area-top-span-right { position-area: top span-right; }
43
+ .anchor-area-bottom-span-right { position-area: bottom span-right; }
44
+ .anchor-area-block-start { position-area: block-start; }
45
+ .anchor-area-block-end { position-area: block-end; }
46
+ .anchor-area-inline-start { position-area: inline-start; }
47
+ .anchor-area-inline-end { position-area: inline-end; }
48
+
49
+ /* Position try fallbacks — alternatives when the element overflows */
50
+ .anchor-try-none { position-try-fallbacks: none; }
51
+ .anchor-try-flip-block { position-try-fallbacks: flip-block; }
52
+ .anchor-try-flip-inline { position-try-fallbacks: flip-inline; }
53
+ .anchor-try-flip-both { position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline; }
54
+ .anchor-try-order-normal { position-try-order: normal; }
55
+ .anchor-try-order-most-width { position-try-order: most-width; }
56
+ .anchor-try-order-most-height { position-try-order: most-height; }
57
+
58
+ /* Position visibility — hide the element when its anchor is hidden or it overflows */
59
+ .anchor-visibility-always { position-visibility: always; }
60
+ .anchor-visibility-anchors-visible { position-visibility: anchors-visible; }
61
+ .anchor-visibility-no-overflow { position-visibility: no-overflow; }
62
+
63
+ /* Anchor size — match the anchor's width (dropdown menus) */
64
+ .w-anchor { width: anchor-size(width); }
65
+ .min-w-anchor { min-width: anchor-size(width); }
@@ -1,143 +1,143 @@
1
- // SCSS Document
2
- // File: src/scss/utilities/_animation_properties.scss
3
- // Description: Animation longhand utilities, easing functions, motion path (offset-*), the individual
4
- // rotate property, transform-box and scroll/view timeline longhands.
5
- // Copyright: 2021-2026 Birdycom
6
- // Author: Serge Cools
7
- // Version: 0.3.0
8
- // Framework: OmniaCSS
9
- // Purpose: Generate .animate-delay-*, .animate-duration-*, .animate-direction-*, .animate-fill-*, .animate-play-*,
10
- // .animate-repeat-*, .animate-compose-*, .animate-ease-*, .animate-name-*, .ease-spring/.ease-bounce/.ease-steps-*,
11
- // .offset-*, .rotate-prop-*, .transform-box-*, .animate-range-start-*/-end-*, .scroll-timeline-axis-*,
12
- // .view-timeline-axis-*, .view-timeline-inset-*.
13
- // Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animations
14
- // Note: complements _motion_transforms.scss (transition-*, .animate-spin, transform utilities).
15
- // Map: duration -> delay -> iteration -> direction -> fill-mode -> play-state -> composition -> name
16
- // -> easing -> motion path -> rotate property -> transform-box -> timeline longhands
17
-
18
- /* Animation duration */
19
- @each $ms in (75, 150, 300, 500, 700, 1000, 2000) {
20
- .animate-duration-#{$ms} { animation-duration: #{$ms}ms; }
21
- }
22
-
23
- /* Animation delay */
24
- @each $ms in (0, 75, 150, 300, 500, 1000) {
25
- .animate-delay-#{$ms} { animation-delay: #{$ms}ms; }
26
- }
27
-
28
- /* Animation iteration count */
29
- .animate-repeat-1 { animation-iteration-count: 1; }
30
- .animate-repeat-2 { animation-iteration-count: 2; }
31
- .animate-repeat-3 { animation-iteration-count: 3; }
32
- .animate-repeat-infinite { animation-iteration-count: infinite; }
33
-
34
- /* Animation direction */
35
- .animate-direction-normal { animation-direction: normal; }
36
- .animate-direction-reverse { animation-direction: reverse; }
37
- .animate-direction-alternate { animation-direction: alternate; }
38
- .animate-direction-alternate-reverse { animation-direction: alternate-reverse; }
39
-
40
- /* Animation fill mode */
41
- .animate-fill-none { animation-fill-mode: none; }
42
- .animate-fill-forwards { animation-fill-mode: forwards; }
43
- .animate-fill-backwards { animation-fill-mode: backwards; }
44
- .animate-fill-both { animation-fill-mode: both; }
45
-
46
- /* Animation play state (e.g. pause on hover with hover:animate-paused in your own CSS) */
47
- .animate-running { animation-play-state: running; }
48
- .animate-paused { animation-play-state: paused; }
49
-
50
- /* Animation composition */
51
- .animate-compose-replace { animation-composition: replace; }
52
- .animate-compose-add { animation-composition: add; }
53
- .animate-compose-accumulate { animation-composition: accumulate; }
54
-
55
- /* Animation name — pair with .animate-duration-* (keyframes from _motion_transforms.scss) */
56
- .animate-name-none { animation-name: none; }
57
- .animate-name-spin { animation-name: oc-spin; }
58
- .animate-name-pulse { animation-name: oc-pulse; }
59
- .animate-name-bounce { animation-name: oc-bounce; }
60
- .animate-name-ping { animation-name: oc-ping; }
61
-
62
- /* Easing functions — animations (transitions use .ease-*) */
63
- .animate-ease-linear { animation-timing-function: linear; }
64
- .animate-ease-in { animation-timing-function: ease-in; }
65
- .animate-ease-out { animation-timing-function: ease-out; }
66
- .animate-ease-in-out { animation-timing-function: ease-in-out; }
67
- .animate-ease-steps-4 { animation-timing-function: steps(4, end); }
68
- .animate-ease-spring {
69
- animation-timing-function: linear(0, 0.009, 0.035 2.1%, 0.141, 0.281 6.7%, 0.723 12.9%, 0.938 16.7%, 1.017, 1.077, 1.121, 1.149 24.3%, 1.159, 1.163, 1.161, 1.154 29.9%, 1.129 32.8%, 1.051 39.6%, 1.017 43.1%, 0.991, 0.977 51%, 0.974 53.8%, 0.975 57.1%, 0.997 69.8%, 1.003 76.9%, 1);
70
- }
71
-
72
- /* Easing functions — transitions: spring/bounce via linear(), stepped */
73
- .ease-spring {
74
- transition-timing-function: linear(0, 0.009, 0.035 2.1%, 0.141, 0.281 6.7%, 0.723 12.9%, 0.938 16.7%, 1.017, 1.077, 1.121, 1.149 24.3%, 1.159, 1.163, 1.161, 1.154 29.9%, 1.129 32.8%, 1.051 39.6%, 1.017 43.1%, 0.991, 0.977 51%, 0.974 53.8%, 0.975 57.1%, 0.997 69.8%, 1.003 76.9%, 1);
75
- }
76
- .ease-bounce {
77
- transition-timing-function: linear(0, 0.063, 0.25, 0.563, 1 36.4%, 0.812, 0.75, 0.813, 1 72.7%, 0.953, 0.938, 0.953, 1 90.9%, 0.984, 1);
78
- }
79
- .ease-steps-4 { transition-timing-function: steps(4, end); }
80
- .ease-step-start { transition-timing-function: step-start; }
81
- .ease-step-end { transition-timing-function: step-end; }
82
-
83
- /* Motion path — move an element along a path */
84
- .offset-path-none { offset-path: none; }
85
- .offset-path-circle { offset-path: circle(40% at 50% 50%); }
86
- .offset-path-ellipse { offset-path: ellipse(45% 35% at 50% 50%); }
87
- .offset-path-inset { offset-path: inset(10% round 1rem); }
88
- .offset-path-wave { offset-path: path("M 0 40 C 40 0, 80 80, 120 40 S 200 0, 240 40"); }
89
- .offset-path-ray { offset-path: ray(45deg closest-side); }
90
- @each $p in (0, 25, 50, 75, 100) {
91
- .offset-distance-#{$p} { offset-distance: #{$p * 1%}; }
92
- }
93
- .offset-rotate-auto { offset-rotate: auto; }
94
- .offset-rotate-reverse { offset-rotate: reverse; }
95
- .offset-rotate-0 { offset-rotate: 0deg; }
96
- .offset-anchor-center { offset-anchor: center; }
97
- .offset-anchor-auto { offset-anchor: auto; }
98
- .offset-position-normal { offset-position: normal; }
99
- .offset-position-center { offset-position: center; }
100
- .offset-none { offset: none; }
101
-
102
- /* Follow the path from 0% to 100% */
103
- @keyframes oc-follow-path {
104
- from { offset-distance: 0%; }
105
- to { offset-distance: 100%; }
106
- }
107
- .animate-follow-path { animation: oc-follow-path 3s ease-in-out infinite alternate; }
108
-
109
- @media (prefers-reduced-motion: reduce) {
110
- .animate-follow-path { animation: none; }
111
- }
112
-
113
- /* Individual rotate property (independent from transform) */
114
- @each $deg in (0, 45, 90, 180, -45, -90) {
115
- $name: '#{$deg}';
116
- @if $deg < 0 {
117
- $name: 'n#{-$deg}';
118
- }
119
- .rotate-prop-#{$name} { rotate: #{$deg}deg; }
120
- }
121
- .rotate-prop-x-180 { rotate: x 180deg; }
122
- .rotate-prop-y-180 { rotate: y 180deg; }
123
-
124
- /* Transform box — reference box for transform-origin (SVG) */
125
- .transform-box-content { transform-box: content-box; }
126
- .transform-box-border { transform-box: border-box; }
127
- .transform-box-fill { transform-box: fill-box; }
128
- .transform-box-stroke { transform-box: stroke-box; }
129
- .transform-box-view { transform-box: view-box; }
130
-
131
- /* Timeline longhands */
132
- .animate-range-start-entry { animation-range-start: entry; }
133
- .animate-range-start-contain { animation-range-start: contain; }
134
- .animate-range-end-exit { animation-range-end: exit; }
135
- .animate-range-end-contain { animation-range-end: contain; }
136
- .scroll-timeline-axis-block { scroll-timeline-axis: block; }
137
- .scroll-timeline-axis-inline { scroll-timeline-axis: inline; }
138
- .scroll-timeline-name-oc { scroll-timeline-name: --oc-timeline; }
139
- .view-timeline-axis-block { view-timeline-axis: block; }
140
- .view-timeline-axis-inline { view-timeline-axis: inline; }
141
- .view-timeline-name-oc { view-timeline-name: --oc-timeline; }
142
- .view-timeline-inset-auto { view-timeline-inset: auto; }
143
- .view-timeline-inset-10 { view-timeline-inset: 10%; }
1
+ // SCSS Document
2
+ // File: src/scss/utilities/_animation_properties.scss
3
+ // Description: Animation longhand utilities, easing functions, motion path (offset-*), the individual
4
+ // rotate property, transform-box and scroll/view timeline longhands.
5
+ // Copyright: 2021-2026 Birdycom
6
+ // Author: Serge Cools
7
+ // Version: 0.3.0
8
+ // Framework: OmniaCSS
9
+ // Purpose: Generate .animate-delay-*, .animate-duration-*, .animate-direction-*, .animate-fill-*, .animate-play-*,
10
+ // .animate-repeat-*, .animate-compose-*, .animate-ease-*, .animate-name-*, .ease-spring/.ease-bounce/.ease-steps-*,
11
+ // .offset-*, .rotate-prop-*, .transform-box-*, .animate-range-start-*/-end-*, .scroll-timeline-axis-*,
12
+ // .view-timeline-axis-*, .view-timeline-inset-*.
13
+ // Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animations
14
+ // Note: complements _motion_transforms.scss (transition-*, .animate-spin, transform utilities).
15
+ // Map: duration -> delay -> iteration -> direction -> fill-mode -> play-state -> composition -> name
16
+ // -> easing -> motion path -> rotate property -> transform-box -> timeline longhands
17
+
18
+ /* Animation duration */
19
+ @each $ms in (75, 150, 300, 500, 700, 1000, 2000) {
20
+ .animate-duration-#{$ms} { animation-duration: #{$ms}ms; }
21
+ }
22
+
23
+ /* Animation delay */
24
+ @each $ms in (0, 75, 150, 300, 500, 1000) {
25
+ .animate-delay-#{$ms} { animation-delay: #{$ms}ms; }
26
+ }
27
+
28
+ /* Animation iteration count */
29
+ .animate-repeat-1 { animation-iteration-count: 1; }
30
+ .animate-repeat-2 { animation-iteration-count: 2; }
31
+ .animate-repeat-3 { animation-iteration-count: 3; }
32
+ .animate-repeat-infinite { animation-iteration-count: infinite; }
33
+
34
+ /* Animation direction */
35
+ .animate-direction-normal { animation-direction: normal; }
36
+ .animate-direction-reverse { animation-direction: reverse; }
37
+ .animate-direction-alternate { animation-direction: alternate; }
38
+ .animate-direction-alternate-reverse { animation-direction: alternate-reverse; }
39
+
40
+ /* Animation fill mode */
41
+ .animate-fill-none { animation-fill-mode: none; }
42
+ .animate-fill-forwards { animation-fill-mode: forwards; }
43
+ .animate-fill-backwards { animation-fill-mode: backwards; }
44
+ .animate-fill-both { animation-fill-mode: both; }
45
+
46
+ /* Animation play state (e.g. pause on hover with hover:animate-paused in your own CSS) */
47
+ .animate-running { animation-play-state: running; }
48
+ .animate-paused { animation-play-state: paused; }
49
+
50
+ /* Animation composition */
51
+ .animate-compose-replace { animation-composition: replace; }
52
+ .animate-compose-add { animation-composition: add; }
53
+ .animate-compose-accumulate { animation-composition: accumulate; }
54
+
55
+ /* Animation name — pair with .animate-duration-* (keyframes from _motion_transforms.scss) */
56
+ .animate-name-none { animation-name: none; }
57
+ .animate-name-spin { animation-name: oc-spin; }
58
+ .animate-name-pulse { animation-name: oc-pulse; }
59
+ .animate-name-bounce { animation-name: oc-bounce; }
60
+ .animate-name-ping { animation-name: oc-ping; }
61
+
62
+ /* Easing functions — animations (transitions use .ease-*) */
63
+ .animate-ease-linear { animation-timing-function: linear; }
64
+ .animate-ease-in { animation-timing-function: ease-in; }
65
+ .animate-ease-out { animation-timing-function: ease-out; }
66
+ .animate-ease-in-out { animation-timing-function: ease-in-out; }
67
+ .animate-ease-steps-4 { animation-timing-function: steps(4, end); }
68
+ .animate-ease-spring {
69
+ animation-timing-function: linear(0, 0.009, 0.035 2.1%, 0.141, 0.281 6.7%, 0.723 12.9%, 0.938 16.7%, 1.017, 1.077, 1.121, 1.149 24.3%, 1.159, 1.163, 1.161, 1.154 29.9%, 1.129 32.8%, 1.051 39.6%, 1.017 43.1%, 0.991, 0.977 51%, 0.974 53.8%, 0.975 57.1%, 0.997 69.8%, 1.003 76.9%, 1);
70
+ }
71
+
72
+ /* Easing functions — transitions: spring/bounce via linear(), stepped */
73
+ .ease-spring {
74
+ transition-timing-function: linear(0, 0.009, 0.035 2.1%, 0.141, 0.281 6.7%, 0.723 12.9%, 0.938 16.7%, 1.017, 1.077, 1.121, 1.149 24.3%, 1.159, 1.163, 1.161, 1.154 29.9%, 1.129 32.8%, 1.051 39.6%, 1.017 43.1%, 0.991, 0.977 51%, 0.974 53.8%, 0.975 57.1%, 0.997 69.8%, 1.003 76.9%, 1);
75
+ }
76
+ .ease-bounce {
77
+ transition-timing-function: linear(0, 0.063, 0.25, 0.563, 1 36.4%, 0.812, 0.75, 0.813, 1 72.7%, 0.953, 0.938, 0.953, 1 90.9%, 0.984, 1);
78
+ }
79
+ .ease-steps-4 { transition-timing-function: steps(4, end); }
80
+ .ease-step-start { transition-timing-function: step-start; }
81
+ .ease-step-end { transition-timing-function: step-end; }
82
+
83
+ /* Motion path — move an element along a path */
84
+ .offset-path-none { offset-path: none; }
85
+ .offset-path-circle { offset-path: circle(40% at 50% 50%); }
86
+ .offset-path-ellipse { offset-path: ellipse(45% 35% at 50% 50%); }
87
+ .offset-path-inset { offset-path: inset(10% round 1rem); }
88
+ .offset-path-wave { offset-path: path("M 0 40 C 40 0, 80 80, 120 40 S 200 0, 240 40"); }
89
+ .offset-path-ray { offset-path: ray(45deg closest-side); }
90
+ @each $p in (0, 25, 50, 75, 100) {
91
+ .offset-distance-#{$p} { offset-distance: #{$p * 1%}; }
92
+ }
93
+ .offset-rotate-auto { offset-rotate: auto; }
94
+ .offset-rotate-reverse { offset-rotate: reverse; }
95
+ .offset-rotate-0 { offset-rotate: 0deg; }
96
+ .offset-anchor-center { offset-anchor: center; }
97
+ .offset-anchor-auto { offset-anchor: auto; }
98
+ .offset-position-normal { offset-position: normal; }
99
+ .offset-position-center { offset-position: center; }
100
+ .offset-none { offset: none; }
101
+
102
+ /* Follow the path from 0% to 100% */
103
+ @keyframes oc-follow-path {
104
+ from { offset-distance: 0%; }
105
+ to { offset-distance: 100%; }
106
+ }
107
+ .animate-follow-path { animation: oc-follow-path 3s ease-in-out infinite alternate; }
108
+
109
+ @media (prefers-reduced-motion: reduce) {
110
+ .animate-follow-path { animation: none; }
111
+ }
112
+
113
+ /* Individual rotate property (independent from transform) */
114
+ @each $deg in (0, 45, 90, 180, -45, -90) {
115
+ $name: '#{$deg}';
116
+ @if $deg < 0 {
117
+ $name: 'n#{-$deg}';
118
+ }
119
+ .rotate-prop-#{$name} { rotate: #{$deg}deg; }
120
+ }
121
+ .rotate-prop-x-180 { rotate: x 180deg; }
122
+ .rotate-prop-y-180 { rotate: y 180deg; }
123
+
124
+ /* Transform box — reference box for transform-origin (SVG) */
125
+ .transform-box-content { transform-box: content-box; }
126
+ .transform-box-border { transform-box: border-box; }
127
+ .transform-box-fill { transform-box: fill-box; }
128
+ .transform-box-stroke { transform-box: stroke-box; }
129
+ .transform-box-view { transform-box: view-box; }
130
+
131
+ /* Timeline longhands */
132
+ .animate-range-start-entry { animation-range-start: entry; }
133
+ .animate-range-start-contain { animation-range-start: contain; }
134
+ .animate-range-end-exit { animation-range-end: exit; }
135
+ .animate-range-end-contain { animation-range-end: contain; }
136
+ .scroll-timeline-axis-block { scroll-timeline-axis: block; }
137
+ .scroll-timeline-axis-inline { scroll-timeline-axis: inline; }
138
+ .scroll-timeline-name-oc { scroll-timeline-name: --oc-timeline; }
139
+ .view-timeline-axis-block { view-timeline-axis: block; }
140
+ .view-timeline-axis-inline { view-timeline-axis: inline; }
141
+ .view-timeline-name-oc { view-timeline-name: --oc-timeline; }
142
+ .view-timeline-inset-auto { view-timeline-inset: auto; }
143
+ .view-timeline-inset-10 { view-timeline-inset: 10%; }