@inc2734/unitone-css 1.3.1 → 1.4.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 (62) hide show
  1. package/dist/app.css +1 -1
  2. package/dist/app.js +1 -1
  3. package/dist/behaviors/dividers.js +1 -1
  4. package/dist/behaviors/index.js +1 -1
  5. package/dist/behaviors/stairs.js +1 -1
  6. package/dist/layout-primitives/both-sides/react.js +1 -1
  7. package/dist/layout-primitives/center/react.js +1 -1
  8. package/dist/layout-primitives/cluster/react.js +1 -1
  9. package/dist/layout-primitives/container/react.js +1 -1
  10. package/dist/layout-primitives/decorator/react.js +1 -1
  11. package/dist/layout-primitives/frame/react.js +1 -1
  12. package/dist/layout-primitives/gutters/react.js +1 -1
  13. package/dist/layout-primitives/index.js +1 -1
  14. package/dist/layout-primitives/layers/react.js +1 -1
  15. package/dist/layout-primitives/marquee/behavior.js +1 -1
  16. package/dist/layout-primitives/marquee/react.js +1 -1
  17. package/dist/layout-primitives/reel/react.js +1 -1
  18. package/dist/layout-primitives/responsive-grid/react.js +1 -1
  19. package/dist/layout-primitives/stack/react.js +1 -1
  20. package/dist/layout-primitives/switcher/react.js +1 -1
  21. package/dist/layout-primitives/text/react.js +1 -1
  22. package/dist/layout-primitives/texture/react.js +1 -1
  23. package/dist/layout-primitives/vertical-ends/react.js +1 -1
  24. package/dist/layout-primitives/vertical-writing/behavior.js +1 -1
  25. package/dist/layout-primitives/vertical-writing/react.js +1 -1
  26. package/dist/layout-primitives/with-sidebar/react.js +1 -1
  27. package/dist/library.js +1 -1
  28. package/package.json +2 -2
  29. package/src/behaviors/_fluid-reference.scss +8 -21
  30. package/src/behaviors/_index.scss +3 -1
  31. package/src/behaviors/_responsive-context.scss +96 -0
  32. package/src/layout-primitives/both-sides/index.jsx +1 -12
  33. package/src/layout-primitives/center/index.jsx +1 -11
  34. package/src/layout-primitives/cluster/index.jsx +0 -4
  35. package/src/layout-primitives/container/_index.scss +2 -0
  36. package/src/layout-primitives/container/index.jsx +3 -1
  37. package/src/layout-primitives/decorator/index.jsx +3 -1
  38. package/src/layout-primitives/frame/_index.scss +4 -10
  39. package/src/layout-primitives/frame/index.jsx +1 -1
  40. package/src/layout-primitives/gutters/index.jsx +2 -7
  41. package/src/layout-primitives/layers/_index.scss +7 -12
  42. package/src/layout-primitives/layers/index.jsx +4 -2
  43. package/src/layout-primitives/marquee/_index.scss +2 -3
  44. package/src/layout-primitives/marquee/index.jsx +1 -13
  45. package/src/layout-primitives/reel/index.jsx +1 -12
  46. package/src/layout-primitives/responsive-grid/_index.scss +2 -0
  47. package/src/layout-primitives/responsive-grid/index.jsx +3 -1
  48. package/src/layout-primitives/stack/_index.scss +2 -0
  49. package/src/layout-primitives/stack/index.jsx +3 -1
  50. package/src/layout-primitives/switcher/_index.scss +2 -0
  51. package/src/layout-primitives/switcher/index.jsx +3 -1
  52. package/src/layout-primitives/text/_index.scss +2 -0
  53. package/src/layout-primitives/text/index.jsx +3 -1
  54. package/src/layout-primitives/texture/index.jsx +1 -8
  55. package/src/layout-primitives/vertical-ends/_index.scss +2 -0
  56. package/src/layout-primitives/vertical-ends/index.jsx +3 -1
  57. package/src/layout-primitives/vertical-writing/_index.scss +9 -21
  58. package/src/layout-primitives/vertical-writing/index.jsx +2 -2
  59. package/src/library.js +498 -425
  60. package/src/observer-scope.js +53 -0
  61. package/src/register-layout-initializer.js +35 -3
  62. package/src/variables/_index.scss +125 -75
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Owns the resources and queued work of one layout observer initialization.
3
+ *
4
+ * @param {Element} target Target element.
5
+ * @returns {object} Observer lifetime and cleanup helpers.
6
+ */
7
+ export const createObserverScope = (target) => {
8
+ const defaultView = target.ownerDocument.defaultView;
9
+ const cleanups = new Set();
10
+ const frames = new Set();
11
+ let disposed = false;
12
+
13
+ return {
14
+ get disposed() {
15
+ return disposed;
16
+ },
17
+ addCleanup(cleanup) {
18
+ if (disposed) {
19
+ cleanup();
20
+ } else {
21
+ cleanups.add(cleanup);
22
+ }
23
+ },
24
+ requestAnimationFrame(callback) {
25
+ if (disposed) {
26
+ return 0;
27
+ }
28
+ if (!defaultView?.requestAnimationFrame) {
29
+ callback();
30
+ return 0;
31
+ }
32
+
33
+ const id = defaultView.requestAnimationFrame((time) => {
34
+ frames.delete(id);
35
+ if (!disposed) {
36
+ callback(time);
37
+ }
38
+ });
39
+ frames.add(id);
40
+ return id;
41
+ },
42
+ dispose() {
43
+ if (disposed) {
44
+ return;
45
+ }
46
+ disposed = true;
47
+ frames.forEach((id) => defaultView.cancelAnimationFrame(id));
48
+ frames.clear();
49
+ cleanups.forEach((cleanup) => cleanup());
50
+ cleanups.clear();
51
+ },
52
+ };
53
+ };
@@ -23,7 +23,7 @@ const getRegistry = () => {
23
23
  };
24
24
 
25
25
  const initializeInitializer = (initializer, root) => {
26
- if (!initializer.enabled() || root?.nodeType !== Node.ELEMENT_NODE) {
26
+ if (!root?.isConnected || !initializer.enabled() || root.nodeType !== Node.ELEMENT_NODE) {
27
27
  return;
28
28
  }
29
29
 
@@ -42,8 +42,11 @@ const initializeInitializer = (initializer, root) => {
42
42
  return;
43
43
  }
44
44
 
45
- initializer.initialize(target);
45
+ const cleanup = initializer.initialize(target);
46
46
  initializer.initialized.add(target);
47
+ if ('function' === typeof cleanup) {
48
+ initializer.cleanups.set(target, cleanup);
49
+ }
47
50
  });
48
51
  };
49
52
 
@@ -58,6 +61,27 @@ const initializeNode = (root) => {
58
61
  });
59
62
  };
60
63
 
64
+ // Inspect detached subtrees without relying on selectors that may have changed before removal.
65
+ const disposeNode = (root) => {
66
+ const registry = getRegistry();
67
+ if (!registry || root?.isConnected || root?.nodeType !== Node.ELEMENT_NODE) {
68
+ return;
69
+ }
70
+
71
+ [root, ...root.querySelectorAll('*')].forEach((target) => {
72
+ registry.initializers.forEach((initializer) => {
73
+ const cleanup = initializer.cleanups?.get(target);
74
+ if (!cleanup || target.isConnected) {
75
+ return;
76
+ }
77
+
78
+ initializer.cleanups.delete(target);
79
+ initializer.initialized.delete(target);
80
+ cleanup();
81
+ });
82
+ });
83
+ };
84
+
61
85
  const flushPendingNodes = () => {
62
86
  const registry = getRegistry();
63
87
  if (!registry) {
@@ -82,13 +106,20 @@ const observeDocument = () => {
82
106
 
83
107
  registry.observer = new MutationObserver((entries) => {
84
108
  entries.forEach((entry) => {
109
+ entry.removedNodes.forEach(disposeNode);
85
110
  entry.addedNodes.forEach((addedNode) => {
86
- if (addedNode?.nodeType === Node.ELEMENT_NODE) {
111
+ if (addedNode?.isConnected && addedNode.nodeType === Node.ELEMENT_NODE) {
87
112
  registry.pendingNodes.add(addedNode);
88
113
  }
89
114
  });
90
115
  });
91
116
 
117
+ registry.pendingNodes.forEach((node) => {
118
+ if (!node.isConnected) {
119
+ registry.pendingNodes.delete(node);
120
+ }
121
+ });
122
+
92
123
  if (!registry.rafId && 0 < registry.pendingNodes.size) {
93
124
  registry.rafId = requestAnimationFrame(flushPendingNodes);
94
125
  }
@@ -111,6 +142,7 @@ export const registerLayoutInitializer = ({ key, selector, initialize, enabled =
111
142
  initialize,
112
143
  enabled,
113
144
  initialized: new WeakSet(),
145
+ cleanups: new WeakMap(),
114
146
  };
115
147
 
116
148
  registry.initializers.set(key, initializer);
@@ -21,54 +21,58 @@ $font-sizes: (
21
21
  7: 6xl,
22
22
  );
23
23
 
24
- @function generate-global-gutters($context: 'viewport') {
25
- $width: var(--unitone--property--100vw);
26
- @if $context == 'container' {
27
- $width: var(--unitone--property--100cqw);
24
+ @function generate-global-gutters($context: 'viewport', $width: null) {
25
+ @if $width == null {
26
+ $width: var(--unitone--property--100vw);
27
+ @if $context == 'container' {
28
+ $width: var(--unitone--property--100cqw);
29
+ }
28
30
  }
29
31
 
30
- @return max(min(#{ $width } * .06, var(--unitone--rem2)), env(safe-area-inset-right), env(safe-area-inset-left));
32
+ @return max(min($width * .06, var(--unitone--rem2)), env(safe-area-inset-right), env(safe-area-inset-left));
31
33
  }
32
34
 
33
- @function generate-fluid-spacing($min, $max, $context: 'viewport') {
34
- $width: var(--unitone--result--100vw-px);
35
- @if $context == 'container' {
36
- $width: var(--unitone--result--100cqw-px);
35
+ @function generate-fluid-spacing($min, $max, $context: 'viewport', $width: null) {
36
+ @if $width == null {
37
+ $width: var(--unitone--result--100vw-px);
38
+ @if $context == 'container' {
39
+ $width: var(--unitone--result--100cqw-px);
40
+ }
37
41
  }
38
42
 
39
43
  @return clamp(
40
- #{ $min },
41
- #{ $min } + ((#{ $max } - #{ $min }) / (#{ $max-breakpoint - $min-breakpoint } * var(--unitone--result--1rem-px)) * (#{ $width } - (#{ $min-breakpoint } * var(--unitone--result--1rem-px)))),
42
- #{ $max }
44
+ $min,
45
+ $min + (($max - $min) / (($max-breakpoint - $min-breakpoint) * var(--unitone--result--1rem-px)) * ($width - ($min-breakpoint * var(--unitone--result--1rem-px)))),
46
+ $max
43
47
  );
44
48
  }
45
49
 
46
- @function generate-spacing($max, $context: 'viewport') {
50
+ @function generate-spacing($max, $context: 'viewport', $width: null) {
47
51
  $quotient: math.div($min-breakpoint, $max-breakpoint);
48
- $min: calc(var(--unitone--em1) + #{ $max } * #{ $quotient });
49
- @return generate-fluid-spacing(#{ $min }, #{ $max }, $context);
52
+ $min: calc(var(--unitone--em1) + $max * $quotient);
53
+ @return generate-fluid-spacing($min, $max, $context, $width);
50
54
  }
51
55
 
52
- @function generate-padding($max, $context: 'viewport') {
56
+ @function generate-padding($max, $context: 'viewport', $width: null) {
53
57
  $quotient: math.div($min-breakpoint, $max-breakpoint);
54
- $min: calc(var(--unitone--em1) + #{ $max } * #{ $quotient } * .2);
55
- @return generate-fluid-spacing(#{ $min }, #{ $max }, $context);
58
+ $min: calc(var(--unitone--em1) + $max * $quotient * .2);
59
+ @return generate-fluid-spacing($min, $max, $context, $width);
56
60
  }
57
61
 
58
62
  @function _max-font-size($level) {
59
- @return calc(var(--unitone--harmonic-sequence-base) / (var(--unitone--max-harmonic-sequence-base) - (#{ $level })));
63
+ @return calc(var(--unitone--harmonic-sequence-base) / (var(--unitone--max-harmonic-sequence-base) - ($level)));
60
64
  }
61
65
 
62
66
  @function _min-font-size($level) {
63
- @return calc(var(--unitone--harmonic-sequence-base) / (var(--unitone--min-harmonic-sequence-base) - (#{ $level })) + 1 - (var(--unitone--harmonic-sequence-base) / var(--unitone--min-harmonic-sequence-base)));
67
+ @return calc(var(--unitone--harmonic-sequence-base) / (var(--unitone--min-harmonic-sequence-base) - ($level)) + 1 - (var(--unitone--harmonic-sequence-base) / var(--unitone--min-harmonic-sequence-base)));
64
68
  }
65
69
 
66
70
  @function _font-size-scale($level) {
67
- @return calc(var(--unitone--harmonic-sequence-base) / (var(--unitone--harmonic-sequence-base) - (#{ $level })));
71
+ @return calc(var(--unitone--harmonic-sequence-base) / (var(--unitone--harmonic-sequence-base) - ($level)));
68
72
  }
69
73
 
70
74
  @function font-size-rem($level) {
71
- @return calc(#{ _font-size-scale($level) } * 1rem);
75
+ @return calc(_font-size-scale($level) * 1rem);
72
76
  }
73
77
 
74
78
  @function font-size-fluid($level, $context: 'viewport') {
@@ -79,11 +83,20 @@ $font-sizes: (
79
83
 
80
84
  $max-font-size: _max-font-size($level);
81
85
  $min-font-size: _min-font-size($level);
82
- $slope: calc((#{ $max-font-size } - #{ $min-font-size }) / (#{ $max-breakpoint - $min-breakpoint }));
83
- $intercept: calc(#{-1 * $min-breakpoint } * #{ $slope } + #{ $min-font-size });
84
- $preferred-font-size: calc((#{ $intercept } * 1rem) + (#{ $slope } * #{ $width }));
86
+ $slope: _font-size-slope($min-font-size, $max-font-size);
87
+
88
+ @return _fluid-font-size($min-font-size, $max-font-size, $slope, $width);
89
+ }
90
+
91
+ @function _font-size-slope($min-font-size, $max-font-size) {
92
+ @return calc(($max-font-size - $min-font-size) / ($max-breakpoint - $min-breakpoint));
93
+ }
85
94
 
86
- @return clamp(var(--unitone--fluid-typography-min-length, calc(1rem * #{ $min-font-size })), #{ $preferred-font-size }, var(--unitone--fluid-typography-max-length, calc(1rem * #{ $max-font-size })));
95
+ @function _fluid-font-size($min-font-size, $max-font-size, $slope, $width) {
96
+ $intercept: calc((-1 * $min-breakpoint) * $slope + $min-font-size);
97
+ $preferred-font-size: calc(($intercept * 1rem) + ($slope * $width));
98
+
99
+ @return clamp(var(--unitone--fluid-typography-min-length, calc(1rem * $min-font-size)), $preferred-font-size, var(--unitone--fluid-typography-max-length, calc(1rem * $max-font-size)));
87
100
  }
88
101
 
89
102
  /**
@@ -108,10 +121,10 @@ $font-sizes: (
108
121
  * font size the line-height stays close to max (and is clamped there).
109
122
  */
110
123
  $_min-line-height: calc(var(--unitone--min-line-height) - 0.1);
111
- $_line-height-amplitude: calc((var(--unitone--max-line-height) - #{ $_min-line-height }) * (var(--unitone--result--1rem-px) + var(--unitone--line-height-curvature)));
124
+ $_line-height-amplitude: calc((var(--unitone--max-line-height) - $_min-line-height) * (var(--unitone--result--1rem-px) + var(--unitone--line-height-curvature)));
112
125
  $_line-height: clamp(
113
126
  var(--unitone--min-line-height),
114
- (#{ $_min-line-height } + #{ $_line-height-amplitude } / (var(--unitone--result--1em-px) + var(--unitone--line-height-curvature))),
127
+ ($_min-line-height + $_line-height-amplitude / (var(--unitone--result--1em-px) + var(--unitone--line-height-curvature))),
115
128
  var(--unitone--max-line-height)
116
129
  );
117
130
 
@@ -140,53 +153,69 @@ $container-max-width: $max-breakpoint * 16px; // = 1280px
140
153
  $grid-columns: 12;
141
154
  $grid-rows: 7;
142
155
 
143
- @mixin spacing-tokens($context: 'viewport') {
144
- @if $context == 'viewport' {
145
- --unitone--s-3: var(--unitone--em-3);
146
- --unitone--s-2: var(--unitone--em-2);
147
- --unitone--s-1: var(--unitone--em-1);
148
- --unitone--s0: var(--unitone--em0);
149
- --unitone--s1: var(--unitone--em1);
156
+ @mixin static-spacing-tokens() {
157
+ --unitone--s-3: var(--unitone--em-3);
158
+ --unitone--s-2: var(--unitone--em-2);
159
+ --unitone--s-1: var(--unitone--em-1);
160
+ --unitone--s0: var(--unitone--em0);
161
+ --unitone--s1: var(--unitone--em1);
162
+ }
163
+
164
+ @mixin spacing-tokens(
165
+ $context: 'viewport',
166
+ $width: null,
167
+ $include-static: $context == 'viewport'
168
+ ) {
169
+ @if $include-static {
170
+ @include static-spacing-tokens();
150
171
  }
151
172
 
152
- --unitone--s2: #{ generate-spacing(var(--unitone--em2), $context) };
153
- --unitone--s3: #{ generate-spacing(var(--unitone--em3), $context) };
154
- --unitone--s4: #{ generate-spacing(var(--unitone--em4), $context) };
155
- --unitone--s5: #{ generate-spacing(var(--unitone--em5), $context) };
156
- --unitone--s6: #{ generate-spacing(var(--unitone--em6), $context) };
157
- --unitone--s7: #{ generate-spacing(var(--unitone--em7), $context) };
158
-
159
- --unitone--s1s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em1), $context) };
160
- --unitone--s2s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em2), $context) };
161
- --unitone--s3s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em3), $context) };
162
- --unitone--s4s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em4), $context) };
163
- --unitone--s5s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em5), $context) };
164
- --unitone--s6s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em6), $context) };
165
- --unitone--s7s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em7), $context) };
166
-
167
- --unitone--s2m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em2), $context) };
168
- --unitone--s3m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em3), $context) };
169
- --unitone--s4m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em4), $context) };
170
- --unitone--s5m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em5), $context) };
171
- --unitone--s6m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em6), $context) };
172
- --unitone--s7m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em7), $context) };
173
- }
174
-
175
- @mixin padding-tokens($context: 'viewport') {
176
- @if $context == 'viewport' {
177
- --unitone--p-3: var(--unitone--em-3);
178
- --unitone--p-2: var(--unitone--em-2);
179
- --unitone--p-1: var(--unitone--em-1);
180
- --unitone--p0: var(--unitone--em0);
181
- --unitone--p1: var(--unitone--em1);
173
+ --unitone--s2: #{ generate-spacing(var(--unitone--em2), $context, $width) };
174
+ --unitone--s3: #{ generate-spacing(var(--unitone--em3), $context, $width) };
175
+ --unitone--s4: #{ generate-spacing(var(--unitone--em4), $context, $width) };
176
+ --unitone--s5: #{ generate-spacing(var(--unitone--em5), $context, $width) };
177
+ --unitone--s6: #{ generate-spacing(var(--unitone--em6), $context, $width) };
178
+ --unitone--s7: #{ generate-spacing(var(--unitone--em7), $context, $width) };
179
+
180
+ --unitone--s1s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em1), $context, $width) };
181
+ --unitone--s2s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em2), $context, $width) };
182
+ --unitone--s3s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em3), $context, $width) };
183
+ --unitone--s4s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em4), $context, $width) };
184
+ --unitone--s5s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em5), $context, $width) };
185
+ --unitone--s6s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em6), $context, $width) };
186
+ --unitone--s7s: #{ generate-fluid-spacing(var(--unitone--em-1), var(--unitone--em7), $context, $width) };
187
+
188
+ --unitone--s2m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em2), $context, $width) };
189
+ --unitone--s3m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em3), $context, $width) };
190
+ --unitone--s4m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em4), $context, $width) };
191
+ --unitone--s5m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em5), $context, $width) };
192
+ --unitone--s6m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em6), $context, $width) };
193
+ --unitone--s7m: #{ generate-fluid-spacing(var(--unitone--em1), var(--unitone--em7), $context, $width) };
194
+ }
195
+
196
+ @mixin static-padding-tokens() {
197
+ --unitone--p-3: var(--unitone--em-3);
198
+ --unitone--p-2: var(--unitone--em-2);
199
+ --unitone--p-1: var(--unitone--em-1);
200
+ --unitone--p0: var(--unitone--em0);
201
+ --unitone--p1: var(--unitone--em1);
202
+ }
203
+
204
+ @mixin padding-tokens(
205
+ $context: 'viewport',
206
+ $width: null,
207
+ $include-static: $context == 'viewport'
208
+ ) {
209
+ @if $include-static {
210
+ @include static-padding-tokens();
182
211
  }
183
212
 
184
- --unitone--p2: #{ generate-padding(var(--unitone--em2), $context) };
185
- --unitone--p3: #{ generate-padding(var(--unitone--em3), $context) };
186
- --unitone--p4: #{ generate-padding(var(--unitone--em4), $context) };
187
- --unitone--p5: #{ generate-padding(var(--unitone--em5), $context) };
188
- --unitone--p6: #{ generate-padding(var(--unitone--em6), $context) };
189
- --unitone--p7: #{ generate-padding(var(--unitone--em7), $context) };
213
+ --unitone--p2: #{ generate-padding(var(--unitone--em2), $context, $width) };
214
+ --unitone--p3: #{ generate-padding(var(--unitone--em3), $context, $width) };
215
+ --unitone--p4: #{ generate-padding(var(--unitone--em4), $context, $width) };
216
+ --unitone--p5: #{ generate-padding(var(--unitone--em5), $context, $width) };
217
+ --unitone--p6: #{ generate-padding(var(--unitone--em6), $context, $width) };
218
+ --unitone--p7: #{ generate-padding(var(--unitone--em7), $context, $width) };
190
219
 
191
220
  --unitone--p1s: var(--unitone--s1s);
192
221
  --unitone--p2s: var(--unitone--s2s);
@@ -204,12 +233,33 @@ $grid-rows: 7;
204
233
  --unitone--p7m: var(--unitone--s7m);
205
234
  }
206
235
 
207
- @mixin font-size-tokens($context: 'viewport') {
236
+ @mixin static-font-size-tokens() {
208
237
  @each $level, $name in $font-sizes {
209
- @if $context == 'viewport' {
210
- --unitone--font-size-#{ $name }: #{ font-size-rem($level) };
238
+ --unitone--font-size-#{ $name }: #{ font-size-rem($level) };
239
+ }
240
+ }
241
+
242
+ @mixin font-size-tokens(
243
+ $context: 'viewport',
244
+ $width: null,
245
+ $include-static: $context == 'viewport'
246
+ ) {
247
+ @if $width == null {
248
+ $width: 100vw;
249
+ @if $context == 'container' {
250
+ $width: var(--unitone--property--100cqw);
211
251
  }
252
+ }
253
+
254
+ @if $include-static {
255
+ @include static-font-size-tokens();
256
+ }
257
+
258
+ @each $level, $name in $font-sizes {
259
+ $min: _min-font-size($level);
260
+ $max: _max-font-size($level);
261
+ $slope: _font-size-slope($min, $max);
212
262
 
213
- --unitone--font-size-#{ $name }-fluid: #{ font-size-fluid($level, $context) };
263
+ --unitone--font-size-#{ $name }-fluid: #{ _fluid-font-size($min, $max, $slope, $width) };
214
264
  }
215
265
  }