@birdycom/omniacss 0.11.0 → 0.11.1

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 (47) 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/tokens/omnia.dtcg.json +2 -2
  8. package/dist/tokens/omnia.tokens.json +1 -1
  9. package/dist/tokens/omnia_tokens.py +2 -2
  10. package/package.json +63 -63
  11. package/scss/utilities/_anchor_positioning.scss +65 -65
  12. package/scss/utilities/_animation_properties.scss +143 -143
  13. package/scss/utilities/_borders_extended.scss +97 -97
  14. package/scss/utilities/_borders_outlines.scss +161 -161
  15. package/scss/utilities/_containment.scss +82 -82
  16. package/scss/utilities/_css_functions.scss +34 -34
  17. package/scss/utilities/_dark_mode.scss +117 -117
  18. package/scss/utilities/_drop_shadow_colors.scss +26 -26
  19. package/scss/utilities/_experimental_css.scss +149 -149
  20. package/scss/utilities/_flexbox.scss +317 -317
  21. package/scss/utilities/_font_variants.scss +139 -139
  22. package/scss/utilities/_gap.scss +103 -103
  23. package/scss/utilities/_gradient_stops.scss +48 -48
  24. package/scss/utilities/_grid.scss +672 -672
  25. package/scss/utilities/_layout_extras.scss +171 -171
  26. package/scss/utilities/_layout_flow.scss +210 -210
  27. package/scss/utilities/_mask_extras.scss +62 -62
  28. package/scss/utilities/_motion_transforms.scss +167 -167
  29. package/scss/utilities/_scroll_animations.scss +80 -80
  30. package/scss/utilities/_scrollbar.scss +2 -1
  31. package/scss/utilities/_shadow_tokens.scss +21 -21
  32. package/scss/utilities/_shapes.scss +72 -72
  33. package/scss/utilities/_sizing_logical.scss +99 -99
  34. package/scss/utilities/_starting_style.scss +53 -53
  35. package/scss/utilities/_state_variants.scss +196 -196
  36. package/scss/utilities/_svg.scss +100 -100
  37. package/scss/utilities/_table_advanced.scss +19 -19
  38. package/scss/utilities/_typography_advanced.scss +124 -124
  39. package/scss/utilities/_typography_modern.scss +83 -83
  40. package/scss/utilities/_view_transitions.scss +64 -64
  41. package/scss/utilities/_writing_modes.scss +72 -72
  42. package/scss/variables/_hulp.scss +107 -107
  43. package/scss/variables/_variables_effects.scss +108 -108
  44. package/src/postcss.mjs +43 -43
  45. package/src/tokens.mjs +377 -377
  46. package/src/variants.mjs +278 -278
  47. package/tokens/semantic.json +80 -80
@@ -13097,6 +13097,8 @@ select {
13097
13097
  /* OmniaCSS scrollbar: thin, Omnia-blue thumb on a transparent track, follows light/dark.
13098
13098
  scrollbar-color is inherited, so one class on <html> themes every scroll area of the page. */
13099
13099
 
13100
+ /* :has(:hover) keeps it while the pointer is over a popover or dialog (top layer), where <html> itself is not :hover. */
13101
+
13100
13102
  /* Starting style — values used before the element's first style update */
13101
13103
 
13102
13104
  /* Transition behavior — allow transitions on discrete properties (display, overlay, content-visibility) */
@@ -1,8 +1,8 @@
1
1
  {
2
- "$description": "OmniaCSS 0.11.0 semantic tokens (generated by npx omniacss tokens --format dtcg)",
2
+ "$description": "OmniaCSS 0.11.1 semantic tokens (generated by npx omniacss tokens --format dtcg)",
3
3
  "$extensions": {
4
4
  "com.birdycom.omniacss": {
5
- "version": "0.11.0",
5
+ "version": "0.11.1",
6
6
  "modes": [
7
7
  "light",
8
8
  "dark"
@@ -1,5 +1,5 @@
1
1
  {
2
- "omniacss": "0.11.0",
2
+ "omniacss": "0.11.1",
3
3
  "generated": "npx omniacss tokens",
4
4
  "modes": [
5
5
  "light",
@@ -1,11 +1,11 @@
1
- # omnia_tokens.py — OmniaCSS 0.11.0 semantic tokens for non-web apps (Tkinter, Qt, ...).
1
+ # omnia_tokens.py — OmniaCSS 0.11.1 semantic tokens for non-web apps (Tkinter, Qt, ...).
2
2
  # Generated by: npx omniacss tokens --format python (do not edit; regenerate after an OmniaCSS update)
3
3
  # Map: OMNIACSS_VERSION -> PALETTES (hex per mode) -> ALPHA -> OKLCH -> SIZES/TEXT -> FONTS -> SHADOWS -> font()
4
4
  #
5
5
  # Colors are resolved from light-dark(var(--color-...)) and gamut mapped to sRGB the CSS Color 4 way.
6
6
  # Tokens with transparency (see ALPHA) are pre-blended over "background" in PALETTES.
7
7
 
8
- OMNIACSS_VERSION = "0.11.0"
8
+ OMNIACSS_VERSION = "0.11.1"
9
9
 
10
10
  PALETTES = {
11
11
  "light": {
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.1",
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%; }