@birdycom/omniacss 0.0.0-stage → 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 (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -3
  3. package/dist/oc-colors.css +4429 -0
  4. package/dist/oc-theme.css +69 -0
  5. package/dist/omnia.css +465436 -0
  6. package/dist/omnia.min.css +2 -0
  7. package/dist/omnia.starter.css +13461 -0
  8. package/dist/omnia.starter.min.css +1 -0
  9. package/dist/tokens/omnia.dtcg.json +1496 -0
  10. package/dist/tokens/omnia.tokens.json +580 -0
  11. package/dist/tokens/omnia_tokens.py +189 -0
  12. package/package.json +63 -6
  13. package/scss/base/_reset.scss +88 -0
  14. package/scss/config/omniacss.config.scss +114 -0
  15. package/scss/config/omniacss.fonts.scss +34 -0
  16. package/scss/functions/_functions.scss +407 -0
  17. package/scss/json/html-colors.json +1998 -0
  18. package/scss/json/omnia-colors.json +500 -0
  19. package/scss/json/ral-colors.json +3430 -0
  20. package/scss/layout/_media_query.scss +18 -0
  21. package/scss/omnia_colors.scss +7 -0
  22. package/scss/omnia_main.scss +143 -0
  23. package/scss/profiles/omnia_main.hsl.scss +12 -0
  24. package/scss/profiles/omnia_main.oklab.scss +12 -0
  25. package/scss/profiles/omnia_main.oklch.scss +12 -0
  26. package/scss/utilities/_accessibility.scss +42 -0
  27. package/scss/utilities/_alignment.scss +861 -0
  28. package/scss/utilities/_anchor_positioning.scss +65 -0
  29. package/scss/utilities/_animation_properties.scss +143 -0
  30. package/scss/utilities/_aspect.scss +73 -0
  31. package/scss/utilities/_backgrounds.scss +49 -0
  32. package/scss/utilities/_borders_extended.scss +97 -0
  33. package/scss/utilities/_borders_outlines.scss +161 -0
  34. package/scss/utilities/_clamp.scss +111 -0
  35. package/scss/utilities/_colors_html.scss +341 -0
  36. package/scss/utilities/_colors_mix.scss +84 -0
  37. package/scss/utilities/_colors_omnia.scss +315 -0
  38. package/scss/utilities/_colors_ral.scss +151 -0
  39. package/scss/utilities/_colors_tokens.scss +87 -0
  40. package/scss/utilities/_container.scss +58 -0
  41. package/scss/utilities/_containment.scss +82 -0
  42. package/scss/utilities/_corner_shape.scss +30 -0
  43. package/scss/utilities/_css_functions.scss +34 -0
  44. package/scss/utilities/_dark_mode.scss +117 -0
  45. package/scss/utilities/_display.scss +58 -0
  46. package/scss/utilities/_drop_shadow_colors.scss +26 -0
  47. package/scss/utilities/_effects.scss +50 -0
  48. package/scss/utilities/_effects_advanced.scss +102 -0
  49. package/scss/utilities/_experimental_css.scss +149 -0
  50. package/scss/utilities/_filters.scss +89 -0
  51. package/scss/utilities/_flexbox.scss +318 -0
  52. package/scss/utilities/_font_variants.scss +139 -0
  53. package/scss/utilities/_fonts.scss +276 -0
  54. package/scss/utilities/_gap.scss +104 -0
  55. package/scss/utilities/_gradient_stops.scss +48 -0
  56. package/scss/utilities/_gradients.scss +99 -0
  57. package/scss/utilities/_grid.scss +673 -0
  58. package/scss/utilities/_index.scss +22 -0
  59. package/scss/utilities/_interactivity.scss +198 -0
  60. package/scss/utilities/_layering.scss +24 -0
  61. package/scss/utilities/_layout_extras.scss +171 -0
  62. package/scss/utilities/_layout_flow.scss +210 -0
  63. package/scss/utilities/_mask_extras.scss +62 -0
  64. package/scss/utilities/_motion_transforms.scss +167 -0
  65. package/scss/utilities/_overflow.scss +41 -0
  66. package/scss/utilities/_position.scss +49 -0
  67. package/scss/utilities/_responsive.scss +272 -0
  68. package/scss/utilities/_scroll_animations.scss +80 -0
  69. package/scss/utilities/_scroll_spacing.scss +33 -0
  70. package/scss/utilities/_scrollbar.scss +50 -0
  71. package/scss/utilities/_shadow_tokens.scss +21 -0
  72. package/scss/utilities/_shapes.scss +72 -0
  73. package/scss/utilities/_sizing.scss +458 -0
  74. package/scss/utilities/_sizing_logical.scss +99 -0
  75. package/scss/utilities/_space_divide.scss +85 -0
  76. package/scss/utilities/_spacing_margin.scss +199 -0
  77. package/scss/utilities/_spacing_padding.scss +195 -0
  78. package/scss/utilities/_starting_style.scss +53 -0
  79. package/scss/utilities/_state_variants.scss +196 -0
  80. package/scss/utilities/_svg.scss +100 -0
  81. package/scss/utilities/_table.scss +46 -0
  82. package/scss/utilities/_table_advanced.scss +19 -0
  83. package/scss/utilities/_text.scss +1331 -0
  84. package/scss/utilities/_transforms_3d.scss +76 -0
  85. package/scss/utilities/_typography_advanced.scss +124 -0
  86. package/scss/utilities/_typography_modern.scss +83 -0
  87. package/scss/utilities/_view_transitions.scss +64 -0
  88. package/scss/utilities/_writing_modes.scss +72 -0
  89. package/scss/variables/_color_tone.scss +39 -0
  90. package/scss/variables/_hulp.scss +108 -0
  91. package/scss/variables/_mixins.scss +40 -0
  92. package/scss/variables/_modifiers.scss +32 -0
  93. package/scss/variables/_variables.scss +302 -0
  94. package/scss/variables/_variables_colors_html.scss +2019 -0
  95. package/scss/variables/_variables_colors_omnia.scss +465 -0
  96. package/scss/variables/_variables_colors_ral.scss +3472 -0
  97. package/scss/variables/_variables_effects.scss +109 -0
  98. package/scss/variables/_variables_flex_grid.scss +427 -0
  99. package/scss/variables/_variables_layout.scss +591 -0
  100. package/scss/variables/_variables_typography.scss +550 -0
  101. package/src/engine.mjs +258 -0
  102. package/src/postcss.mjs +43 -0
  103. package/src/starter-classes.mjs +124 -0
  104. package/src/tokens.mjs +377 -0
  105. package/src/variants.mjs +278 -0
  106. package/tokens/semantic.json +80 -0
@@ -0,0 +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); }
@@ -0,0 +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%; }
@@ -0,0 +1,73 @@
1
+ // SCSS Document
2
+ // File: src/utilities/_aspect.scss
3
+ // Description: CSS layout properties
4
+ // Copyright: 2021-2022 Birdycom
5
+ // Autor: Serge Cools
6
+ // Version: 0.2.0
7
+ // Framework: OmniaCSS
8
+ // Properties: aspect-ratio
9
+ // Values:
10
+
11
+ @use "sass:string";
12
+ @use '../utilities/' as *;
13
+
14
+ /* The aspect-ratio properties */
15
+
16
+ ///
17
+ /// The aspect-ratio Property
18
+ /// @group aspect
19
+ ///
20
+
21
+ ///
22
+ /// The aspect-ratio property sets the Text decoration.
23
+ /// @group aspect
24
+ /// @name aspect
25
+ /// @link src/scss/utilities/_variables_layout.scss
26
+ /// @since 1.0.0
27
+ /// @author Serge Cools
28
+ ///
29
+ /// Applies to: all elements
30
+ ///
31
+ /// @require {variable} $aspect
32
+ /// @example scss - aspect-ratio class
33
+ /// @each $aspect-prop, $aspect-value in $aspect {
34
+ /// #{".#{$aspect-prop}"}{
35
+ /// aspect-ratio: $aspect-value ;
36
+ /// }
37
+ /// }
38
+ /// @example html - use text decoration line class
39
+ /// <div class="h-100vh">
40
+ /// <div class="output" >
41
+ /// <p>1. <code>aspect-ratio: aspect-auto</code></p>
42
+ /// <section class="h-full text-center">
43
+ /// <img class="aspect-auto w-auto h-full" id="example-element" src="../image/plumeria.jpg" class="transition-all" width="466" height="640">
44
+ /// </section>
45
+ /// </div>
46
+ /// <div class="output" >
47
+ /// <p>2. <code>aspect-ratio: aspect-1 (1/1)</code></p>
48
+ /// <section class="h-full text-center">
49
+ /// <img class="aspect-1 w-auto h-full" id="example-element" src="../image/plumeria.jpg" class="transition-all" width="466" height="640">
50
+ /// </section>
51
+ /// </div>
52
+ /// <div class="output" >
53
+ /// <p>3. <code>aspect-ratio: aspect-16 (16/9)</code></p>
54
+ /// <section class="h-full text-center">
55
+ /// <img class="aspect-16 w-auto h-full" id="example-element" src="../image/plumeria.jpg" class="transition-all" width="466" height="640">
56
+ /// </section>
57
+ /// </div>
58
+ /// <div class="output" >
59
+ /// <p>4. <code>aspect-ratio: aspect-21 (21/9)</code></p>
60
+ /// <section class="h-full text-center">
61
+ /// <img class="aspect-21 w-auto h-full" id="example-element" src="../image/plumeria.jpg" class="transition-all" width="466" height="640">
62
+ /// </section>
63
+ /// </div>
64
+ /// </div>
65
+ @each $aspect-prop, $aspect-value in $aspect {
66
+
67
+ #{".#{$aspect-prop}"}{
68
+
69
+ aspect-ratio: string.unquote($aspect-value) ;
70
+
71
+ }
72
+ }
73
+ /* End The aspect-ratio properties */
@@ -0,0 +1,49 @@
1
+ // SCSS Document
2
+ // File: src/scss/utilities/_backgrounds.scss
3
+ // Map: attachment -> clip -> image -> origin -> position -> repeat -> size
4
+
5
+ /* Background attachment */
6
+ .bg-fixed { background-attachment: fixed; }
7
+ .bg-local { background-attachment: local; }
8
+ .bg-scroll { background-attachment: scroll; }
9
+
10
+ /* Background clip */
11
+ .bg-clip-border { background-clip: border-box; }
12
+ .bg-clip-padding { background-clip: padding-box; }
13
+ .bg-clip-content { background-clip: content-box; }
14
+ .bg-clip-text { -webkit-background-clip: text; background-clip: text; }
15
+
16
+ /* Background image */
17
+ .bg-image-none { background-image: none; }
18
+ .bg-image-gradient-to-r { background-image: linear-gradient(to right, var(--color-vividblue-60), var(--color-vividblue-90)); }
19
+ .bg-image-gradient-to-b { background-image: linear-gradient(to bottom, var(--color-vividblue-60), var(--color-vividblue-90)); }
20
+ .bg-image-radial { background-image: radial-gradient(circle, var(--color-vividblue-60), var(--color-vividblue-95)); }
21
+
22
+ /* Background origin */
23
+ .bg-origin-border { background-origin: border-box; }
24
+ .bg-origin-padding { background-origin: padding-box; }
25
+ .bg-origin-content { background-origin: content-box; }
26
+
27
+ /* Background position */
28
+ .bg-pos-center { background-position: center; }
29
+ .bg-pos-top { background-position: top; }
30
+ .bg-pos-bottom { background-position: bottom; }
31
+ .bg-pos-left { background-position: left; }
32
+ .bg-pos-right { background-position: right; }
33
+ .bg-pos-left-top { background-position: left top; }
34
+ .bg-pos-left-bottom { background-position: left bottom; }
35
+ .bg-pos-right-top { background-position: right top; }
36
+ .bg-pos-right-bottom { background-position: right bottom; }
37
+
38
+ /* Background repeat */
39
+ .bg-repeat { background-repeat: repeat; }
40
+ .bg-no-repeat { background-repeat: no-repeat; }
41
+ .bg-repeat-x { background-repeat: repeat-x; }
42
+ .bg-repeat-y { background-repeat: repeat-y; }
43
+ .bg-repeat-round { background-repeat: round; }
44
+ .bg-repeat-space { background-repeat: space; }
45
+
46
+ /* Background size */
47
+ .bg-size-auto { background-size: auto; }
48
+ .bg-cover { background-size: cover; }
49
+ .bg-contain { background-size: contain; }
@@ -0,0 +1,97 @@
1
+ // SCSS Document
2
+ // File: src/scss/utilities/_borders_extended.scss
3
+ // Description: Per-side border style/color, axis borders, logical borders, logical radius and border-image.
4
+ // Copyright: 2021-2026 Birdycom
5
+ // Author: Serge Cools
6
+ // Version: 0.3.0
7
+ // Framework: OmniaCSS
8
+ // Purpose: Complements _borders_outlines.scss (.border-t*, .round-tl*): adds what was still missing.
9
+ // Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/border-image
10
+ // Map: per-side style -> per-side color -> axis widths -> logical widths -> logical radius -> border-image
11
+
12
+ $_sides: ('t': top, 'r': right, 'b': bottom, 'l': left);
13
+ $_styles: (solid, dashed, dotted, double, none);
14
+
15
+ /* Per-side border style */
16
+ @each $key, $side in $_sides {
17
+ @each $style in $_styles {
18
+ .border-#{$key}-#{$style} { border-#{$side}-style: $style; }
19
+ }
20
+ }
21
+
22
+ /* Per-side border color (combine with a color utility on the element for the rest) */
23
+ @each $key, $side in $_sides {
24
+ .border-#{$key}-current { border-#{$side}-color: currentcolor; }
25
+ .border-#{$key}-transparent { border-#{$side}-color: transparent; }
26
+ }
27
+
28
+ /* Axis borders: x = left + right, y = top + bottom */
29
+ @each $w in (0, 1, 2, 4, 8) {
30
+ .border-x-#{$w} { border-left-width: #{$w}px; border-right-width: #{$w}px; }
31
+ .border-y-#{$w} { border-top-width: #{$w}px; border-bottom-width: #{$w}px; }
32
+ }
33
+
34
+ /* Logical borders — follow writing direction (s = inline-start, e = inline-end, bs/be = block) */
35
+ @each $w in (0, 1, 2, 4) {
36
+ .border-s-#{$w} { border-inline-start-width: #{$w}px; }
37
+ .border-e-#{$w} { border-inline-end-width: #{$w}px; }
38
+ .border-bs-#{$w} { border-block-start-width: #{$w}px; }
39
+ .border-be-#{$w} { border-block-end-width: #{$w}px; }
40
+ .border-inline-#{$w} { border-inline-width: #{$w}px; }
41
+ .border-block-#{$w} { border-block-width: #{$w}px; }
42
+ }
43
+ .border-inline-solid { border-inline-style: solid; }
44
+ .border-block-solid { border-block-style: solid; }
45
+ .border-inline-current { border-inline-color: currentcolor; }
46
+ .border-block-current { border-block-color: currentcolor; }
47
+
48
+ /* Logical border radius — ss = start-start, se = start-end, es = end-start, ee = end-end */
49
+ @each $key, $prop in ('ss': start-start, 'se': start-end, 'es': end-start, 'ee': end-end) {
50
+ @each $r, $v in ('none': 0, 'sm': 0.25rem, 'md': 0.5rem, 'lg': 1rem, 'full': 9999px) {
51
+ .round-#{$key}-#{$r} { border-#{$prop}-radius: $v; }
52
+ }
53
+ }
54
+
55
+ /* Border image */
56
+ .border-image-none { border-image: none; }
57
+ .border-image-gradient {
58
+ border-image-source: linear-gradient(var(--oc-border-image-angle, 135deg), var(--oc-gradient-from, currentcolor), var(--oc-gradient-to, transparent));
59
+ border-image-slice: 1;
60
+ }
61
+ .border-image-stripes {
62
+ border-image-source: repeating-linear-gradient(45deg, var(--oc-gradient-from, currentcolor) 0 6px, var(--oc-gradient-to, transparent) 6px 12px);
63
+ border-image-slice: 1;
64
+ }
65
+ .border-image-slice-1 { border-image-slice: 1; }
66
+ .border-image-slice-fill { border-image-slice: 1 fill; }
67
+ .border-image-repeat-stretch { border-image-repeat: stretch; }
68
+ .border-image-repeat-repeat { border-image-repeat: repeat; }
69
+ .border-image-repeat-round { border-image-repeat: round; }
70
+ .border-image-repeat-space { border-image-repeat: space; }
71
+ .border-image-width-1 { border-image-width: 1; }
72
+ .border-image-width-auto { border-image-width: auto; }
73
+ .border-image-outset-0 { border-image-outset: 0; }
74
+ .border-image-outset-1 { border-image-outset: 0.25rem; }
75
+ .border-image-outset-2 { border-image-outset: 0.5rem; }
76
+
77
+ /* Side shorthands — a 1px solid line in the current color on one side */
78
+ @each $key, $side in $_sides {
79
+ .border-#{$key}-line { border-#{$side}: 1px solid currentcolor; }
80
+ }
81
+
82
+ /* Logical side shorthands, styles and colors */
83
+ @each $key, $side in ('s': inline-start, 'e': inline-end, 'bs': block-start, 'be': block-end) {
84
+ .border-#{$key}-line { border-#{$side}: 1px solid currentcolor; }
85
+ .border-#{$key}-solid { border-#{$side}-style: solid; }
86
+ .border-#{$key}-dashed { border-#{$side}-style: dashed; }
87
+ .border-#{$key}-current { border-#{$side}-color: currentcolor; }
88
+ }
89
+ .border-inline-line { border-inline: 1px solid currentcolor; }
90
+ .border-block-line { border-block: 1px solid currentcolor; }
91
+
92
+ /* Per-corner radius (longhands) */
93
+ @each $key, $corner in ('tl': top-left, 'tr': top-right, 'bl': bottom-left, 'br': bottom-right) {
94
+ @each $r, $v in ('none': 0, 'sm': 0.25rem, 'md': 0.5rem, 'lg': 1rem, 'full': 9999px) {
95
+ .radius-#{$key}-#{$r} { border-#{$corner}-radius: $v; }
96
+ }
97
+ }
@@ -0,0 +1,161 @@
1
+ // SCSS Document
2
+ // File: src/scss/utilities/_borders_outlines.scss
3
+ // Description: Border radius, border width/style/color, outline width/style/color/offset.
4
+ // Copyright: 2021-2026 Birdycom
5
+ // Author: Serge Cools
6
+ // Version: 0.2.0
7
+ // Framework: OmniaCSS
8
+ // Properties: border-radius, border-width, border-style, border-color, outline-width, outline-style, outline-color, outline-offset.
9
+ // Values: from $roundsizes, $bordersizes, $borderstyles, $bordercolors (neutrals), $outlinesizes, $outlinestyles, $outlinecolors (neutrals), $outlineoffsets in _variables_layout.scss; palette border/outline colors from $omnia-colors, $html-colors, $ral-colors (var(--color-*) from oc-colors.css).
10
+
11
+ @use "sass:string";
12
+ @use "sass:map";
13
+ @use "sass:list";
14
+ @use '../utilities/' as *;
15
+
16
+ /* ===================================================================
17
+ BORDERS & OUTLINES
18
+ Generated from variable maps (same structure as $bordersizes).
19
+ Source: src/scss/variables/_variables_layout.scss
20
+ =================================================================== */
21
+
22
+ ///
23
+ /// Border radius, border width/style/color, outline utilities.
24
+ /// @group BordersOutlines
25
+ /// @name bordersoutlines
26
+ /// @link src/scss/utilities/_borders_outlines.scss
27
+ /// @since 0.2.0
28
+ /// @author Serge Cools
29
+ /// @require {variable} $roundsizes
30
+ /// @require {variable} $bordersizes
31
+ /// @require {variable} $borderstyles
32
+ /// @require {variable} $bordercolors
33
+ /// @require {variable} $outlinesizes
34
+ /// @require {variable} $outlinestyles
35
+ /// @require {variable} $outlinecolors
36
+ /// @require {variable} $outlineoffsets
37
+ /// @example scss - rounded from $roundsizes
38
+ /// @each $key, $val in $roundsizes { .rounded-#{string.slice($key, 7)} { border-radius: $val; } }
39
+ /// @example html
40
+ /// <div class="rounded-lg border-2 border-solid border-red-500 outline-2 outline-offset-2">...</div>
41
+ ///
42
+
43
+ /* Border radius — from $roundsizes; class prefix .rounded- (round-* → rounded-*) */
44
+ @each $key, $val in $roundsizes {
45
+ .#{$key} {
46
+ border-radius: $val;
47
+ }
48
+ }
49
+
50
+ /* Border width — from $bordersizes; class = key (e.g. .border-none, .border-1, .border-t1) */
51
+ @each $key, $val in $bordersizes {
52
+ .#{$key} {
53
+ border-width: $val;
54
+ }
55
+ }
56
+
57
+ /* Divider — from $dividersizes; border between direct children (flex/grid). Uses :not(:last-child) with border-bottom (h) or border-inline-end (v). */
58
+ @each $key, $val in $dividersizes {
59
+ @if string.index($key, "divider-h") {
60
+ .#{$key} > :not(:last-child) {
61
+ border-top-width: 0;
62
+ border-bottom-width: $val;
63
+ }
64
+ } @else {
65
+ .#{$key} > :not(:last-child) {
66
+ border-inline-start-width: 0;
67
+ border-inline-end-width: $val;
68
+ }
69
+ }
70
+ }
71
+
72
+ /* Border style — from $borderstyles */
73
+ @each $key, $val in $borderstyles {
74
+ .#{$key} {
75
+ border-style: $val;
76
+ }
77
+ }
78
+
79
+ /* Border color — neutrals from $bordercolors; palette from Omnia/HTML (var) and RAL */
80
+ @each $key, $val in $bordercolors {
81
+ .#{$key} {
82
+ border-color: $val;
83
+ }
84
+ }
85
+
86
+ /* Border/outline color — Omnia & HTML palettes (var(--color-{name}-{step}), same as .bg-* / .text-*) */
87
+ @mixin _border-outline-from-palette($color-map) {
88
+ @each $colors-prop, $colors-value in $color-map {
89
+ @each $main-prop, $main-value in $colors-value {
90
+ @each $colorname-prop, $colorname-value in $main-value {
91
+ $hex: map.get($colorname-value, hex);
92
+ @if $hex {
93
+ $name: string.to-lower-case(#{$colorname-prop});
94
+ @each $opacitycolor-prop, $opacitycolor-value in $opacitycolor {
95
+ $step: list.nth($opacitycolor-value, 1);
96
+ .border-#{$name}-#{$step} {
97
+ border-color: var(--color-#{$name}-#{$step});
98
+ }
99
+ .outline-#{$name}-#{$step} {
100
+ outline-color: var(--color-#{$name}-#{$step});
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ @include _border-outline-from-palette($omnia-colors);
109
+ @include _border-outline-from-palette($html-colors);
110
+
111
+ /* Border/outline color — RAL palette (single token --color-{name} from oc-colors.css) */
112
+ @each $colorsral-prop, $colorsral-value in $ral-colors {
113
+ @each $maincolorsral-prop, $maincolorsral-value in $colorsral-value {
114
+ @each $colorname-prop, $colorname-value in $maincolorsral-value {
115
+ $name: string.to-lower-case(#{$colorname-prop});
116
+ .border-#{$name} {
117
+ border-color: var(--color-#{$name});
118
+ }
119
+ .outline-#{$name} {
120
+ outline-color: var(--color-#{$name});
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ /* Outline width — from $outlinesizes (same structure as $bordersizes) */
127
+ @each $key, $val in $outlinesizes {
128
+ .#{$key} {
129
+ outline-width: $val;
130
+ }
131
+ }
132
+
133
+ /* Outline style — from $outlinestyles; .outline-hidden uses full outline for a11y (visible on focus, invisible by default) */
134
+ @each $key, $val in $outlinestyles {
135
+ @if $key == "outline-hidden" {
136
+ .outline-hidden {
137
+ outline: 2px solid transparent;
138
+ outline-offset: 2px;
139
+ }
140
+ } @else {
141
+ .#{$key} {
142
+ outline-style: $val;
143
+ }
144
+ }
145
+ }
146
+
147
+ /* Outline color — neutrals from $outlinecolors (palette classes generated above) */
148
+ @each $key, $val in $outlinecolors {
149
+ .#{$key} {
150
+ outline-color: $val;
151
+ }
152
+ }
153
+
154
+ /* Outline offset — from $outlineoffsets (same structure as $bordersizes) */
155
+ @each $key, $val in $outlineoffsets {
156
+ .#{$key} {
157
+ outline-offset: $val;
158
+ }
159
+ }
160
+
161
+ /* End Borders & Outlines */