@fest-lib/veela 0.1.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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +533 -0
  3. package/dist/veela.js +878 -0
  4. package/package.json +83 -0
  5. package/src/scss/_layers.scss +16 -0
  6. package/src/scss/advanced/_index.scss +0 -0
  7. package/src/scss/advanced/animation/_motion.scss +317 -0
  8. package/src/scss/advanced/color/_color.scss +328 -0
  9. package/src/scss/advanced/color/_colorize.scss +325 -0
  10. package/src/scss/advanced/design/_design-tokens.scss +118 -0
  11. package/src/scss/advanced/design/_effects.scss +275 -0
  12. package/src/scss/advanced/design/_shadow.scss +359 -0
  13. package/src/scss/advanced/design/_surfaces.scss +76 -0
  14. package/src/scss/advanced/effects/_animations.scss +124 -0
  15. package/src/scss/advanced/effects/_shadows.scss +50 -0
  16. package/src/scss/advanced/font/_typography.scss +600 -0
  17. package/src/scss/advanced/index.scss +11 -0
  18. package/src/scss/advanced/index.ts +35 -0
  19. package/src/scss/advanced/layout/_content.scss +170 -0
  20. package/src/scss/advanced/layout/_index.scss +5 -0
  21. package/src/scss/advanced/layout/_normalize.scss +541 -0
  22. package/src/scss/advanced/layout/_shared-overlays.scss +162 -0
  23. package/src/scss/advanced/md3/_md3.scss +596 -0
  24. package/src/scss/advanced/md3/_utils.scss +114 -0
  25. package/src/scss/advanced/misc/_config.scss +119 -0
  26. package/src/scss/advanced/misc/_initials.scss +298 -0
  27. package/src/scss/advanced/misc/_mixins.scss +179 -0
  28. package/src/scss/advanced/misc/_queries.scss +34 -0
  29. package/src/scss/advanced/misc/_rendering.scss +82 -0
  30. package/src/scss/advanced/misc/_tokens.scss +74 -0
  31. package/src/scss/advanced/theme/_shared.scss +232 -0
  32. package/src/scss/advanced/theme/_states.scss +332 -0
  33. package/src/scss/advanced/theme/_variants.scss +354 -0
  34. package/src/scss/advanced/tokens/_material-color.scss +120 -0
  35. package/src/scss/advanced/tokens/_variables.scss +171 -0
  36. package/src/scss/basic/_layers.scss +0 -0
  37. package/src/scss/basic/design/_index.scss +3 -0
  38. package/src/scss/basic/design/_keyframes.scss +163 -0
  39. package/src/scss/basic/design/_shapes.scss +266 -0
  40. package/src/scss/basic/design/_wavy-runtime.scss +50 -0
  41. package/src/scss/basic/index.scss +19 -0
  42. package/src/scss/basic/index.ts +29 -0
  43. package/src/scss/basic/misc/_core-layout.scss +272 -0
  44. package/src/scss/basic/misc/_index.scss +18 -0
  45. package/src/scss/basic/misc/_layout.scss +1040 -0
  46. package/src/scss/basic/misc/_mixins.scss +179 -0
  47. package/src/scss/basic/misc/_motion.scss +28 -0
  48. package/src/scss/basic/misc/_normalize.scss +765 -0
  49. package/src/scss/basic/misc/_queries.scss +34 -0
  50. package/src/scss/basic/misc/_shared.scss +232 -0
  51. package/src/scss/basic/misc/_states.scss +135 -0
  52. package/src/scss/basic/misc/_tokens.scss +78 -0
  53. package/src/scss/basic/misc/_veela.scss +12 -0
  54. package/src/scss/core/index.scss +1 -0
  55. package/src/scss/core/interact/_draggable.scss +32 -0
  56. package/src/scss/core/interact/_position.scss +45 -0
  57. package/src/scss/core/interact/_ps-anchor.scss +28 -0
  58. package/src/scss/core/interact/_ps-centered.scss +28 -0
  59. package/src/scss/core/interact/_ps-cursor.scss +18 -0
  60. package/src/scss/core/interact/_ps-draggable.scss +25 -0
  61. package/src/scss/core/interact/_ps-mechanic.scss +0 -0
  62. package/src/scss/core/interact/_ps-properties.scss +54 -0
  63. package/src/scss/core/interact/_ps-resizable.scss +61 -0
  64. package/src/scss/core/interact/_resizable.scss +69 -0
  65. package/src/scss/core/interact/_viewport.scss +469 -0
  66. package/src/scss/core/misc/_color-properties.scss +64 -0
  67. package/src/scss/core/misc/_config.scss +110 -0
  68. package/src/scss/core/misc/_functions.scss +530 -0
  69. package/src/scss/core/misc/_icons.scss +109 -0
  70. package/src/scss/core/misc/_index.scss +6 -0
  71. package/src/scss/core/misc/_layout.scss +49 -0
  72. package/src/scss/core/misc/_mixins.scss +744 -0
  73. package/src/scss/core/misc/_properties.scss +245 -0
  74. package/src/scss/core/misc/_tokens.scss +947 -0
  75. package/src/scss/core/misc/_utilities.scss +941 -0
  76. package/src/scss/core/misc/_utils.scss +17 -0
  77. package/src/scss/index.scss +18 -0
  78. package/src/scss/index.ts +105 -0
@@ -0,0 +1,54 @@
1
+ // =============================================================================
2
+ // POINTER/SCROLL PROPERTIES
3
+ // Additional properties for interactive/draggable elements
4
+ // NOTE: Core properties (--drag-x, --drag-y, --resize-x, --resize-y, --z-index)
5
+ // are defined in lib/design/core/_properties.scss
6
+ // =============================================================================
7
+
8
+ @mixin xy-props($prefix, $x-suffix, $y-suffix, $x-value, $y-value, $syntax, $inherits: true) {
9
+ @property --#{$prefix}#{$x-suffix} { initial-value: #{$x-value}; syntax: "#{$syntax}"; inherits: #{$inherits}; }
10
+ @property --#{$prefix}#{$y-suffix} { initial-value: #{$y-value}; syntax: "#{$syntax}"; inherits: #{$inherits}; }
11
+ }
12
+
13
+ @mixin pair-props($prefix, $first-suffix, $second-suffix, $first-value, $second-value, $syntax, $inherits: true) {
14
+ @property --#{$prefix}#{$first-suffix} { initial-value: #{$first-value}; syntax: "#{$syntax}"; inherits: #{$inherits}; }
15
+ @property --#{$prefix}#{$second-suffix} { initial-value: #{$second-value}; syntax: "#{$syntax}"; inherits: #{$inherits}; }
16
+ }
17
+
18
+ // Pointer/page coordinates
19
+ @mixin pointer-coords { @include xy-props('client', '-x', '-y', 0, 0, '<number>'); }
20
+ @mixin page-coords { @include xy-props('page', '-x', '-y', 0, 0, '<number>'); }
21
+
22
+ // Spatial coordinates (unique to misc)
23
+ @mixin sp-coords { @include xy-props('sp', '-x', '-y', 0px, 0px, '<length-percentage>'); }
24
+ @mixin ds-coords { @include xy-props('ds', '-x', '-y', 0px, 0px, '<length-percentage>'); }
25
+ @mixin r-coords { @include xy-props('r', 'x', 'y', 0px, 0px, '<length-percentage>'); }
26
+ @mixin rs-coords { @include xy-props('rs', '-x', '-y', 0px, 0px, '<length-percentage>'); }
27
+
28
+ // Limit coords
29
+ @mixin limit-shift-coords { @include xy-props('limit-shift', '-x', '-y', '100%', '100%', '<length-percentage>'); }
30
+ @mixin limit-drag-coords { @include xy-props('limit-drag', '-x', '-y', '100%', '100%', '<length-percentage>'); }
31
+
32
+ // Size properties
33
+ @mixin bound-size { @include pair-props('bound-', 'inline-size', 'block-size', '100%', '100%', '<length-percentage>'); }
34
+ @mixin initial-size { @include pair-props('initial-', 'inline-size', 'block-size', '100%', '100%', '<length-percentage>'); }
35
+ @mixin frame-size { @include pair-props('', 'inline-size', 'block-size', '100%', '100%', '<length-percentage>'); }
36
+
37
+ // Register unique properties only
38
+ @include pointer-coords;
39
+ @include page-coords;
40
+ @include sp-coords;
41
+ @include ds-coords;
42
+ @include r-coords;
43
+ @include rs-coords;
44
+ @include limit-shift-coords;
45
+ @include limit-drag-coords;
46
+ @include bound-size;
47
+ @include frame-size;
48
+ @include initial-size;
49
+
50
+ // Scroll properties (unique to this module)
51
+ @property --scroll-coef { syntax: "<number>"; initial-value: 1; inherits: true; }
52
+ @property --scroll-size { syntax: "<number>"; initial-value: 0; inherits: true; }
53
+ @property --content-size { syntax: "<number>"; initial-value: 0; inherits: true; }
54
+ @property --max-size { syntax: "<length-percentage>"; initial-value: 0px; inherits: true; }
@@ -0,0 +1,61 @@
1
+ @mixin psm-initials($width: 48rem, $height: 32rem) {
2
+ & {
3
+ --initial-inline-size: #{$width};
4
+ --initial-block-size : #{$height};
5
+
6
+ /* title bar */
7
+ --title-bar-height : 2rem;
8
+ --height-adjust : 0px;
9
+
10
+ /* safe area */
11
+ --safe-area-left : 0px;
12
+ --safe-area-right: 0px;
13
+
14
+ /* maximum available size */
15
+ --bound-inline-size: 100cqi;
16
+ --bound-block-size : calc(100cqb - var(--height-adjust, 0px));
17
+ };
18
+ }
19
+
20
+ //
21
+ @mixin psm-size-when-resizing {
22
+ & {
23
+ /* resizing relation */
24
+ --diff-inline: calc(var(--bound-inline-size, 100cqi) - var(--initial-inline-size, 0px));
25
+ --diff-block: calc(var(--bound-block-size , 100cqb) - var(--initial-block-size , 0px));
26
+
27
+ /* resize clamping */
28
+ --shell-x: clamp(0px, calc(var(--resize-x, 0) * 1px), max(0px, calc(var(--diff-inline, 0px) - var(--shift-x, 0) * 1px)));
29
+ --shell-y: clamp(0px, calc(var(--resize-y, 0) * 1px), max(0px, calc(var(--diff-block , 0px) - var(--shift-y, 0) * 1px)));
30
+
31
+ /* resized window size */
32
+ --self-size-x: calc(var(--initial-inline-size, 0px) + max(0px, var(--shell-x, 0px)));
33
+ --self-size-y: calc(var(--initial-block-size , 0px) + max(0px, var(--shell-y, 0px)));
34
+
35
+ /* window size */
36
+ --inline-size: clamp(var(--initial-inline-size, 0px), var(--self-size-x, 0px), var(--bound-inline-size, 100cqi));
37
+ --block-size : clamp(var(--initial-block-size , 0px), var(--self-size-y, 0px), var(--bound-block-size , 100cqb));
38
+ };
39
+ };
40
+
41
+ /* */
42
+ @mixin ps-mechanic {
43
+ & {
44
+ @include psm-initials;
45
+ @include psm-size-when-resizing;
46
+ };
47
+ }
48
+
49
+ /* */
50
+ @mixin ps-resizable {
51
+ & {
52
+ --resize-x: 0;
53
+ --resize-y: 0;
54
+
55
+ inline-size : clamp(var(--initial-inline-size, 0px), var(--inline-size, 100%), calc(var(--bound-inline-size, 100cqi))) !important;
56
+ block-size : clamp(var(--initial-block-size , 0px), var(--block-size , 100%), calc(var(--bound-block-size , 100cqb))) !important;
57
+ direction : ltr;
58
+ touch-action: none;
59
+ writing-mode: horizontal-tb;
60
+ };
61
+ };
@@ -0,0 +1,69 @@
1
+ // Resizable component mixins - veela-independent fallbacks
2
+
3
+ @mixin resizable-element {
4
+ position: relative;
5
+ overflow: hidden;
6
+ min-inline-size: var(--min-inline-size, 100px);
7
+ min-block-size: var(--min-block-size, 100px);
8
+ }
9
+
10
+ @mixin resize-handle($position: se) {
11
+ position: absolute;
12
+ pointer-events: auto;
13
+ z-index: 10;
14
+
15
+ @if $position == n {
16
+ inset-block-start: 0;
17
+ inset-inline: 0;
18
+ block-size: 8px;
19
+ cursor: ns-resize;
20
+ } @else if $position == s {
21
+ inset-block-end: 0;
22
+ inset-inline: 0;
23
+ block-size: 8px;
24
+ cursor: ns-resize;
25
+ } @else if $position == e {
26
+ inset-inline-end: 0;
27
+ inset-block: 0;
28
+ inline-size: 8px;
29
+ cursor: ew-resize;
30
+ } @else if $position == w {
31
+ inset-inline-start: 0;
32
+ inset-block: 0;
33
+ inline-size: 8px;
34
+ cursor: ew-resize;
35
+ } @else if $position == ne {
36
+ inset-block-start: 0;
37
+ inset-inline-end: 0;
38
+ inline-size: 16px;
39
+ block-size: 16px;
40
+ cursor: nesw-resize;
41
+ } @else if $position == nw {
42
+ inset-block-start: 0;
43
+ inset-inline-start: 0;
44
+ inline-size: 16px;
45
+ block-size: 16px;
46
+ cursor: nwse-resize;
47
+ } @else if $position == se {
48
+ inset-block-end: 0;
49
+ inset-inline-end: 0;
50
+ inline-size: 16px;
51
+ block-size: 16px;
52
+ cursor: nwse-resize;
53
+ } @else if $position == sw {
54
+ inset-block-end: 0;
55
+ inset-inline-start: 0;
56
+ inline-size: 16px;
57
+ block-size: 16px;
58
+ cursor: nesw-resize;
59
+ }
60
+ }
61
+
62
+ @mixin resizing-state {
63
+ user-select: none;
64
+
65
+ * {
66
+ user-select: none;
67
+ pointer-events: none;
68
+ }
69
+ }
@@ -0,0 +1,469 @@
1
+ @use "../misc/functions" as lg;
2
+ @use "sass:list";
3
+ @use "sass:string";
4
+ @use "sass:meta";
5
+
6
+ //
7
+ // 2D shorthand helpers
8
+ @function v2-suffix($suffix) {
9
+ @if $suffix == null or $suffix == "" { @return ""; }
10
+
11
+ $value: #{$suffix};
12
+ @if string.slice($value, 1, 1) == "-" {
13
+ @return string.unquote($value);
14
+ }
15
+
16
+ @return string.unquote("-#{$value}");
17
+ }
18
+
19
+ @mixin v2-pair($token, $first-value, $second-value, $axes: ("x", "y")) {
20
+ $first-suffix: v2-suffix(list.nth($axes, 1));
21
+ $second-suffix: v2-suffix(list.nth($axes, 2));
22
+
23
+ --#{$token}#{$first-suffix}: #{$first-value};
24
+ --#{$token}#{$second-suffix}: #{$second-value};
25
+ }
26
+
27
+ @function v2-size($axis, $primary, $secondary, $orient: var(--orient, 0)) {
28
+ @return string.unquote("--get-oriented-size(#{$orient}, #{$primary}, #{$secondary}, #{$axis})");
29
+ }
30
+
31
+ @function v2-size-num($axis, $primary, $secondary, $orient: var(--orient, 0)) {
32
+ @return string.unquote("--get-oriented-size-num(#{$orient}, #{$primary}, #{$secondary}, #{$axis})");
33
+ }
34
+
35
+ @function v2-coord($axis, $first, $second, $size-x, $size-y, $orient: var(--orient, 0)) {
36
+ @return string.unquote("--get-oriented-coordinate(#{$orient}, #{$first}, #{$second}, #{$size-x}, #{$size-y}, #{$axis})");
37
+ }
38
+
39
+ @function v2-coord-num($axis, $first, $second, $max-x, $max-y, $orient: var(--orient, 0)) {
40
+ @return string.unquote("--get-oriented-coord-num(#{$orient}, #{$first}, #{$second}, #{$max-x}, #{$max-y}, #{$axis})");
41
+ }
42
+
43
+ @function v2-vec($axis, $first, $second, $orient: var(--orient, 0)) {
44
+ @return string.unquote("--get-oriented-vector(#{$orient}, #{$first}, #{$second}, #{$axis})");
45
+ }
46
+
47
+ @function v2-pick($value, $index, $fallback: null) {
48
+ @if meta.type-of($value) != "list" {
49
+ @return if(
50
+ sass($index == 1): $value;
51
+ else: $fallback;
52
+ );
53
+ }
54
+
55
+ @if list.length($value) < $index {
56
+ @return $fallback;
57
+ }
58
+
59
+ @return list.nth($value, $index);
60
+ }
61
+
62
+ @mixin v2-size-pair($token, $axis-0, $axis-1: $axis-0, $axes: ("x", "y"), $orient: var(--orient, 0)) {
63
+ $a0-primary: v2-pick($axis-0, 1);
64
+ $a0-secondary: v2-pick($axis-0, 2);
65
+ $a1-primary: v2-pick($axis-1, 1, $a0-primary);
66
+ $a1-secondary: v2-pick($axis-1, 2, $a0-secondary);
67
+
68
+ @include v2-pair(
69
+ $token,
70
+ v2-size(0, $a0-primary, $a0-secondary, $orient),
71
+ v2-size(1, $a1-primary, $a1-secondary, $orient),
72
+ $axes
73
+ );
74
+ }
75
+
76
+ @mixin v2-size-num-pair($token, $axis-0, $axis-1: $axis-0, $axes: ("x", "y"), $orient: var(--orient, 0)) {
77
+ $a0-primary: v2-pick($axis-0, 1);
78
+ $a0-secondary: v2-pick($axis-0, 2);
79
+ $a1-primary: v2-pick($axis-1, 1, $a0-primary);
80
+ $a1-secondary: v2-pick($axis-1, 2, $a0-secondary);
81
+
82
+ @include v2-pair(
83
+ $token,
84
+ v2-size-num(0, $a0-primary, $a0-secondary, $orient),
85
+ v2-size-num(1, $a1-primary, $a1-secondary, $orient),
86
+ $axes
87
+ );
88
+ }
89
+
90
+ @mixin v2-coord-pair($token, $axis-0, $axis-1: $axis-0, $axes: ("x", "y"), $orient: var(--orient, 0)) {
91
+ $a0-first: v2-pick($axis-0, 1);
92
+ $a0-second: v2-pick($axis-0, 2);
93
+ $a0-size-x: v2-pick($axis-0, 3);
94
+ $a0-size-y: v2-pick($axis-0, 4);
95
+
96
+ $a1-first: v2-pick($axis-1, 1, $a0-first);
97
+ $a1-second: v2-pick($axis-1, 2, $a0-second);
98
+ $a1-size-x: v2-pick($axis-1, 3, $a0-size-x);
99
+ $a1-size-y: v2-pick($axis-1, 4, $a0-size-y);
100
+
101
+ @include v2-pair(
102
+ $token,
103
+ v2-coord(0, $a0-first, $a0-second, $a0-size-x, $a0-size-y, $orient),
104
+ v2-coord(1, $a1-first, $a1-second, $a1-size-x, $a1-size-y, $orient),
105
+ $axes
106
+ );
107
+ }
108
+
109
+ @mixin v2-coord-num-pair($token, $axis-0, $axis-1: $axis-0, $axes: ("x", "y"), $orient: var(--orient, 0)) {
110
+ $a0-first: v2-pick($axis-0, 1);
111
+ $a0-second: v2-pick($axis-0, 2);
112
+ $a0-max-x: v2-pick($axis-0, 3);
113
+ $a0-max-y: v2-pick($axis-0, 4);
114
+
115
+ $a1-first: v2-pick($axis-1, 1, $a0-first);
116
+ $a1-second: v2-pick($axis-1, 2, $a0-second);
117
+ $a1-max-x: v2-pick($axis-1, 3, $a0-max-x);
118
+ $a1-max-y: v2-pick($axis-1, 4, $a0-max-y);
119
+
120
+ @include v2-pair(
121
+ $token,
122
+ v2-coord-num(0, $a0-first, $a0-second, $a0-max-x, $a0-max-y, $orient),
123
+ v2-coord-num(1, $a1-first, $a1-second, $a1-max-x, $a1-max-y, $orient),
124
+ $axes
125
+ );
126
+ }
127
+
128
+ @mixin v2-vec-pair($token, $axis-0, $axis-1: $axis-0, $axes: ("x", "y"), $orient: var(--orient, 0)) {
129
+ $a0-first: v2-pick($axis-0, 1);
130
+ $a0-second: v2-pick($axis-0, 2);
131
+ $a1-first: v2-pick($axis-1, 1, $a0-first);
132
+ $a1-second: v2-pick($axis-1, 2, $a0-second);
133
+
134
+ @include v2-pair(
135
+ $token,
136
+ v2-vec(0, $a0-first, $a0-second, $orient),
137
+ v2-vec(1, $a1-first, $a1-second, $orient),
138
+ $axes
139
+ );
140
+ }
141
+
142
+ @mixin oriented($property, $portrait, $landscape) {
143
+ & { #{$property}: #{$portrait}; }
144
+ @media (orientation: portrait) { #{$property}: #{$portrait}; }
145
+ @media (orientation: landscape) { #{$property}: #{$landscape}; }
146
+ }
147
+
148
+
149
+ //
150
+ @function inverse-orient($orient) {
151
+ @return mod(calc(4 - $orient), 4);
152
+ }
153
+
154
+
155
+ //
156
+ @mixin compute_os_conditions {
157
+ & {
158
+ --in-orient-base: round(nearest, var(--orient, 0), 1);
159
+ --in-rev-cond-x: clamp(0, calc(var(--in-orient-base, 0) - 1), 1);
160
+ --in-rev-cond-y: clamp(0, calc((1 - abs(calc(var(--in-orient-base, 0) - 1.5))) * 2), 1);
161
+ --in-swap-cond: #{css-rem(var(--orient, 0), 2)};
162
+ --in-rev-vx: calc(var(--in-rev-cond-x, 1) * -2 + 1);
163
+ --in-rev-vy: calc(var(--in-rev-cond-y, 1) * -2 + 1);
164
+ }
165
+ }
166
+
167
+
168
+
169
+ @mixin compute_cs_size_to_os {
170
+ $orient: #{inverse-orient(var(--orient, 0))};
171
+
172
+ & {
173
+ @include v2-size-pair(
174
+ "os-size",
175
+ (var(--cs-size-x, 100cqi), var(--cs-size-y, 100cqb)),
176
+ (var(--cs-size-x, 100cqb), var(--cs-size-y, 100cqi)),
177
+ $orient: $orient
178
+ );
179
+
180
+ @include v2-size-pair(
181
+ "os-self-size",
182
+ (var(--cs-self-size-x, 100%), var(--cs-self-size-y, 100%)),
183
+ $orient: $orient
184
+ );
185
+ }
186
+ }
187
+
188
+ @mixin compute_from_cs_to_os {
189
+ $orient: #{inverse-orient(var(--orient, 0))};
190
+
191
+ & {
192
+ @include v2-coord-pair(
193
+ "os-inset",
194
+ (var(--cs-inset-x, 0px), var(--cs-inset-y, 0px), var(--cs-size-x, 100cqi), var(--cs-size-y, 100cqb)),
195
+ $orient: $orient
196
+ );
197
+
198
+ @include v2-vec-pair(
199
+ "os-drag",
200
+ (var(--cs-drag-x, 0px), var(--cs-drag-y, 0px)),
201
+ $orient: $orient
202
+ );
203
+ }
204
+ }
205
+
206
+
207
+
208
+ @mixin compute_os_size_to_cs {
209
+ $orient: var(--orient, 0);
210
+
211
+ & {
212
+ @include v2-size-pair(
213
+ "cs-size",
214
+ (var(--os-size-x, 100cqb), var(--os-size-y, 100cqi)),
215
+ (var(--os-size-x, 100cqi), var(--os-size-y, 100cqb)),
216
+ $orient: $orient
217
+ );
218
+
219
+ @include v2-size-pair(
220
+ "cs-self-size",
221
+ (var(--os-self-size-x, 100%), var(--os-self-size-y, 100%)),
222
+ $orient: $orient
223
+ );
224
+ }
225
+ }
226
+
227
+ @mixin compute_from_os_to_cs {
228
+ $orient: var(--orient, 0);
229
+
230
+ & {
231
+ @include v2-coord-pair(
232
+ "cs-inset",
233
+ (var(--os-inset-x, 0px), var(--os-inset-y, 0px), var(--os-size-x, 100cqi), var(--os-size-y, 100cqb)),
234
+ $orient: $orient
235
+ );
236
+
237
+ @include v2-vec-pair(
238
+ "cs-drag",
239
+ (var(--os-drag-x, 0px), var(--os-drag-y, 0px)),
240
+ $orient: $orient
241
+ );
242
+ }
243
+ }
244
+
245
+
246
+ @mixin portrait-size {
247
+ --cqi: 100cqmin;
248
+ --cqb: 100cqmax;
249
+ }
250
+
251
+ @mixin landscape-size {
252
+ --cqi: 100cqmax;
253
+ --cqb: 100cqmin;
254
+ }
255
+
256
+ @mixin init-os-size-by-native {
257
+ @include v2-pair("os-size", var(--cqi, 100cqi), var(--cqb, 100cqb));
258
+ }
259
+
260
+ @mixin init-cs-size {
261
+ @include v2-pair("cs-size", 100cqi, 100cqb);
262
+ }
263
+
264
+ @mixin centered-self($transforms: null) {
265
+ transform-origin: 0% 0%;
266
+ transform:
267
+ #{$transforms}
268
+ scale3d(var(--scale, 1), var(--scale, 1), var(--scale, 1))
269
+ #{perfect-translate(calc(var(--translate-x, 0px) - 50%), calc(var(--translate-y, 0px) - 50%))};
270
+ place-self: center;
271
+ }
272
+
273
+ @mixin centered-with-offset {
274
+ $translate: #{perfect-translate(var(--cs-drag-x, 0px), var(--cs-drag-y, 0px))};
275
+ @include centered-self($translate);
276
+ }
277
+
278
+ @mixin use-inset {
279
+ inset: var(--cs-inset-y, 0px) auto auto var(--cs-inset-x, 0px);
280
+ }
281
+
282
+ //
283
+ @mixin use_dvp {
284
+ & { --avi: 100dvmin; --avb: 100dvmax; };
285
+ & {
286
+ --vp-i-size: var(--avi, 100dvmin);
287
+ --vp-b-size: var(--avb, 100dvmax);
288
+ }
289
+ }
290
+
291
+ //
292
+ @mixin use_lvp {
293
+ & { --avi: 100lvmin; --avb: 100lvmax; };
294
+ & {
295
+ --vp-i-size: var(--avi, 100lvmin);
296
+ --vp-b-size: var(--avb, 100lvmax);
297
+ }
298
+ }
299
+
300
+
301
+ //
302
+ @mixin when-fullscreen($selector: &) {
303
+ @media (display-mode: fullscreen) { @content; }
304
+ @at-root :fullscreen #{$selector} { @content; }
305
+ }
306
+
307
+ //
308
+ @mixin vp-vars {
309
+ @include use_dvp();
310
+ @include when-fullscreen() {
311
+ @include use_lvp();
312
+ & {
313
+ --vp-i-size: min(var(--avail-width, 100dvmin), 100dvmin);
314
+ --vp-b-size: min(var(--avail-height, 100dvmax), 100dvmax);
315
+ }
316
+ }
317
+ };
318
+
319
+ //
320
+ @mixin fit-viewport {
321
+ @include vp-vars;
322
+ & {
323
+ @include oriented(inline-size, var(--vp-i-size, 100lvi), var(--vp-b-size, 100lvb));
324
+ @include oriented(block-size, var(--vp-b-size, 100lvb), var(--vp-i-size, 100lvi));
325
+ @include oriented(max-inline-size, var(--vp-i-size, 100lvi), var(--vp-b-size, 100lvb));
326
+ @include oriented(max-block-size, var(--vp-b-size, 100lvb), var(--vp-i-size, 100lvi));
327
+ }
328
+ };
329
+
330
+ //
331
+ @function perfect-translate($x: 0px, $y: 0px) {
332
+ @return translate3d(round(nearest, #{$x}, calc(1px / var(--pixel-ratio, 1))), round(nearest, #{$y}, calc(1px / var(--pixel-ratio, 1))), 0);
333
+ }
334
+
335
+ //
336
+ @mixin compute_grid_item_cell() {
337
+ /* WHY: `v2-coord-num` maps logical `--cell-x`/`--cell-y` into physical `cs-grid-*` using `--orient` from the launcher / `ui-orientbox` host; without inherit, items see initial `0` and placement ignores rotation. */
338
+ & {
339
+ --orient: inherit;
340
+ }
341
+
342
+ // hack: use translate diff shifting for correct animation for CSS Grid Layout
343
+ & { // currently, I have no viable solution for correct animation for CSS Grid Layout
344
+ @include v2-pair(
345
+ "cs-sw-unit",
346
+ calc(var(--cs-size-x, 100cqi) / var(--cs-layout-c, 1)),
347
+ calc(var(--cs-size-y, 100cqb) / var(--cs-layout-r, 1))
348
+ );
349
+ }
350
+
351
+ & {
352
+ @include v2-pair(
353
+ "cs-transition",
354
+ 0px,
355
+ 0px,
356
+ ("c", "r")
357
+ );
358
+ }
359
+
360
+ &[data-dragging] {
361
+ //
362
+ @include v2-pair(
363
+ "cs-transition",
364
+ calc((var(--rv-grid-c, 0) - var(--cs-grid-c, 0)) * var(--cs-sw-unit-x, 1px)),
365
+ calc((var(--rv-grid-r, 0) - var(--cs-grid-r, 0)) * var(--cs-sw-unit-y, 1px)),
366
+ ("c", "r")
367
+ );
368
+ }
369
+
370
+ & {
371
+ @include v2-pair("p-cell", var(--cell-x), var(--cell-y));
372
+
373
+ // CLAMPED GRID
374
+ --f-col: clamp(1, var(--layout-c, 4), 16);
375
+ --f-row: clamp(1, var(--layout-r, 8), 16);
376
+
377
+ //
378
+ @include v2-pair(
379
+ "grid",
380
+ clamp(0, var(--cell-x), calc(var(--f-col) - 1)),
381
+ clamp(0, var(--cell-y), calc(var(--f-row) - 1)),
382
+ ("c", "r")
383
+ );
384
+
385
+ //
386
+ @include v2-pair(
387
+ "p-grid",
388
+ clamp(0, var(--p-cell-x), calc(var(--f-col) - 1)),
389
+ clamp(0, var(--p-cell-y), calc(var(--f-row) - 1)),
390
+ ("c", "r")
391
+ );
392
+
393
+ //
394
+ @include v2-pair(
395
+ "fc-cell",
396
+ clamp(0, var(--cs-grid-c, 0), calc(var(--f-col) - 1)),
397
+ clamp(0, var(--cs-grid-r, 0), calc(var(--f-row) - 1))
398
+ );
399
+
400
+ //
401
+ @include v2-pair(
402
+ "fp-cell",
403
+ clamp(0, var(--cs-p-grid-c, 0), calc(var(--f-col) - 1)),
404
+ clamp(0, var(--cs-p-grid-r, 0), calc(var(--f-row) - 1))
405
+ );
406
+
407
+ //
408
+ @include v2-pair(
409
+ "dir",
410
+ calc(var(--cs-grid-c, 0) - var(--cs-p-grid-c, 0)),
411
+ calc(var(--cs-grid-r, 0) - var(--cs-p-grid-r, 0))
412
+ );
413
+ }
414
+
415
+ //
416
+ & { @include v2-pair("rv-grid", var(--cs-grid-c, 1), var(--cs-grid-r, 1), ("c", "r")); }
417
+ &[data-dragging] { @include v2-pair("rv-grid", var(--cs-p-grid-c, 1), var(--cs-p-grid-r, 1), ("c", "r")); }
418
+
419
+ //
420
+ & {
421
+ @include v2-pair("os-grid", var(--grid-c, 1), var(--grid-r, 1), ("c", "r"));
422
+ @include v2-coord-num-pair(
423
+ "cs-grid",
424
+ (var(--os-grid-c, 1), var(--os-grid-r, 1), calc(var(--f-col, 1) - 1), calc(var(--f-row, 1) - 1)),
425
+ $axes: ("c", "r")
426
+ );
427
+ }
428
+
429
+ //
430
+ & {
431
+ @include v2-pair("os-p-grid", var(--p-cell-x, 0), var(--p-cell-y, 0), ("c", "r"));
432
+ @include v2-coord-num-pair(
433
+ "cs-p-grid",
434
+ (var(--os-p-grid-c, 0), var(--os-p-grid-r, 0), calc(var(--f-col, 1) - 1), calc(var(--f-row, 1) - 1)),
435
+ $axes: ("c", "r")
436
+ );
437
+ }
438
+
439
+ & {
440
+ @include v2-pair(
441
+ "ox",
442
+ calc(var(--os-size-x, 100cqi) / var(--os-layout-c, 1)),
443
+ calc(var(--os-size-y, 100cqb) / var(--os-layout-r, 1)),
444
+ ("c-unit", "r-unit")
445
+ );
446
+
447
+ //
448
+ @include v2-pair(
449
+ "os-inset",
450
+ calc((var(--grid-c, 1) + 0.5) * var(--ox-c-unit, 1px)),
451
+ calc((var(--grid-r, 1) + 0.5) * var(--ox-r-unit, 1px))
452
+ );
453
+ }
454
+ }
455
+
456
+ //
457
+ @mixin compute_orient_grid_layout() {
458
+ & {
459
+ @include v2-pair("os-layout", var(--layout-c, 4), var(--layout-r, 8), ("c", "r"));
460
+ @include v2-size-num-pair(
461
+ "cs-layout",
462
+ (var(--os-layout-c, 4), var(--os-layout-r, 8)),
463
+ $axes: ("c", "r")
464
+ );
465
+ }
466
+ }
467
+
468
+ // :root `--vv-width`, `--vv-height`, `--vv-offset-left`, `--vv-offset-top`, `--vv-scale`
469
+ // are set by fest/dom `getAvailSize()` / `updateVP()` (see `whenAnyScreenChanges`).