@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.
- package/LICENSE +21 -21
- package/README.md +44 -44
- package/dist/oc-theme.css +1 -1
- package/dist/omnia.css +2 -1
- package/dist/omnia.min.css +1 -1
- package/dist/omnia.starter.css +2 -0
- package/dist/tokens/omnia.dtcg.json +2 -2
- package/dist/tokens/omnia.tokens.json +1 -1
- package/dist/tokens/omnia_tokens.py +2 -2
- package/package.json +63 -63
- package/scss/utilities/_anchor_positioning.scss +65 -65
- package/scss/utilities/_animation_properties.scss +143 -143
- package/scss/utilities/_borders_extended.scss +97 -97
- package/scss/utilities/_borders_outlines.scss +161 -161
- package/scss/utilities/_containment.scss +82 -82
- package/scss/utilities/_css_functions.scss +34 -34
- package/scss/utilities/_dark_mode.scss +117 -117
- package/scss/utilities/_drop_shadow_colors.scss +26 -26
- package/scss/utilities/_experimental_css.scss +149 -149
- package/scss/utilities/_flexbox.scss +317 -317
- package/scss/utilities/_font_variants.scss +139 -139
- package/scss/utilities/_gap.scss +103 -103
- package/scss/utilities/_gradient_stops.scss +48 -48
- package/scss/utilities/_grid.scss +672 -672
- package/scss/utilities/_layout_extras.scss +171 -171
- package/scss/utilities/_layout_flow.scss +210 -210
- package/scss/utilities/_mask_extras.scss +62 -62
- package/scss/utilities/_motion_transforms.scss +167 -167
- package/scss/utilities/_scroll_animations.scss +80 -80
- package/scss/utilities/_scrollbar.scss +2 -1
- package/scss/utilities/_shadow_tokens.scss +21 -21
- package/scss/utilities/_shapes.scss +72 -72
- package/scss/utilities/_sizing_logical.scss +99 -99
- package/scss/utilities/_starting_style.scss +53 -53
- package/scss/utilities/_state_variants.scss +196 -196
- package/scss/utilities/_svg.scss +100 -100
- package/scss/utilities/_table_advanced.scss +19 -19
- package/scss/utilities/_typography_advanced.scss +124 -124
- package/scss/utilities/_typography_modern.scss +83 -83
- package/scss/utilities/_view_transitions.scss +64 -64
- package/scss/utilities/_writing_modes.scss +72 -72
- package/scss/variables/_hulp.scss +107 -107
- package/scss/variables/_variables_effects.scss +108 -108
- package/src/postcss.mjs +43 -43
- package/src/tokens.mjs +377 -377
- package/src/variants.mjs +278 -278
- package/tokens/semantic.json +80 -80
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
// SCSS Document
|
|
2
|
-
// File: src/scss/utilities/_shapes.scss
|
|
3
|
-
// Description: clip-path, shape-outside and shape-margin utilities (CSS Shapes / CSS Masking).
|
|
4
|
-
// Copyright: 2021-2026 Birdycom
|
|
5
|
-
// Author: Serge Cools
|
|
6
|
-
// Version: 0.3.0
|
|
7
|
-
// Framework: OmniaCSS
|
|
8
|
-
// Purpose: Generate .clip-* classes (geometric clip paths) and .shape-* classes (text wrap around floats).
|
|
9
|
-
// Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/clip-path
|
|
10
|
-
// Note: shape-outside only has effect on floated elements (e.g. use with .float-left).
|
|
11
|
-
// Map: clip-path basic shapes -> polygons -> shape() -> clip border -> shape-outside -> shape-margin
|
|
12
|
-
|
|
13
|
-
/* Clip path — basic shapes */
|
|
14
|
-
.clip-none { clip-path: none; }
|
|
15
|
-
.clip-circle { clip-path: circle(50%); }
|
|
16
|
-
.clip-ellipse { clip-path: ellipse(50% 40%); }
|
|
17
|
-
.clip-inset-4 { clip-path: inset(4px); }
|
|
18
|
-
.clip-inset-8 { clip-path: inset(8px round 8px); }
|
|
19
|
-
|
|
20
|
-
/* Clip path — polygons */
|
|
21
|
-
.clip-polygon-triangle { clip-path: polygon(50% 0%, 0% 100%, 100% 100%); }
|
|
22
|
-
.clip-polygon-diamond { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }
|
|
23
|
-
.clip-polygon-pentagon { clip-path: polygon(50% 0%, 100% 38%, 82% 100%, 18% 100%, 0% 38%); }
|
|
24
|
-
.clip-polygon-hexagon { clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%); }
|
|
25
|
-
.clip-polygon-arrow-right { clip-path: polygon(0% 20%, 60% 20%, 60% 0%, 100% 50%, 60% 100%, 60% 80%, 0% 80%); }
|
|
26
|
-
.clip-polygon-chevron { clip-path: polygon(75% 0%, 100% 50%, 75% 100%, 0% 100%, 25% 50%, 0% 0%); }
|
|
27
|
-
|
|
28
|
-
/* Clip path — shape() function (CSS Shapes Level 2, responsive curves) */
|
|
29
|
-
.clip-shape-wave {
|
|
30
|
-
clip-path: shape(from 0% 0%, line to 100% 0%, line to 100% 85%, curve to 0% 85% with 50% 115%, close);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/* Clip path — reference box */
|
|
34
|
-
.clip-border-box { clip-path: border-box; }
|
|
35
|
-
.clip-padding-box { clip-path: padding-box; }
|
|
36
|
-
.clip-content-box { clip-path: content-box; }
|
|
37
|
-
|
|
38
|
-
/* Clip border — a border that follows the clip-path of the child element.
|
|
39
|
-
A normal border/outline is clipped away by clip-path, so put .clip-border-* on a wrapper.
|
|
40
|
-
Color = currentcolor of the wrapper (e.g. .text-dodgerblue-20); the clipped child needs an opaque background. */
|
|
41
|
-
.clip-border,
|
|
42
|
-
.clip-border-2,
|
|
43
|
-
.clip-border-4 {
|
|
44
|
-
--oc-clip-border-color: currentcolor;
|
|
45
|
-
}
|
|
46
|
-
.clip-border {
|
|
47
|
-
filter: drop-shadow(1px 0 0 var(--oc-clip-border-color)) drop-shadow(-1px 0 0 var(--oc-clip-border-color))
|
|
48
|
-
drop-shadow(0 1px 0 var(--oc-clip-border-color)) drop-shadow(0 -1px 0 var(--oc-clip-border-color));
|
|
49
|
-
}
|
|
50
|
-
.clip-border-2 {
|
|
51
|
-
filter: drop-shadow(2px 0 0 var(--oc-clip-border-color)) drop-shadow(-2px 0 0 var(--oc-clip-border-color))
|
|
52
|
-
drop-shadow(0 2px 0 var(--oc-clip-border-color)) drop-shadow(0 -2px 0 var(--oc-clip-border-color));
|
|
53
|
-
}
|
|
54
|
-
.clip-border-4 {
|
|
55
|
-
filter: drop-shadow(4px 0 0 var(--oc-clip-border-color)) drop-shadow(-4px 0 0 var(--oc-clip-border-color))
|
|
56
|
-
drop-shadow(0 4px 0 var(--oc-clip-border-color)) drop-shadow(0 -4px 0 var(--oc-clip-border-color));
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/* Shape outside — wrap inline content around a float */
|
|
60
|
-
.shape-none { shape-outside: none; }
|
|
61
|
-
.shape-circle { shape-outside: circle(50%); }
|
|
62
|
-
.shape-ellipse { shape-outside: ellipse(50% 40%); }
|
|
63
|
-
.shape-margin-box { shape-outside: margin-box; }
|
|
64
|
-
.shape-border-box { shape-outside: border-box; }
|
|
65
|
-
.shape-padding-box { shape-outside: padding-box; }
|
|
66
|
-
.shape-content-box { shape-outside: content-box; }
|
|
67
|
-
|
|
68
|
-
/* Shape margin */
|
|
69
|
-
.shape-m-0 { shape-margin: 0; }
|
|
70
|
-
.shape-m-1 { shape-margin: 0.25rem; }
|
|
71
|
-
.shape-m-2 { shape-margin: 0.5rem; }
|
|
72
|
-
.shape-m-4 { shape-margin: 1rem; }
|
|
1
|
+
// SCSS Document
|
|
2
|
+
// File: src/scss/utilities/_shapes.scss
|
|
3
|
+
// Description: clip-path, shape-outside and shape-margin utilities (CSS Shapes / CSS Masking).
|
|
4
|
+
// Copyright: 2021-2026 Birdycom
|
|
5
|
+
// Author: Serge Cools
|
|
6
|
+
// Version: 0.3.0
|
|
7
|
+
// Framework: OmniaCSS
|
|
8
|
+
// Purpose: Generate .clip-* classes (geometric clip paths) and .shape-* classes (text wrap around floats).
|
|
9
|
+
// Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/clip-path
|
|
10
|
+
// Note: shape-outside only has effect on floated elements (e.g. use with .float-left).
|
|
11
|
+
// Map: clip-path basic shapes -> polygons -> shape() -> clip border -> shape-outside -> shape-margin
|
|
12
|
+
|
|
13
|
+
/* Clip path — basic shapes */
|
|
14
|
+
.clip-none { clip-path: none; }
|
|
15
|
+
.clip-circle { clip-path: circle(50%); }
|
|
16
|
+
.clip-ellipse { clip-path: ellipse(50% 40%); }
|
|
17
|
+
.clip-inset-4 { clip-path: inset(4px); }
|
|
18
|
+
.clip-inset-8 { clip-path: inset(8px round 8px); }
|
|
19
|
+
|
|
20
|
+
/* Clip path — polygons */
|
|
21
|
+
.clip-polygon-triangle { clip-path: polygon(50% 0%, 0% 100%, 100% 100%); }
|
|
22
|
+
.clip-polygon-diamond { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }
|
|
23
|
+
.clip-polygon-pentagon { clip-path: polygon(50% 0%, 100% 38%, 82% 100%, 18% 100%, 0% 38%); }
|
|
24
|
+
.clip-polygon-hexagon { clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%); }
|
|
25
|
+
.clip-polygon-arrow-right { clip-path: polygon(0% 20%, 60% 20%, 60% 0%, 100% 50%, 60% 100%, 60% 80%, 0% 80%); }
|
|
26
|
+
.clip-polygon-chevron { clip-path: polygon(75% 0%, 100% 50%, 75% 100%, 0% 100%, 25% 50%, 0% 0%); }
|
|
27
|
+
|
|
28
|
+
/* Clip path — shape() function (CSS Shapes Level 2, responsive curves) */
|
|
29
|
+
.clip-shape-wave {
|
|
30
|
+
clip-path: shape(from 0% 0%, line to 100% 0%, line to 100% 85%, curve to 0% 85% with 50% 115%, close);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Clip path — reference box */
|
|
34
|
+
.clip-border-box { clip-path: border-box; }
|
|
35
|
+
.clip-padding-box { clip-path: padding-box; }
|
|
36
|
+
.clip-content-box { clip-path: content-box; }
|
|
37
|
+
|
|
38
|
+
/* Clip border — a border that follows the clip-path of the child element.
|
|
39
|
+
A normal border/outline is clipped away by clip-path, so put .clip-border-* on a wrapper.
|
|
40
|
+
Color = currentcolor of the wrapper (e.g. .text-dodgerblue-20); the clipped child needs an opaque background. */
|
|
41
|
+
.clip-border,
|
|
42
|
+
.clip-border-2,
|
|
43
|
+
.clip-border-4 {
|
|
44
|
+
--oc-clip-border-color: currentcolor;
|
|
45
|
+
}
|
|
46
|
+
.clip-border {
|
|
47
|
+
filter: drop-shadow(1px 0 0 var(--oc-clip-border-color)) drop-shadow(-1px 0 0 var(--oc-clip-border-color))
|
|
48
|
+
drop-shadow(0 1px 0 var(--oc-clip-border-color)) drop-shadow(0 -1px 0 var(--oc-clip-border-color));
|
|
49
|
+
}
|
|
50
|
+
.clip-border-2 {
|
|
51
|
+
filter: drop-shadow(2px 0 0 var(--oc-clip-border-color)) drop-shadow(-2px 0 0 var(--oc-clip-border-color))
|
|
52
|
+
drop-shadow(0 2px 0 var(--oc-clip-border-color)) drop-shadow(0 -2px 0 var(--oc-clip-border-color));
|
|
53
|
+
}
|
|
54
|
+
.clip-border-4 {
|
|
55
|
+
filter: drop-shadow(4px 0 0 var(--oc-clip-border-color)) drop-shadow(-4px 0 0 var(--oc-clip-border-color))
|
|
56
|
+
drop-shadow(0 4px 0 var(--oc-clip-border-color)) drop-shadow(0 -4px 0 var(--oc-clip-border-color));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Shape outside — wrap inline content around a float */
|
|
60
|
+
.shape-none { shape-outside: none; }
|
|
61
|
+
.shape-circle { shape-outside: circle(50%); }
|
|
62
|
+
.shape-ellipse { shape-outside: ellipse(50% 40%); }
|
|
63
|
+
.shape-margin-box { shape-outside: margin-box; }
|
|
64
|
+
.shape-border-box { shape-outside: border-box; }
|
|
65
|
+
.shape-padding-box { shape-outside: padding-box; }
|
|
66
|
+
.shape-content-box { shape-outside: content-box; }
|
|
67
|
+
|
|
68
|
+
/* Shape margin */
|
|
69
|
+
.shape-m-0 { shape-margin: 0; }
|
|
70
|
+
.shape-m-1 { shape-margin: 0.25rem; }
|
|
71
|
+
.shape-m-2 { shape-margin: 0.5rem; }
|
|
72
|
+
.shape-m-4 { shape-margin: 1rem; }
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
// SCSS Document
|
|
2
|
-
// File: src/scss/utilities/_sizing_logical.scss
|
|
3
|
-
// Description: Size keywords (3xs … 7xl, line-height units) and the logical size scale (inline-size, block-size,
|
|
4
|
-
// min/max in both axes) that complete the width/height families of _sizing.scss and _layout_extras.scss.
|
|
5
|
-
// Copyright: 2021-2026 Birdycom
|
|
6
|
-
// Author: Serge Cools
|
|
7
|
-
// Version: 0.4.0
|
|
8
|
-
// Framework: OmniaCSS
|
|
9
|
-
// Purpose: Generate .w-3xs … .w-7xl, .min-w-3xs …, .max-w-3xs/2xs, .{w,h,size,min-w,min-h,max-w,max-h}-lh/rlh,
|
|
10
|
-
// .inline-size-{n}, .block-size-{n}, .min-inline-size-*, .max-inline-size-*, .min-block-size-*, .max-block-size-*.
|
|
11
|
-
// Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/inline-size
|
|
12
|
-
// Note: Same quarter-rem scale as .size-{n} (size-4 = 1rem), so logical and physical icon/box sizes line up.
|
|
13
|
-
@use "sass:string";
|
|
14
|
-
|
|
15
|
-
// Map: size keywords -> line-height units -> logical scale -> logical min/max
|
|
16
|
-
|
|
17
|
-
$_container-sizes: (
|
|
18
|
-
'3xs': 16rem, '2xs': 18rem, 'xs': 20rem, 'sm': 24rem, 'md': 28rem, 'lg': 32rem, 'xl': 36rem,
|
|
19
|
-
'2xl': 42rem, '3xl': 48rem, '4xl': 56rem, '5xl': 64rem, '6xl': 72rem, '7xl': 80rem
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
/* Size keywords — container-like widths (same values as .max-w-xs … .max-w-7xl) */
|
|
23
|
-
@each $key, $value in $_container-sizes {
|
|
24
|
-
.w-#{$key} { width: $value; }
|
|
25
|
-
.min-w-#{$key} { min-width: $value; }
|
|
26
|
-
.inline-size-#{$key} { inline-size: $value; }
|
|
27
|
-
.min-inline-size-#{$key} { min-inline-size: $value; }
|
|
28
|
-
.max-inline-size-#{$key} { max-inline-size: $value; }
|
|
29
|
-
}
|
|
30
|
-
.max-w-3xs { max-width: 16rem; }
|
|
31
|
-
.max-w-2xs { max-width: 18rem; }
|
|
32
|
-
|
|
33
|
-
/* Line-height units — size a box in lines of text (lh) or root lines (rlh) */
|
|
34
|
-
@each $unit in (lh, rlh) {
|
|
35
|
-
$one: string.unquote("1#{$unit}"); // "1#{$unit}" without quotes would compile to "1 lh"
|
|
36
|
-
.w-#{$unit} { width: $one; }
|
|
37
|
-
.h-#{$unit} { height: $one; }
|
|
38
|
-
.size-#{$unit} { width: $one; height: $one; }
|
|
39
|
-
.min-w-#{$unit} { min-width: $one; }
|
|
40
|
-
.min-h-#{$unit} { min-height: $one; }
|
|
41
|
-
.max-w-#{$unit} { max-width: $one; }
|
|
42
|
-
.max-h-#{$unit} { max-height: $one; }
|
|
43
|
-
.inline-size-#{$unit} { inline-size: $one; }
|
|
44
|
-
.block-size-#{$unit} { block-size: $one; }
|
|
45
|
-
}
|
|
46
|
-
/* Several lines: .h-3lh (exactly three lines), .max-h-5lh (clip after five lines), .min-h-2lh (reserve two lines) */
|
|
47
|
-
@each $n in (2, 3, 4, 5, 6, 8, 10) {
|
|
48
|
-
.h-#{$n}lh { height: #{$n}lh; }
|
|
49
|
-
.min-h-#{$n}lh { min-height: #{$n}lh; }
|
|
50
|
-
.max-h-#{$n}lh { max-height: #{$n}lh; }
|
|
51
|
-
.block-size-#{$n}lh { block-size: #{$n}lh; }
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/* Small / large / dynamic viewport units (svh = toolbars shown, lvh = toolbars hidden, dvh = follows them) */
|
|
55
|
-
.h-svh { height: 100svh; }
|
|
56
|
-
.h-lvh { height: 100lvh; }
|
|
57
|
-
.min-h-svh { min-height: 100svh; }
|
|
58
|
-
.min-h-lvh { min-height: 100lvh; }
|
|
59
|
-
.max-h-svh { max-height: 100svh; }
|
|
60
|
-
.max-h-lvh { max-height: 100lvh; }
|
|
61
|
-
.w-svw { width: 100svw; }
|
|
62
|
-
.w-lvw { width: 100lvw; }
|
|
63
|
-
.min-w-dvw { min-width: 100dvw; }
|
|
64
|
-
.max-w-dvw { max-width: 100dvw; }
|
|
65
|
-
|
|
66
|
-
/* Logical size scale: inline-size-{n} / block-size-{n} (n * 0.25rem) */
|
|
67
|
-
$_logical-scale: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 96);
|
|
68
|
-
@each $n in $_logical-scale {
|
|
69
|
-
$v: #{$n * 0.25}rem;
|
|
70
|
-
@if $n == 0 { $v: 0; }
|
|
71
|
-
.inline-size-#{$n} { inline-size: $v; }
|
|
72
|
-
.block-size-#{$n} { block-size: $v; }
|
|
73
|
-
.min-inline-size-#{$n} { min-inline-size: $v; }
|
|
74
|
-
.min-block-size-#{$n} { min-block-size: $v; }
|
|
75
|
-
.max-inline-size-#{$n} { max-inline-size: $v; }
|
|
76
|
-
.max-block-size-#{$n} { max-block-size: $v; }
|
|
77
|
-
}
|
|
78
|
-
@each $axis in (inline, block) {
|
|
79
|
-
.#{$axis}-size-px { #{$axis}-size: 1px; }
|
|
80
|
-
.min-#{$axis}-size-px { min-#{$axis}-size: 1px; }
|
|
81
|
-
.max-#{$axis}-size-px { max-#{$axis}-size: 1px; }
|
|
82
|
-
.#{$axis}-size-screen { #{$axis}-size: 100v#{string.slice($axis, 1, 1)}; }
|
|
83
|
-
.#{$axis}-size-stretch { #{$axis}-size: stretch; }
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/* Logical min/max keywords with the -size spelling (the shorter .min-inline-* names stay available) */
|
|
87
|
-
@each $k, $v in ('full': 100%, 'fit': fit-content, 'min': min-content, 'max': max-content) {
|
|
88
|
-
.min-inline-size-#{$k} { min-inline-size: $v; }
|
|
89
|
-
.min-block-size-#{$k} { min-block-size: $v; }
|
|
90
|
-
@if $k != 'full' {
|
|
91
|
-
.max-block-size-#{$k} { max-block-size: $v; }
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
.max-block-size-full { max-block-size: 100%; }
|
|
95
|
-
.max-inline-size-none { max-inline-size: none; }
|
|
96
|
-
.max-block-size-none { max-block-size: none; }
|
|
97
|
-
.max-inline-size-fit { max-inline-size: fit-content; }
|
|
98
|
-
.max-inline-size-min { max-inline-size: min-content; }
|
|
99
|
-
.max-inline-size-max { max-inline-size: max-content; }
|
|
1
|
+
// SCSS Document
|
|
2
|
+
// File: src/scss/utilities/_sizing_logical.scss
|
|
3
|
+
// Description: Size keywords (3xs … 7xl, line-height units) and the logical size scale (inline-size, block-size,
|
|
4
|
+
// min/max in both axes) that complete the width/height families of _sizing.scss and _layout_extras.scss.
|
|
5
|
+
// Copyright: 2021-2026 Birdycom
|
|
6
|
+
// Author: Serge Cools
|
|
7
|
+
// Version: 0.4.0
|
|
8
|
+
// Framework: OmniaCSS
|
|
9
|
+
// Purpose: Generate .w-3xs … .w-7xl, .min-w-3xs …, .max-w-3xs/2xs, .{w,h,size,min-w,min-h,max-w,max-h}-lh/rlh,
|
|
10
|
+
// .inline-size-{n}, .block-size-{n}, .min-inline-size-*, .max-inline-size-*, .min-block-size-*, .max-block-size-*.
|
|
11
|
+
// Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/inline-size
|
|
12
|
+
// Note: Same quarter-rem scale as .size-{n} (size-4 = 1rem), so logical and physical icon/box sizes line up.
|
|
13
|
+
@use "sass:string";
|
|
14
|
+
|
|
15
|
+
// Map: size keywords -> line-height units -> logical scale -> logical min/max
|
|
16
|
+
|
|
17
|
+
$_container-sizes: (
|
|
18
|
+
'3xs': 16rem, '2xs': 18rem, 'xs': 20rem, 'sm': 24rem, 'md': 28rem, 'lg': 32rem, 'xl': 36rem,
|
|
19
|
+
'2xl': 42rem, '3xl': 48rem, '4xl': 56rem, '5xl': 64rem, '6xl': 72rem, '7xl': 80rem
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
/* Size keywords — container-like widths (same values as .max-w-xs … .max-w-7xl) */
|
|
23
|
+
@each $key, $value in $_container-sizes {
|
|
24
|
+
.w-#{$key} { width: $value; }
|
|
25
|
+
.min-w-#{$key} { min-width: $value; }
|
|
26
|
+
.inline-size-#{$key} { inline-size: $value; }
|
|
27
|
+
.min-inline-size-#{$key} { min-inline-size: $value; }
|
|
28
|
+
.max-inline-size-#{$key} { max-inline-size: $value; }
|
|
29
|
+
}
|
|
30
|
+
.max-w-3xs { max-width: 16rem; }
|
|
31
|
+
.max-w-2xs { max-width: 18rem; }
|
|
32
|
+
|
|
33
|
+
/* Line-height units — size a box in lines of text (lh) or root lines (rlh) */
|
|
34
|
+
@each $unit in (lh, rlh) {
|
|
35
|
+
$one: string.unquote("1#{$unit}"); // "1#{$unit}" without quotes would compile to "1 lh"
|
|
36
|
+
.w-#{$unit} { width: $one; }
|
|
37
|
+
.h-#{$unit} { height: $one; }
|
|
38
|
+
.size-#{$unit} { width: $one; height: $one; }
|
|
39
|
+
.min-w-#{$unit} { min-width: $one; }
|
|
40
|
+
.min-h-#{$unit} { min-height: $one; }
|
|
41
|
+
.max-w-#{$unit} { max-width: $one; }
|
|
42
|
+
.max-h-#{$unit} { max-height: $one; }
|
|
43
|
+
.inline-size-#{$unit} { inline-size: $one; }
|
|
44
|
+
.block-size-#{$unit} { block-size: $one; }
|
|
45
|
+
}
|
|
46
|
+
/* Several lines: .h-3lh (exactly three lines), .max-h-5lh (clip after five lines), .min-h-2lh (reserve two lines) */
|
|
47
|
+
@each $n in (2, 3, 4, 5, 6, 8, 10) {
|
|
48
|
+
.h-#{$n}lh { height: #{$n}lh; }
|
|
49
|
+
.min-h-#{$n}lh { min-height: #{$n}lh; }
|
|
50
|
+
.max-h-#{$n}lh { max-height: #{$n}lh; }
|
|
51
|
+
.block-size-#{$n}lh { block-size: #{$n}lh; }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Small / large / dynamic viewport units (svh = toolbars shown, lvh = toolbars hidden, dvh = follows them) */
|
|
55
|
+
.h-svh { height: 100svh; }
|
|
56
|
+
.h-lvh { height: 100lvh; }
|
|
57
|
+
.min-h-svh { min-height: 100svh; }
|
|
58
|
+
.min-h-lvh { min-height: 100lvh; }
|
|
59
|
+
.max-h-svh { max-height: 100svh; }
|
|
60
|
+
.max-h-lvh { max-height: 100lvh; }
|
|
61
|
+
.w-svw { width: 100svw; }
|
|
62
|
+
.w-lvw { width: 100lvw; }
|
|
63
|
+
.min-w-dvw { min-width: 100dvw; }
|
|
64
|
+
.max-w-dvw { max-width: 100dvw; }
|
|
65
|
+
|
|
66
|
+
/* Logical size scale: inline-size-{n} / block-size-{n} (n * 0.25rem) */
|
|
67
|
+
$_logical-scale: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 96);
|
|
68
|
+
@each $n in $_logical-scale {
|
|
69
|
+
$v: #{$n * 0.25}rem;
|
|
70
|
+
@if $n == 0 { $v: 0; }
|
|
71
|
+
.inline-size-#{$n} { inline-size: $v; }
|
|
72
|
+
.block-size-#{$n} { block-size: $v; }
|
|
73
|
+
.min-inline-size-#{$n} { min-inline-size: $v; }
|
|
74
|
+
.min-block-size-#{$n} { min-block-size: $v; }
|
|
75
|
+
.max-inline-size-#{$n} { max-inline-size: $v; }
|
|
76
|
+
.max-block-size-#{$n} { max-block-size: $v; }
|
|
77
|
+
}
|
|
78
|
+
@each $axis in (inline, block) {
|
|
79
|
+
.#{$axis}-size-px { #{$axis}-size: 1px; }
|
|
80
|
+
.min-#{$axis}-size-px { min-#{$axis}-size: 1px; }
|
|
81
|
+
.max-#{$axis}-size-px { max-#{$axis}-size: 1px; }
|
|
82
|
+
.#{$axis}-size-screen { #{$axis}-size: 100v#{string.slice($axis, 1, 1)}; }
|
|
83
|
+
.#{$axis}-size-stretch { #{$axis}-size: stretch; }
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* Logical min/max keywords with the -size spelling (the shorter .min-inline-* names stay available) */
|
|
87
|
+
@each $k, $v in ('full': 100%, 'fit': fit-content, 'min': min-content, 'max': max-content) {
|
|
88
|
+
.min-inline-size-#{$k} { min-inline-size: $v; }
|
|
89
|
+
.min-block-size-#{$k} { min-block-size: $v; }
|
|
90
|
+
@if $k != 'full' {
|
|
91
|
+
.max-block-size-#{$k} { max-block-size: $v; }
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
.max-block-size-full { max-block-size: 100%; }
|
|
95
|
+
.max-inline-size-none { max-inline-size: none; }
|
|
96
|
+
.max-block-size-none { max-block-size: none; }
|
|
97
|
+
.max-inline-size-fit { max-inline-size: fit-content; }
|
|
98
|
+
.max-inline-size-min { max-inline-size: min-content; }
|
|
99
|
+
.max-inline-size-max { max-inline-size: max-content; }
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
// SCSS Document
|
|
2
|
-
// File: src/scss/utilities/_starting_style.scss
|
|
3
|
-
// Description: Entry/exit transition utilities — @starting-style, transition-behavior and interpolate-size.
|
|
4
|
-
// Copyright: 2021-2026 Birdycom
|
|
5
|
-
// Author: Serge Cools
|
|
6
|
-
// Version: 0.3.0
|
|
7
|
-
// Framework: OmniaCSS
|
|
8
|
-
// Purpose: Generate .starting-* classes (initial state before first render), .transition-discrete
|
|
9
|
-
// and .interpolate-size-* so popovers, dialogs and <details> can animate in/out with CSS only.
|
|
10
|
-
// Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@starting-style
|
|
11
|
-
// Note: combine with a transition utility (e.g. .transition .duration-300) on the same element.
|
|
12
|
-
// Map: @starting-style -> transition-behavior -> interpolate-size -> details-content
|
|
13
|
-
|
|
14
|
-
/* Starting style — values used before the element's first style update */
|
|
15
|
-
.starting-opacity-0 {
|
|
16
|
-
@starting-style { opacity: 0; }
|
|
17
|
-
}
|
|
18
|
-
.starting-scale-95 {
|
|
19
|
-
@starting-style { scale: 0.95; }
|
|
20
|
-
}
|
|
21
|
-
.starting-translate-y-2 {
|
|
22
|
-
@starting-style { translate: 0 0.5rem; }
|
|
23
|
-
}
|
|
24
|
-
.starting-translate-y-n2 {
|
|
25
|
-
@starting-style { translate: 0 -0.5rem; }
|
|
26
|
-
}
|
|
27
|
-
.starting-translate-x-full {
|
|
28
|
-
@starting-style { translate: 100% 0; }
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/* Transition behavior — allow transitions on discrete properties (display, overlay, content-visibility) */
|
|
32
|
-
.transition-normal { transition-behavior: normal; }
|
|
33
|
-
.transition-discrete { transition-behavior: allow-discrete; }
|
|
34
|
-
|
|
35
|
-
/* Interpolate size — animate to/from intrinsic sizes like height: auto */
|
|
36
|
-
.interpolate-size-numeric { interpolate-size: numeric-only; }
|
|
37
|
-
.interpolate-size-keywords { interpolate-size: allow-keywords; }
|
|
38
|
-
|
|
39
|
-
/* Details content — animate the open/close of <details> */
|
|
40
|
-
.details-animate::details-content {
|
|
41
|
-
block-size: 0;
|
|
42
|
-
overflow: clip;
|
|
43
|
-
transition: block-size 300ms ease, content-visibility 300ms allow-discrete;
|
|
44
|
-
}
|
|
45
|
-
.details-animate[open]::details-content {
|
|
46
|
-
block-size: auto;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
@media (prefers-reduced-motion: reduce) {
|
|
50
|
-
.details-animate::details-content {
|
|
51
|
-
transition: none;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
1
|
+
// SCSS Document
|
|
2
|
+
// File: src/scss/utilities/_starting_style.scss
|
|
3
|
+
// Description: Entry/exit transition utilities — @starting-style, transition-behavior and interpolate-size.
|
|
4
|
+
// Copyright: 2021-2026 Birdycom
|
|
5
|
+
// Author: Serge Cools
|
|
6
|
+
// Version: 0.3.0
|
|
7
|
+
// Framework: OmniaCSS
|
|
8
|
+
// Purpose: Generate .starting-* classes (initial state before first render), .transition-discrete
|
|
9
|
+
// and .interpolate-size-* so popovers, dialogs and <details> can animate in/out with CSS only.
|
|
10
|
+
// Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/@starting-style
|
|
11
|
+
// Note: combine with a transition utility (e.g. .transition .duration-300) on the same element.
|
|
12
|
+
// Map: @starting-style -> transition-behavior -> interpolate-size -> details-content
|
|
13
|
+
|
|
14
|
+
/* Starting style — values used before the element's first style update */
|
|
15
|
+
.starting-opacity-0 {
|
|
16
|
+
@starting-style { opacity: 0; }
|
|
17
|
+
}
|
|
18
|
+
.starting-scale-95 {
|
|
19
|
+
@starting-style { scale: 0.95; }
|
|
20
|
+
}
|
|
21
|
+
.starting-translate-y-2 {
|
|
22
|
+
@starting-style { translate: 0 0.5rem; }
|
|
23
|
+
}
|
|
24
|
+
.starting-translate-y-n2 {
|
|
25
|
+
@starting-style { translate: 0 -0.5rem; }
|
|
26
|
+
}
|
|
27
|
+
.starting-translate-x-full {
|
|
28
|
+
@starting-style { translate: 100% 0; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Transition behavior — allow transitions on discrete properties (display, overlay, content-visibility) */
|
|
32
|
+
.transition-normal { transition-behavior: normal; }
|
|
33
|
+
.transition-discrete { transition-behavior: allow-discrete; }
|
|
34
|
+
|
|
35
|
+
/* Interpolate size — animate to/from intrinsic sizes like height: auto */
|
|
36
|
+
.interpolate-size-numeric { interpolate-size: numeric-only; }
|
|
37
|
+
.interpolate-size-keywords { interpolate-size: allow-keywords; }
|
|
38
|
+
|
|
39
|
+
/* Details content — animate the open/close of <details> */
|
|
40
|
+
.details-animate::details-content {
|
|
41
|
+
block-size: 0;
|
|
42
|
+
overflow: clip;
|
|
43
|
+
transition: block-size 300ms ease, content-visibility 300ms allow-discrete;
|
|
44
|
+
}
|
|
45
|
+
.details-animate[open]::details-content {
|
|
46
|
+
block-size: auto;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@media (prefers-reduced-motion: reduce) {
|
|
50
|
+
.details-animate::details-content {
|
|
51
|
+
transition: none;
|
|
52
|
+
}
|
|
53
|
+
}
|