@kaizen/components 0.0.0-canary-container-query-titleblock-20251105031251 → 0.0.0-canary-useContainerQueries-20251121043854

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 (64) hide show
  1. package/dist/cjs/index.cjs +2 -0
  2. package/dist/cjs/src/SingleSelect/SingleSelect.cjs +0 -2
  3. package/dist/cjs/src/utils/useContainerQueries.cjs +334 -0
  4. package/dist/esm/index.mjs +1 -0
  5. package/dist/esm/src/SingleSelect/SingleSelect.mjs +0 -2
  6. package/dist/esm/src/utils/useContainerQueries.mjs +326 -0
  7. package/dist/styles.css +1 -1
  8. package/dist/types/SingleSelect/SingleSelect.d.ts +0 -2
  9. package/dist/types/utils/index.d.ts +1 -0
  10. package/dist/types/utils/useContainerQueries.d.ts +91 -0
  11. package/locales/ar.json +3 -3
  12. package/locales/bg.json +3 -3
  13. package/locales/cs.json +3 -3
  14. package/locales/cy.json +3 -3
  15. package/locales/da.json +3 -3
  16. package/locales/de.json +3 -3
  17. package/locales/el.json +3 -3
  18. package/locales/en-GB.json +3 -3
  19. package/locales/es-419.json +3 -3
  20. package/locales/es.json +3 -3
  21. package/locales/et.json +3 -3
  22. package/locales/fi.json +3 -3
  23. package/locales/fr-CA.json +3 -3
  24. package/locales/fr.json +3 -3
  25. package/locales/he.json +3 -3
  26. package/locales/hi.json +3 -3
  27. package/locales/ht.json +3 -3
  28. package/locales/hu.json +3 -3
  29. package/locales/id.json +3 -3
  30. package/locales/it.json +3 -3
  31. package/locales/ja.json +3 -3
  32. package/locales/km-KH.json +3 -3
  33. package/locales/ko.json +3 -3
  34. package/locales/lt.json +3 -3
  35. package/locales/lv.json +3 -3
  36. package/locales/mi.json +3 -3
  37. package/locales/ms.json +3 -3
  38. package/locales/nb.json +3 -3
  39. package/locales/nl.json +3 -3
  40. package/locales/pl.json +3 -3
  41. package/locales/pt-BR.json +3 -3
  42. package/locales/pt.json +3 -3
  43. package/locales/ro.json +3 -3
  44. package/locales/ru.json +3 -3
  45. package/locales/si-LK.json +3 -3
  46. package/locales/sk.json +2 -2
  47. package/locales/sr.json +3 -3
  48. package/locales/sv.json +3 -3
  49. package/locales/th.json +3 -3
  50. package/locales/tl.json +3 -3
  51. package/locales/tr.json +3 -3
  52. package/locales/uk.json +3 -3
  53. package/locales/vi.json +3 -3
  54. package/locales/zh-TW.json +3 -3
  55. package/locales/zh.json +3 -3
  56. package/package.json +1 -1
  57. package/src/SingleSelect/SingleSelect.tsx +0 -2
  58. package/src/SingleSelect/_docs/SingleSelect--api-specification.mdx +1 -3
  59. package/src/SingleSelect/_docs/SingleSelect--usage-guidelines.mdx +1 -3
  60. package/src/SingleSelect/_docs/SingleSelect.stickersheet.stories.tsx +1 -1
  61. package/src/SingleSelect/_docs/SingleSelect.stories.tsx +1 -1
  62. package/src/utils/index.ts +1 -0
  63. package/src/utils/useContainerQueries.spec.tsx +242 -0
  64. package/src/utils/useContainerQueries.tsx +333 -0
@@ -0,0 +1,326 @@
1
+ import { __assign } from 'tslib';
2
+ import React, { useMemo, useState, useRef, useCallback, useEffect } from 'react';
3
+
4
+ /**
5
+ * Tailwind CSS default container query breakpoints
6
+ * These match the default values from @tailwindcss/container-queries plugin
7
+ */
8
+ var DEFAULT_BREAKPOINTS = {
9
+ 'xs': '20rem',
10
+ // 320px
11
+ 'sm': '24rem',
12
+ // 384px
13
+ 'md': '28rem',
14
+ // 448px
15
+ 'lg': '32rem',
16
+ // 512px
17
+ 'xl': '36rem',
18
+ // 576px
19
+ '2xl': '42rem',
20
+ // 672px
21
+ '3xl': '48rem',
22
+ // 768px
23
+ '4xl': '56rem',
24
+ // 896px
25
+ '5xl': '64rem',
26
+ // 1024px
27
+ '6xl': '72rem',
28
+ // 1152px
29
+ '7xl': '80rem' // 1280px
30
+ };
31
+ /**
32
+ * Convert rem/px values to pixels for comparison
33
+ */
34
+ var parseBreakpointValue = function (value) {
35
+ if (value.endsWith('rem')) {
36
+ return parseFloat(value) * 16; // Assuming 1rem = 16px
37
+ }
38
+ if (value.endsWith('px')) {
39
+ return parseFloat(value);
40
+ }
41
+ return parseFloat(value);
42
+ };
43
+ /**
44
+ * A React hook for responding to container size changes using Tailwind CSS container query breakpoints.
45
+ *
46
+ * This hook uses ResizeObserver to detect when a container element crosses breakpoint thresholds,
47
+ * enabling component-level responsive behavior independent of viewport size.
48
+ *
49
+ * @param propQueries - Optional custom container size queries in the format { queryName: 'minWidth' }
50
+ * Example: { large: '600px', extraLarge: '48rem' }
51
+ *
52
+ * @returns An object containing:
53
+ * - containerRef: A ref to attach to your container element
54
+ * - queries: Boolean flags for each breakpoint (isXs, isSm, isMd, etc.) and custom queries
55
+ * - components: React components for conditional rendering (XsOnly, SmOrLarger, etc.)
56
+ *
57
+ * @example
58
+ * ```tsx
59
+ * const MyComponent = () => {
60
+ * const { containerRef, queries, components } = useContainerQueries()
61
+ * const { MdOrLarger } = components
62
+ *
63
+ * return (
64
+ * <div ref={containerRef}>
65
+ * {queries.isSm && <p>Small container</p>}
66
+ * <MdOrLarger>
67
+ * <p>Medium or larger container</p>
68
+ * </MdOrLarger>
69
+ * </div>
70
+ * )
71
+ * }
72
+ * ```
73
+ *
74
+ * @example With custom queries
75
+ * ```tsx
76
+ * const { containerRef, queries, components } = useContainerQueries({
77
+ * compact: '400px',
78
+ * spacious: '800px',
79
+ * })
80
+ * const { Compact, Spacious } = components
81
+ *
82
+ * return (
83
+ * <div ref={containerRef}>
84
+ * <Compact><p>Compact view</p></Compact>
85
+ * <Spacious><p>Spacious view</p></Spacious>
86
+ * </div>
87
+ * )
88
+ * ```
89
+ */
90
+ var useContainerQueries = function (propQueries) {
91
+ if (propQueries === void 0) {
92
+ propQueries = {};
93
+ }
94
+ // SSR support - return safe defaults when window is undefined
95
+ if (typeof window === 'undefined') {
96
+ return {
97
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
98
+ containerRef: function () {},
99
+ queries: {
100
+ isXs: false,
101
+ isSm: false,
102
+ isMd: false,
103
+ isLg: false,
104
+ isXl: false,
105
+ is2xl: false,
106
+ is3xl: false,
107
+ is4xl: false,
108
+ is5xl: false,
109
+ is6xl: false,
110
+ is7xl: true // Default to largest for SSR
111
+ },
112
+ components: {
113
+ 'XsOnly': function () {
114
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
115
+ },
116
+ 'SmOnly': function () {
117
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
118
+ },
119
+ 'MdOnly': function () {
120
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
121
+ },
122
+ 'LgOnly': function () {
123
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
124
+ },
125
+ 'XlOnly': function () {
126
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
127
+ },
128
+ '2xlOnly': function () {
129
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
130
+ },
131
+ '3xlOnly': function () {
132
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
133
+ },
134
+ '4xlOnly': function () {
135
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
136
+ },
137
+ '5xlOnly': function () {
138
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
139
+ },
140
+ '6xlOnly': function () {
141
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
142
+ },
143
+ '7xlOnly': function (props) {
144
+ return /*#__PURE__*/React.createElement(React.Fragment, null, props.children);
145
+ },
146
+ 'XsOrLarger': function (props) {
147
+ return /*#__PURE__*/React.createElement(React.Fragment, null, props.children);
148
+ },
149
+ 'SmOrLarger': function (props) {
150
+ return /*#__PURE__*/React.createElement(React.Fragment, null, props.children);
151
+ },
152
+ 'MdOrLarger': function (props) {
153
+ return /*#__PURE__*/React.createElement(React.Fragment, null, props.children);
154
+ },
155
+ 'LgOrLarger': function (props) {
156
+ return /*#__PURE__*/React.createElement(React.Fragment, null, props.children);
157
+ },
158
+ 'XlOrLarger': function (props) {
159
+ return /*#__PURE__*/React.createElement(React.Fragment, null, props.children);
160
+ }
161
+ }
162
+ };
163
+ }
164
+ // Parse all breakpoints to pixel values for comparison
165
+ var breakpointsPx = useMemo(function () {
166
+ return Object.entries(DEFAULT_BREAKPOINTS).reduce(function (acc, _a) {
167
+ var key = _a[0],
168
+ value = _a[1];
169
+ acc[key] = parseBreakpointValue(value);
170
+ return acc;
171
+ }, {});
172
+ }, []);
173
+ // Parse custom queries
174
+ var customQueriesPx = useMemo(function () {
175
+ return Object.entries(propQueries).reduce(function (acc, _a) {
176
+ var key = _a[0],
177
+ value = _a[1];
178
+ acc[key] = parseBreakpointValue(value);
179
+ return acc;
180
+ }, {});
181
+ }, [propQueries]);
182
+ // State to track container width
183
+ var _a = useState(0),
184
+ containerWidth = _a[0],
185
+ setContainerWidth = _a[1];
186
+ // ResizeObserver ref
187
+ var resizeObserverRef = useRef(null);
188
+ // Callback ref for the container element
189
+ var containerRef = useCallback(function (node) {
190
+ // Cleanup previous observer
191
+ if (resizeObserverRef.current) {
192
+ resizeObserverRef.current.disconnect();
193
+ resizeObserverRef.current = null;
194
+ }
195
+ if (node) {
196
+ // Create new ResizeObserver
197
+ resizeObserverRef.current = new ResizeObserver(function (entries) {
198
+ var _a, _b, _c;
199
+ for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
200
+ var entry = entries_1[_i];
201
+ // Use borderBoxSize for more accurate measurements
202
+ var width_1 = (_c = (_b = (_a = entry.borderBoxSize) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.inlineSize) !== null && _c !== void 0 ? _c : entry.contentRect.width;
203
+ setContainerWidth(width_1);
204
+ }
205
+ });
206
+ resizeObserverRef.current.observe(node);
207
+ // Set initial width
208
+ var width = node.getBoundingClientRect().width;
209
+ setContainerWidth(width);
210
+ }
211
+ }, []);
212
+ // Cleanup on unmount
213
+ useEffect(function () {
214
+ return function () {
215
+ if (resizeObserverRef.current) {
216
+ resizeObserverRef.current.disconnect();
217
+ }
218
+ };
219
+ }, []);
220
+ // Calculate breakpoint matches based on container width
221
+ var breakpointMatches = useMemo(function () {
222
+ return {
223
+ isXs: containerWidth >= breakpointsPx.xs,
224
+ isSm: containerWidth >= breakpointsPx.sm,
225
+ isMd: containerWidth >= breakpointsPx.md,
226
+ isLg: containerWidth >= breakpointsPx.lg,
227
+ isXl: containerWidth >= breakpointsPx.xl,
228
+ is2xl: containerWidth >= breakpointsPx['2xl'],
229
+ is3xl: containerWidth >= breakpointsPx['3xl'],
230
+ is4xl: containerWidth >= breakpointsPx['4xl'],
231
+ is5xl: containerWidth >= breakpointsPx['5xl'],
232
+ is6xl: containerWidth >= breakpointsPx['6xl'],
233
+ is7xl: containerWidth >= breakpointsPx['7xl']
234
+ };
235
+ }, [containerWidth, breakpointsPx]);
236
+ // Calculate custom query matches
237
+ var customMatches = useMemo(function () {
238
+ return Object.entries(customQueriesPx).reduce(function (acc, _a) {
239
+ var key = _a[0],
240
+ value = _a[1];
241
+ acc[key] = containerWidth >= value;
242
+ return acc;
243
+ }, {});
244
+ }, [containerWidth, customQueriesPx]);
245
+ // Helper function to check if container is at exact breakpoint (not larger)
246
+ var isExactBreakpoint = useCallback(function (breakpoint) {
247
+ var sortedBreakpoints = Object.entries(breakpointsPx).sort(function (_a, _b) {
248
+ var a = _a[1];
249
+ var b = _b[1];
250
+ return a - b;
251
+ });
252
+ var currentIndex = sortedBreakpoints.findIndex(function (_a) {
253
+ var key = _a[0];
254
+ return key === breakpoint;
255
+ });
256
+ var nextBreakpoint = sortedBreakpoints[currentIndex + 1];
257
+ var minWidth = breakpointsPx[breakpoint];
258
+ var maxWidth = nextBreakpoint ? nextBreakpoint[1] : Infinity;
259
+ return containerWidth >= minWidth && containerWidth < maxWidth;
260
+ }, [containerWidth, breakpointsPx]);
261
+ // Create helper components for Tailwind breakpoints
262
+ var components = useMemo(function () {
263
+ return __assign({
264
+ 'XsOnly': function (props) {
265
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('xs') && props.children);
266
+ },
267
+ 'SmOnly': function (props) {
268
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('sm') && props.children);
269
+ },
270
+ 'MdOnly': function (props) {
271
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('md') && props.children);
272
+ },
273
+ 'LgOnly': function (props) {
274
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('lg') && props.children);
275
+ },
276
+ 'XlOnly': function (props) {
277
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('xl') && props.children);
278
+ },
279
+ '2xlOnly': function (props) {
280
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('2xl') && props.children);
281
+ },
282
+ '3xlOnly': function (props) {
283
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('3xl') && props.children);
284
+ },
285
+ '4xlOnly': function (props) {
286
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('4xl') && props.children);
287
+ },
288
+ '5xlOnly': function (props) {
289
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('5xl') && props.children);
290
+ },
291
+ '6xlOnly': function (props) {
292
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('6xl') && props.children);
293
+ },
294
+ '7xlOnly': function (props) {
295
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isExactBreakpoint('7xl') && props.children);
296
+ },
297
+ 'XsOrLarger': function (props) {
298
+ return /*#__PURE__*/React.createElement(React.Fragment, null, breakpointMatches.isXs && props.children);
299
+ },
300
+ 'SmOrLarger': function (props) {
301
+ return /*#__PURE__*/React.createElement(React.Fragment, null, breakpointMatches.isSm && props.children);
302
+ },
303
+ 'MdOrLarger': function (props) {
304
+ return /*#__PURE__*/React.createElement(React.Fragment, null, breakpointMatches.isMd && props.children);
305
+ },
306
+ 'LgOrLarger': function (props) {
307
+ return /*#__PURE__*/React.createElement(React.Fragment, null, breakpointMatches.isLg && props.children);
308
+ },
309
+ 'XlOrLarger': function (props) {
310
+ return /*#__PURE__*/React.createElement(React.Fragment, null, breakpointMatches.isXl && props.children);
311
+ }
312
+ }, Object.keys(customQueriesPx).reduce(function (acc, key) {
313
+ var componentName = key.charAt(0).toUpperCase() + key.slice(1);
314
+ acc[componentName] = function (props) {
315
+ return /*#__PURE__*/React.createElement(React.Fragment, null, customMatches[key] && props.children);
316
+ };
317
+ return acc;
318
+ }, {}));
319
+ }, [breakpointMatches, customMatches, isExactBreakpoint, customQueriesPx]);
320
+ return {
321
+ containerRef: containerRef,
322
+ queries: __assign(__assign({}, breakpointMatches), customMatches),
323
+ components: components
324
+ };
325
+ };
326
+ export { useContainerQueries };
package/dist/styles.css CHANGED
@@ -1,4 +1,4 @@
1
- @layer tokens, normalize, reset, kz-components;@layer tokens{:root{--animation-easing-function-ease-in-out:cubic-bezier(0.455,0.03,0.515,0.955);--animation-easing-function-ease-in:cubic-bezier(0.55,0.085,0.68,0.53);--animation-easing-function-ease-out:cubic-bezier(0.25,0.46,0.45,0.94);--animation-easing-function-linear:linear;--animation-easing-function-bounce-in:cubic-bezier(0.485,0.155,0.24,1.245);--animation-easing-function-bounce-out:cubic-bezier(0.485,0.155,0.515,0.845);--animation-easing-function-bounce-in-out:cubic-bezier(0.76,-0.245,0.24,1.245);--animation-duration-instant:0ms;--animation-duration-immediate:100ms;--animation-duration-rapid:200ms;--animation-duration-fast:300ms;--animation-duration-slow:400ms;--animation-duration-deliberate:700ms;--border-solid-border-width:2px;--border-solid-border-radius:7px;--border-solid-border-style:solid;--border-solid-border-color:#e1e2ea;--border-solid-border-color-rgb:225,226,234;--border-dashed-border-width:2px;--border-dashed-border-radius:7px;--border-dashed-border-style:dashed;--border-borderless-border-width:2px;--border-borderless-border-radius:7px;--border-borderless-border-style:solid;--border-borderless-border-color:transparent;--border-borderless-border-color-rgb:0,0,0;--border-focus-ring-border-width:2px;--border-focus-ring-border-radius:10px;--border-focus-ring-border-style:solid;--border-width-1:1px;--color-purple-100:#f4edf8;--color-purple-100-rgb:244,237,248;--color-purple-200:#dfc9ea;--color-purple-200-rgb:223,201,234;--color-purple-300:#c9a5dd;--color-purple-300-rgb:201,165,221;--color-purple-400:#ae67b1;--color-purple-400-rgb:174,103,177;--color-purple-500:#844587;--color-purple-500-rgb:132,69,135;--color-purple-600:#5f3361;--color-purple-600-rgb:95,51,97;--color-purple-700:#4a234d;--color-purple-700-rgb:74,35,77;--color-purple-800:#2f2438;--color-purple-800-rgb:47,36,56;--color-blue-100:#e6f6ff;--color-blue-100-rgb:230,246,255;--color-blue-200:#bde2f5;--color-blue-200-rgb:189,226,245;--color-blue-300:#73c0e8;--color-blue-300-rgb:115,192,232;--color-blue-400:#008bd6;--color-blue-400-rgb:0,139,214;--color-blue-500:#0168b3;--color-blue-500-rgb:1,104,179;--color-blue-600:#004970;--color-blue-600-rgb:0,73,112;--color-blue-700:#003157;--color-blue-700-rgb:0,49,87;--color-green-100:#e8f8f4;--color-green-100-rgb:232,248,244;--color-green-200:#c4ede2;--color-green-200-rgb:196,237,226;--color-green-300:#8fdbc7;--color-green-300-rgb:143,219,199;--color-green-400:#5dcaad;--color-green-400-rgb:93,202,173;--color-green-500:#3f9a86;--color-green-500-rgb:63,154,134;--color-green-600:#2c7d67;--color-green-600-rgb:44,125,103;--color-green-700:#22594a;--color-green-700-rgb:34,89,74;--color-yellow-100:#fff9e4;--color-yellow-100-rgb:255,249,228;--color-yellow-200:#ffeeb3;--color-yellow-200-rgb:255,238,179;--color-yellow-300:#ffe36e;--color-yellow-300-rgb:255,227,110;--color-yellow-400:#ffca4d;--color-yellow-400-rgb:255,202,77;--color-yellow-500:#ffb600;--color-yellow-500-rgb:255,182,0;--color-yellow-600:#c68600;--color-yellow-600-rgb:198,134,0;--color-yellow-700:#876400;--color-yellow-700-rgb:135,100,0;--color-red-100:#fdeaee;--color-red-100-rgb:253,234,238;--color-red-200:#f9c2cb;--color-red-200-rgb:249,194,203;--color-red-300:#f597a8;--color-red-300-rgb:245,151,168;--color-red-400:#e0707d;--color-red-400-rgb:224,112,125;--color-red-500:#c93b55;--color-red-500-rgb:201,59,85;--color-red-600:#a82433;--color-red-600-rgb:168,36,51;--color-red-700:#6c1e20;--color-red-700-rgb:108,30,32;--color-orange-100:#fff0e8;--color-orange-100-rgb:255,240,232;--color-orange-200:#ffd1b9;--color-orange-200-rgb:255,209,185;--color-orange-300:#ffb08a;--color-orange-300-rgb:255,176,138;--color-orange-400:#ff9461;--color-orange-400-rgb:255,148,97;--color-orange-500:#e96c2f;--color-orange-500-rgb:233,108,47;--color-orange-600:#b74302;--color-orange-600-rgb:183,67,2;--color-orange-700:#903c00;--color-orange-700-rgb:144,60,0;--color-gray-100:#f9f9f9;--color-gray-100-rgb:249,249,249;--color-gray-200:#f4f4f5;--color-gray-200-rgb:244,244,245;--color-gray-300:#eaeaec;--color-gray-300-rgb:234,234,236;--color-gray-400:#cdcdd0;--color-gray-400-rgb:205,205,208;--color-gray-500:#878792;--color-gray-500-rgb:135,135,146;--color-gray-600:#524e56;--color-gray-600-rgb:82,78,86;--color-white:#fff;--color-white-rgb:255,255,255;--color-black:#000;--color-black-rgb:0,0,0;--data-viz-favorable:#7dd5bd;--data-viz-favorable-rgb:125,213,189;--data-viz-unfavorable:#e68d97;--data-viz-unfavorable-rgb:230,141,151;--layout-content-max-width:1392px;--layout-content-max-width-with-sidebar:1080px;--layout-content-side-margin:72px;--layout-mobile-actions-drawer-height:60px;--layout-navigation-bar-height:72px;--layout-breakpoints-medium:768px;--layout-breakpoints-large:1080px;--shadow-small-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 3px 16px 0 rgba(0,0,0,.06);--shadow-large-box-shadow:0 3px 9px 0 rgba(0,0,0,.1),0 8px 40px 0 rgba(0,0,0,.08);--spacing-0:0;--spacing-1:.0625rem;--spacing-2:.125rem;--spacing-4:.25rem;--spacing-6:.375rem;--spacing-8:.5rem;--spacing-12:.75rem;--spacing-16:1rem;--spacing-20:1.25rem;--spacing-24:1.5rem;--spacing-32:2rem;--spacing-40:2.5rem;--spacing-48:3rem;--spacing-56:3.5rem;--spacing-64:4rem;--spacing-72:4.5rem;--spacing-80:5rem;--spacing-96:6rem;--spacing-112:7rem;--spacing-128:8rem;--spacing-160:10rem;--spacing-200:12.5rem;--spacing-240:15rem;--spacing-280:17.5rem;--spacing-320:20rem;--spacing-xs:0.375rem;--spacing-sm:0.75rem;--spacing-md:1.5rem;--spacing-lg:2.25rem;--spacing-xl:3rem;--spacing-xxl:3.75rem;--spacing-xxxl:4.5rem;--spacing-xxxxl:5.25rem;--spacing-xxxxxl:6rem;--typography-data-large-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-large-font-weight:700;--typography-data-large-font-size:5.25rem;--typography-data-large-line-height:5.25rem;--typography-data-large-letter-spacing:normal;--typography-data-large-units-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-large-units-font-weight:700;--typography-data-large-units-font-size:2.625rem;--typography-data-large-units-line-height:5.25rem;--typography-data-large-units-letter-spacing:normal;--typography-data-medium-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-medium-font-weight:700;--typography-data-medium-font-size:3rem;--typography-data-medium-line-height:5rem;--typography-data-medium-letter-spacing:normal;--typography-data-medium-units-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-medium-units-font-weight:700;--typography-data-medium-units-font-size:1.5rem;--typography-data-medium-units-line-height:5rem;--typography-data-medium-units-letter-spacing:normal;--typography-data-small-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-small-font-weight:700;--typography-data-small-font-size:1.5rem;--typography-data-small-line-height:1.5rem;--typography-data-small-letter-spacing:normal;--typography-data-small-units-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-small-units-font-weight:700;--typography-data-small-units-font-size:1.125rem;--typography-data-small-units-line-height:1.5rem;--typography-data-small-units-letter-spacing:normal;--typography-display-0-font-family:"Tiempos Headline",Georgia,serif;--typography-display-0-font-weight:800;--typography-display-0-font-size:4.5rem;--typography-display-0-line-height:5.25rem;--typography-display-0-letter-spacing:0em;--typography-heading-1-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-1-font-weight:500;--typography-heading-1-font-size:2.125rem;--typography-heading-1-line-height:2.625rem;--typography-heading-1-letter-spacing:normal;--typography-heading-2-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-2-font-weight:600;--typography-heading-2-font-size:1.75rem;--typography-heading-2-line-height:2.25rem;--typography-heading-2-letter-spacing:normal;--typography-heading-3-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-3-font-weight:600;--typography-heading-3-font-size:1.375rem;--typography-heading-3-line-height:1.875rem;--typography-heading-3-letter-spacing:normal;--typography-heading-4-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-4-font-weight:600;--typography-heading-4-font-size:1.125rem;--typography-heading-4-line-height:1.5rem;--typography-heading-4-letter-spacing:normal;--typography-heading-5-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-5-font-weight:600;--typography-heading-5-font-size:1rem;--typography-heading-5-line-height:1.5rem;--typography-heading-5-letter-spacing:normal;--typography-heading-6-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-6-font-weight:600;--typography-heading-6-font-size:0.875rem;--typography-heading-6-line-height:1.5rem;--typography-heading-6-letter-spacing:normal;--typography-paragraph-intro-lede-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-paragraph-intro-lede-font-weight:400;--typography-paragraph-intro-lede-font-size:1.25rem;--typography-paragraph-intro-lede-line-height:1.875rem;--typography-paragraph-intro-lede-letter-spacing:0;--typography-paragraph-intro-lede-max-width:975px;--typography-paragraph-body-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-paragraph-body-font-weight:400;--typography-paragraph-body-font-size:1rem;--typography-paragraph-body-line-height:1.5rem;--typography-paragraph-body-letter-spacing:normal;--typography-paragraph-body-max-width:780px;--typography-paragraph-small-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-paragraph-small-font-weight:400;--typography-paragraph-small-font-size:0.875rem;--typography-paragraph-small-line-height:1.125rem;--typography-paragraph-small-letter-spacing:normal;--typography-paragraph-small-max-width:680px;--typography-paragraph-extra-small-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-paragraph-extra-small-font-weight:400;--typography-paragraph-extra-small-font-size:0.75rem;--typography-paragraph-extra-small-line-height:1.125rem;--typography-paragraph-extra-small-letter-spacing:normal;--typography-paragraph-extra-small-max-width:600px;--typography-paragraph-bold-font-weight:600;--typography-button-primary-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-button-primary-font-weight:500;--typography-button-primary-font-size:1.125rem;--typography-button-primary-line-height:1.5rem;--typography-button-primary-letter-spacing:normal;--typography-button-secondary-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-button-secondary-font-weight:500;--typography-button-secondary-font-size:1rem;--typography-button-secondary-line-height:1.5rem;--typography-button-secondary-letter-spacing:normal}}@layer normalize{html{text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{appearance:auto}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{appearance:none}::-webkit-file-upload-button{appearance:auto;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}}@layer reset{@font-face{font-family:Tiempos Headline;font-weight:800;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/tiempos/tiempos-headline-bold.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/tiempos/tiempos-headline-bold.woff)}@font-face{font-family:Tiempos Headline;font-weight:500;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/tiempos/tiempos-headline-medium.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/tiempos/tiempos-headline-medium.woff)}@font-face{font-family:Greycliff CF;font-weight:300;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-light.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:400;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-regular.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:500;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-medium.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:600;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-demi-bold.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:700;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-bold.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:800;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-extra-bold.woff) format("woff")}@font-face{font-family:Inter;font-weight:300;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-light.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-light.woff)}@font-face{font-family:Inter;font-weight:400;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-regular.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-regular.woff)}@font-face{font-family:Inter;font-weight:500;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-medium.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-medium.woff)}@font-face{font-family:Inter;font-weight:600;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-demi-bold.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-demi-bold.woff)}@font-face{font-family:Inter;font-weight:700;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-bold.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-bold.woff)}@font-face{font-family:Inter;font-weight:800;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-extra-bold.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-extra-bold.woff)}@font-face{font-family:IBM Plex Mono;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/ibm-plex-mono/ibm-plex-mono-regular.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/ibm-plex-mono/ibm-plex-mono-regular.woff)}}@layer reset{*,:after,:before{border-color:var(--border-solid-border-color,"currentColor");border-style:solid;border-width:0}body{container-type:inline-size}}
1
+ @layer tokens, normalize, reset, kz-components;@layer tokens{:root{--animation-easing-function-ease-in-out:cubic-bezier(0.455,0.03,0.515,0.955);--animation-easing-function-ease-in:cubic-bezier(0.55,0.085,0.68,0.53);--animation-easing-function-ease-out:cubic-bezier(0.25,0.46,0.45,0.94);--animation-easing-function-linear:linear;--animation-easing-function-bounce-in:cubic-bezier(0.485,0.155,0.24,1.245);--animation-easing-function-bounce-out:cubic-bezier(0.485,0.155,0.515,0.845);--animation-easing-function-bounce-in-out:cubic-bezier(0.76,-0.245,0.24,1.245);--animation-duration-instant:0ms;--animation-duration-immediate:100ms;--animation-duration-rapid:200ms;--animation-duration-fast:300ms;--animation-duration-slow:400ms;--animation-duration-deliberate:700ms;--border-solid-border-width:2px;--border-solid-border-radius:7px;--border-solid-border-style:solid;--border-solid-border-color:#e1e2ea;--border-solid-border-color-rgb:225,226,234;--border-dashed-border-width:2px;--border-dashed-border-radius:7px;--border-dashed-border-style:dashed;--border-borderless-border-width:2px;--border-borderless-border-radius:7px;--border-borderless-border-style:solid;--border-borderless-border-color:transparent;--border-borderless-border-color-rgb:0,0,0;--border-focus-ring-border-width:2px;--border-focus-ring-border-radius:10px;--border-focus-ring-border-style:solid;--border-width-1:1px;--color-purple-100:#f4edf8;--color-purple-100-rgb:244,237,248;--color-purple-200:#dfc9ea;--color-purple-200-rgb:223,201,234;--color-purple-300:#c9a5dd;--color-purple-300-rgb:201,165,221;--color-purple-400:#ae67b1;--color-purple-400-rgb:174,103,177;--color-purple-500:#844587;--color-purple-500-rgb:132,69,135;--color-purple-600:#5f3361;--color-purple-600-rgb:95,51,97;--color-purple-700:#4a234d;--color-purple-700-rgb:74,35,77;--color-purple-800:#2f2438;--color-purple-800-rgb:47,36,56;--color-blue-100:#e6f6ff;--color-blue-100-rgb:230,246,255;--color-blue-200:#bde2f5;--color-blue-200-rgb:189,226,245;--color-blue-300:#73c0e8;--color-blue-300-rgb:115,192,232;--color-blue-400:#008bd6;--color-blue-400-rgb:0,139,214;--color-blue-500:#0168b3;--color-blue-500-rgb:1,104,179;--color-blue-600:#004970;--color-blue-600-rgb:0,73,112;--color-blue-700:#003157;--color-blue-700-rgb:0,49,87;--color-green-100:#e8f8f4;--color-green-100-rgb:232,248,244;--color-green-200:#c4ede2;--color-green-200-rgb:196,237,226;--color-green-300:#8fdbc7;--color-green-300-rgb:143,219,199;--color-green-400:#5dcaad;--color-green-400-rgb:93,202,173;--color-green-500:#3f9a86;--color-green-500-rgb:63,154,134;--color-green-600:#2c7d67;--color-green-600-rgb:44,125,103;--color-green-700:#22594a;--color-green-700-rgb:34,89,74;--color-yellow-100:#fff9e4;--color-yellow-100-rgb:255,249,228;--color-yellow-200:#ffeeb3;--color-yellow-200-rgb:255,238,179;--color-yellow-300:#ffe36e;--color-yellow-300-rgb:255,227,110;--color-yellow-400:#ffca4d;--color-yellow-400-rgb:255,202,77;--color-yellow-500:#ffb600;--color-yellow-500-rgb:255,182,0;--color-yellow-600:#c68600;--color-yellow-600-rgb:198,134,0;--color-yellow-700:#876400;--color-yellow-700-rgb:135,100,0;--color-red-100:#fdeaee;--color-red-100-rgb:253,234,238;--color-red-200:#f9c2cb;--color-red-200-rgb:249,194,203;--color-red-300:#f597a8;--color-red-300-rgb:245,151,168;--color-red-400:#e0707d;--color-red-400-rgb:224,112,125;--color-red-500:#c93b55;--color-red-500-rgb:201,59,85;--color-red-600:#a82433;--color-red-600-rgb:168,36,51;--color-red-700:#6c1e20;--color-red-700-rgb:108,30,32;--color-orange-100:#fff0e8;--color-orange-100-rgb:255,240,232;--color-orange-200:#ffd1b9;--color-orange-200-rgb:255,209,185;--color-orange-300:#ffb08a;--color-orange-300-rgb:255,176,138;--color-orange-400:#ff9461;--color-orange-400-rgb:255,148,97;--color-orange-500:#e96c2f;--color-orange-500-rgb:233,108,47;--color-orange-600:#b74302;--color-orange-600-rgb:183,67,2;--color-orange-700:#903c00;--color-orange-700-rgb:144,60,0;--color-gray-100:#f9f9f9;--color-gray-100-rgb:249,249,249;--color-gray-200:#f4f4f5;--color-gray-200-rgb:244,244,245;--color-gray-300:#eaeaec;--color-gray-300-rgb:234,234,236;--color-gray-400:#cdcdd0;--color-gray-400-rgb:205,205,208;--color-gray-500:#878792;--color-gray-500-rgb:135,135,146;--color-gray-600:#524e56;--color-gray-600-rgb:82,78,86;--color-white:#fff;--color-white-rgb:255,255,255;--color-black:#000;--color-black-rgb:0,0,0;--data-viz-favorable:#7dd5bd;--data-viz-favorable-rgb:125,213,189;--data-viz-unfavorable:#e68d97;--data-viz-unfavorable-rgb:230,141,151;--layout-content-max-width:1392px;--layout-content-max-width-with-sidebar:1080px;--layout-content-side-margin:72px;--layout-mobile-actions-drawer-height:60px;--layout-navigation-bar-height:72px;--layout-breakpoints-medium:768px;--layout-breakpoints-large:1080px;--shadow-small-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 3px 16px 0 rgba(0,0,0,.06);--shadow-large-box-shadow:0 3px 9px 0 rgba(0,0,0,.1),0 8px 40px 0 rgba(0,0,0,.08);--spacing-0:0;--spacing-1:.0625rem;--spacing-2:.125rem;--spacing-4:.25rem;--spacing-6:.375rem;--spacing-8:.5rem;--spacing-12:.75rem;--spacing-16:1rem;--spacing-20:1.25rem;--spacing-24:1.5rem;--spacing-32:2rem;--spacing-40:2.5rem;--spacing-48:3rem;--spacing-56:3.5rem;--spacing-64:4rem;--spacing-72:4.5rem;--spacing-80:5rem;--spacing-96:6rem;--spacing-112:7rem;--spacing-128:8rem;--spacing-160:10rem;--spacing-200:12.5rem;--spacing-240:15rem;--spacing-280:17.5rem;--spacing-320:20rem;--spacing-xs:0.375rem;--spacing-sm:0.75rem;--spacing-md:1.5rem;--spacing-lg:2.25rem;--spacing-xl:3rem;--spacing-xxl:3.75rem;--spacing-xxxl:4.5rem;--spacing-xxxxl:5.25rem;--spacing-xxxxxl:6rem;--typography-data-large-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-large-font-weight:700;--typography-data-large-font-size:5.25rem;--typography-data-large-line-height:5.25rem;--typography-data-large-letter-spacing:normal;--typography-data-large-units-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-large-units-font-weight:700;--typography-data-large-units-font-size:2.625rem;--typography-data-large-units-line-height:5.25rem;--typography-data-large-units-letter-spacing:normal;--typography-data-medium-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-medium-font-weight:700;--typography-data-medium-font-size:3rem;--typography-data-medium-line-height:5rem;--typography-data-medium-letter-spacing:normal;--typography-data-medium-units-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-medium-units-font-weight:700;--typography-data-medium-units-font-size:1.5rem;--typography-data-medium-units-line-height:5rem;--typography-data-medium-units-letter-spacing:normal;--typography-data-small-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-small-font-weight:700;--typography-data-small-font-size:1.5rem;--typography-data-small-line-height:1.5rem;--typography-data-small-letter-spacing:normal;--typography-data-small-units-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-data-small-units-font-weight:700;--typography-data-small-units-font-size:1.125rem;--typography-data-small-units-line-height:1.5rem;--typography-data-small-units-letter-spacing:normal;--typography-display-0-font-family:"Tiempos Headline",Georgia,serif;--typography-display-0-font-weight:800;--typography-display-0-font-size:4.5rem;--typography-display-0-line-height:5.25rem;--typography-display-0-letter-spacing:0em;--typography-heading-1-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-1-font-weight:500;--typography-heading-1-font-size:2.125rem;--typography-heading-1-line-height:2.625rem;--typography-heading-1-letter-spacing:normal;--typography-heading-2-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-2-font-weight:600;--typography-heading-2-font-size:1.75rem;--typography-heading-2-line-height:2.25rem;--typography-heading-2-letter-spacing:normal;--typography-heading-3-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-3-font-weight:600;--typography-heading-3-font-size:1.375rem;--typography-heading-3-line-height:1.875rem;--typography-heading-3-letter-spacing:normal;--typography-heading-4-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-4-font-weight:600;--typography-heading-4-font-size:1.125rem;--typography-heading-4-line-height:1.5rem;--typography-heading-4-letter-spacing:normal;--typography-heading-5-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-5-font-weight:600;--typography-heading-5-font-size:1rem;--typography-heading-5-line-height:1.5rem;--typography-heading-5-letter-spacing:normal;--typography-heading-6-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-heading-6-font-weight:600;--typography-heading-6-font-size:0.875rem;--typography-heading-6-line-height:1.5rem;--typography-heading-6-letter-spacing:normal;--typography-paragraph-intro-lede-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-paragraph-intro-lede-font-weight:400;--typography-paragraph-intro-lede-font-size:1.25rem;--typography-paragraph-intro-lede-line-height:1.875rem;--typography-paragraph-intro-lede-letter-spacing:0;--typography-paragraph-intro-lede-max-width:975px;--typography-paragraph-body-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-paragraph-body-font-weight:400;--typography-paragraph-body-font-size:1rem;--typography-paragraph-body-line-height:1.5rem;--typography-paragraph-body-letter-spacing:normal;--typography-paragraph-body-max-width:780px;--typography-paragraph-small-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-paragraph-small-font-weight:400;--typography-paragraph-small-font-size:0.875rem;--typography-paragraph-small-line-height:1.125rem;--typography-paragraph-small-letter-spacing:normal;--typography-paragraph-small-max-width:680px;--typography-paragraph-extra-small-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-paragraph-extra-small-font-weight:400;--typography-paragraph-extra-small-font-size:0.75rem;--typography-paragraph-extra-small-line-height:1.125rem;--typography-paragraph-extra-small-letter-spacing:normal;--typography-paragraph-extra-small-max-width:600px;--typography-paragraph-bold-font-weight:600;--typography-button-primary-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-button-primary-font-weight:500;--typography-button-primary-font-size:1.125rem;--typography-button-primary-line-height:1.5rem;--typography-button-primary-letter-spacing:normal;--typography-button-secondary-font-family:"Inter","Noto Sans",Helvetica,Arial,sans-serif;--typography-button-secondary-font-weight:500;--typography-button-secondary-font-size:1rem;--typography-button-secondary-line-height:1.5rem;--typography-button-secondary-letter-spacing:normal}}@layer normalize{html{text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{appearance:auto}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{appearance:none}::-webkit-file-upload-button{appearance:auto;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}}@layer reset{@font-face{font-family:Tiempos Headline;font-weight:800;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/tiempos/tiempos-headline-bold.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/tiempos/tiempos-headline-bold.woff)}@font-face{font-family:Tiempos Headline;font-weight:500;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/tiempos/tiempos-headline-medium.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/tiempos/tiempos-headline-medium.woff)}@font-face{font-family:Greycliff CF;font-weight:300;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-light.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:400;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-regular.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:500;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-medium.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:600;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-demi-bold.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:700;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-bold.woff) format("woff")}@font-face{font-family:Greycliff CF;font-weight:800;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/greycliff/greycliff-cf-extra-bold.woff) format("woff")}@font-face{font-family:Inter;font-weight:300;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-light.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-light.woff)}@font-face{font-family:Inter;font-weight:400;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-regular.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-regular.woff)}@font-face{font-family:Inter;font-weight:500;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-medium.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-medium.woff)}@font-face{font-family:Inter;font-weight:600;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-demi-bold.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-demi-bold.woff)}@font-face{font-family:Inter;font-weight:700;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-bold.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-bold.woff)}@font-face{font-family:Inter;font-weight:800;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-extra-bold.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/inter/inter-extra-bold.woff)}@font-face{font-family:IBM Plex Mono;src:url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/ibm-plex-mono/ibm-plex-mono-regular.woff2),url(https://d1e7r7b0lb8p4d.cloudfront.net/fonts/ibm-plex-mono/ibm-plex-mono-regular.woff)}}@layer reset{*,:after,:before{border-color:var(--border-solid-border-color,"currentColor");border-style:solid;border-width:0}body{container-type:inline-size;min-height:100vh}}
2
2
  @layer kz-components {
3
3
  /*
4
4
  * This is taken from the Material Symbols CDN
@@ -57,8 +57,6 @@ export type SingleSelectProps<Option extends SingleSelectOption = SingleSelectOp
57
57
  onSelectionChange?: (key: Key) => void;
58
58
  } & OverrideClassName<Omit<AriaSelectProps<Option>, OmittedAriaSelectProps>>;
59
59
  /**
60
- * @deprecated SingleSelect is deprecated in v3 and will be replaced in v4.
61
- *
62
60
  * {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3081896474/Select Guidance} |
63
61
  * {@link https://cultureamp.design/?path=/docs/components-select--docs Storybook}
64
62
  */
@@ -1,3 +1,4 @@
1
1
  export * from './useMediaQueries';
2
+ export * from './useContainerQueries';
2
3
  export * from './hostedAssets';
3
4
  export * from './ReversedColors';
@@ -0,0 +1,91 @@
1
+ import React, { type ReactNode } from 'react';
2
+ type Props = Record<string, string>;
3
+ type GenericChildrenType = {
4
+ children?: ReactNode;
5
+ };
6
+ type ContainerQueries = {
7
+ isXs: boolean;
8
+ isSm: boolean;
9
+ isMd: boolean;
10
+ isLg: boolean;
11
+ isXl: boolean;
12
+ is2xl: boolean;
13
+ is3xl: boolean;
14
+ is4xl: boolean;
15
+ is5xl: boolean;
16
+ is6xl: boolean;
17
+ is7xl: boolean;
18
+ [key: string]: boolean;
19
+ };
20
+ type ContainerComponents = {
21
+ 'XsOnly': (props: GenericChildrenType) => JSX.Element;
22
+ 'SmOnly': (props: GenericChildrenType) => JSX.Element;
23
+ 'MdOnly': (props: GenericChildrenType) => JSX.Element;
24
+ 'LgOnly': (props: GenericChildrenType) => JSX.Element;
25
+ 'XlOnly': (props: GenericChildrenType) => JSX.Element;
26
+ '2xlOnly': (props: GenericChildrenType) => JSX.Element;
27
+ '3xlOnly': (props: GenericChildrenType) => JSX.Element;
28
+ '4xlOnly': (props: GenericChildrenType) => JSX.Element;
29
+ '5xlOnly': (props: GenericChildrenType) => JSX.Element;
30
+ '6xlOnly': (props: GenericChildrenType) => JSX.Element;
31
+ '7xlOnly': (props: GenericChildrenType) => JSX.Element;
32
+ 'XsOrLarger': (props: GenericChildrenType) => JSX.Element;
33
+ 'SmOrLarger': (props: GenericChildrenType) => JSX.Element;
34
+ 'MdOrLarger': (props: GenericChildrenType) => JSX.Element;
35
+ 'LgOrLarger': (props: GenericChildrenType) => JSX.Element;
36
+ 'XlOrLarger': (props: GenericChildrenType) => JSX.Element;
37
+ [key: string]: (props: GenericChildrenType) => JSX.Element;
38
+ };
39
+ /**
40
+ * A React hook for responding to container size changes using Tailwind CSS container query breakpoints.
41
+ *
42
+ * This hook uses ResizeObserver to detect when a container element crosses breakpoint thresholds,
43
+ * enabling component-level responsive behavior independent of viewport size.
44
+ *
45
+ * @param propQueries - Optional custom container size queries in the format { queryName: 'minWidth' }
46
+ * Example: { large: '600px', extraLarge: '48rem' }
47
+ *
48
+ * @returns An object containing:
49
+ * - containerRef: A ref to attach to your container element
50
+ * - queries: Boolean flags for each breakpoint (isXs, isSm, isMd, etc.) and custom queries
51
+ * - components: React components for conditional rendering (XsOnly, SmOrLarger, etc.)
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * const MyComponent = () => {
56
+ * const { containerRef, queries, components } = useContainerQueries()
57
+ * const { MdOrLarger } = components
58
+ *
59
+ * return (
60
+ * <div ref={containerRef}>
61
+ * {queries.isSm && <p>Small container</p>}
62
+ * <MdOrLarger>
63
+ * <p>Medium or larger container</p>
64
+ * </MdOrLarger>
65
+ * </div>
66
+ * )
67
+ * }
68
+ * ```
69
+ *
70
+ * @example With custom queries
71
+ * ```tsx
72
+ * const { containerRef, queries, components } = useContainerQueries({
73
+ * compact: '400px',
74
+ * spacious: '800px',
75
+ * })
76
+ * const { Compact, Spacious } = components
77
+ *
78
+ * return (
79
+ * <div ref={containerRef}>
80
+ * <Compact><p>Compact view</p></Compact>
81
+ * <Spacious><p>Spacious view</p></Spacious>
82
+ * </div>
83
+ * )
84
+ * ```
85
+ */
86
+ export declare const useContainerQueries: (propQueries?: Props) => {
87
+ containerRef: React.RefCallback<HTMLElement>;
88
+ queries: ContainerQueries;
89
+ components: ContainerComponents;
90
+ };
91
+ export {};
package/locales/ar.json CHANGED
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "عرض الاقتراحات لـ {field}"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "محو تحديد {field}"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "محو الاختيار: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
package/locales/bg.json CHANGED
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Покажи предложения за {field}"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Изчисти избора {field}"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Изчистване на избора: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
package/locales/cs.json CHANGED
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Zobrazit návrhy pro pole {field}"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Zrušit výběr pole {field}"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Vymazat výběr: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
package/locales/cy.json CHANGED
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Dangos awgrymiadau ar gyfer {field}"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Clirio dewis {field}"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Clirio'r dewisiad: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
package/locales/da.json CHANGED
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Vis forslag for {field}"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Ryd {field} valg"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Ryd valg: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
package/locales/de.json CHANGED
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Vorschläge für {field} anzeigen"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Auswahl für {field} löschen"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Auswahl löschen: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
package/locales/el.json CHANGED
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Εμφάνιση προτάσεων για το πεδίο \"{field}\""
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Διαγραφή επιλογής πεδίου \"{field}\""
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Απαλοιφή επιλογής: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Show suggestions for {field}"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Clear {field} selection"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Clear selection: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Mostrar sugerencias para {field}"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Borrar la selección de {field}"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Borrar selección: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",
package/locales/es.json CHANGED
@@ -224,9 +224,9 @@
224
224
  "description" : "Aria label text for the SingleSelect button to open and close suggestions list",
225
225
  "message" : "Mostrar sugerencias para {field}"
226
226
  },
227
- "singleSelect.clearButtonAlt" : {
228
- "description" : "Alt text for the clear selection button",
229
- "message" : "Borrar la selección {field}"
227
+ "singleSelect.clearButtonAlt_v2" : {
228
+ "description" : "Alt text for the clear selection button. The button clears the selection the user has made via a dropdown. The field placeholder is the label of the dropdown.",
229
+ "message" : "Borrar selección: {field}"
230
230
  },
231
231
  "splitButton.dropdownButton.label" : {
232
232
  "description" : "Label for a dropdown menu holding additional actions",