@astryxdesign/lab 0.4.7-canary.b7fc8b1 → 0.4.7-canary.de6d448

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 (43) hide show
  1. package/dist/CodeEditor/CodeEditor.d.ts +3 -0
  2. package/dist/CodeEditor/CodeEditor.d.ts.map +1 -1
  3. package/dist/CodeEditor/CodeEditor.js +11 -1
  4. package/dist/Schedule/MonthlyView.d.ts.map +1 -1
  5. package/dist/Schedule/MonthlyView.js +6 -1
  6. package/dist/index.d.ts +0 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +0 -1
  9. package/dist/lab.css +0 -37
  10. package/package.json +3 -3
  11. package/src/CodeEditor/CodeEditor.test.tsx +36 -0
  12. package/src/CodeEditor/CodeEditor.tsx +9 -0
  13. package/src/Schedule/MonthlyView.tsx +14 -2
  14. package/src/Schedule/Schedule.test.tsx +27 -6
  15. package/src/index.ts +0 -1
  16. package/dist/Stepper/Step.d.ts +0 -130
  17. package/dist/Stepper/Step.d.ts.map +0 -1
  18. package/dist/Stepper/Step.js +0 -887
  19. package/dist/Stepper/StepStatus.d.ts +0 -24
  20. package/dist/Stepper/StepStatus.d.ts.map +0 -1
  21. package/dist/Stepper/StepStatus.js +0 -1
  22. package/dist/Stepper/Stepper.d.ts +0 -98
  23. package/dist/Stepper/Stepper.d.ts.map +0 -1
  24. package/dist/Stepper/Stepper.js +0 -134
  25. package/dist/Stepper/StepperContext.d.ts +0 -28
  26. package/dist/Stepper/StepperContext.d.ts.map +0 -1
  27. package/dist/Stepper/StepperContext.js +0 -34
  28. package/dist/Stepper/index.d.ts +0 -8
  29. package/dist/Stepper/index.d.ts.map +0 -1
  30. package/dist/Stepper/index.js +0 -7
  31. package/dist/Stepper/stepper.stylex.d.ts +0 -15
  32. package/dist/Stepper/stepper.stylex.d.ts.map +0 -1
  33. package/dist/Stepper/stepper.stylex.js +0 -20
  34. package/src/Stepper/Step.doc.mjs +0 -17
  35. package/src/Stepper/Step.tsx +0 -1317
  36. package/src/Stepper/StepStatus.ts +0 -26
  37. package/src/Stepper/Stepper.doc.mjs +0 -281
  38. package/src/Stepper/Stepper.test.tsx +0 -699
  39. package/src/Stepper/Stepper.tsx +0 -222
  40. package/src/Stepper/StepperContext.ts +0 -58
  41. package/src/Stepper/index.ts +0 -17
  42. package/src/Stepper/stepper.stylex.ts +0 -19
  43. package/src/__tests__/labApiContractDrift.test.tsx +0 -57
@@ -42,6 +42,9 @@ export interface CodeEditorProps extends Omit<BaseProps<HTMLDivElement>, 'onChan
42
42
  * The escape is advertised to assistive technology via a visually hidden
43
43
  * aria-describedby hint (see `escapeHint`).
44
44
  *
45
+ * The editor carries an explicit tabindex="0" (including when read-only) so
46
+ * the scrollable container passes axe's scrollable-region-focusable check.
47
+ *
45
48
  * @example
46
49
  * ```
47
50
  * const [code, setCode] = useState('');
@@ -1 +1 @@
1
- {"version":3,"file":"CodeEditor.d.ts","sourceRoot":"","sources":["../../src/CodeEditor/CodeEditor.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAkBlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,8BAA8B,CAAC;AAuF5D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,uBAAuB;IACvB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IAC5D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAsB,EACtB,cAAsB,EACtB,UAAkB,EAClB,WAAW,EACX,SAAS,EACT,IAAW,EACX,SAAS,EAAE,eAAe,EAC1B,KAAK,EACL,UAAqE,EACrE,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,eAAe,+BAwUjB;yBAzVe,UAAU"}
1
+ {"version":3,"file":"CodeEditor.d.ts","sourceRoot":"","sources":["../../src/CodeEditor/CodeEditor.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAkBlD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,8BAA8B,CAAC;AAuF5D,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,SAAS,CAAC,cAAc,CAAC,EACzB,UAAU,CACX;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,+BAA+B;IAC/B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,uBAAuB;IACvB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;IAC5D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,QAAsB,EACtB,cAAsB,EACtB,UAAkB,EAClB,WAAW,EACX,SAAS,EACT,IAAW,EACX,SAAS,EAAE,eAAe,EAC1B,KAAK,EACL,UAAqE,EACrE,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,eAAe,+BA8UjB;yBA/Ve,UAAU"}
@@ -170,6 +170,9 @@ let editorInstanceCounter = 0;
170
170
  * The escape is advertised to assistive technology via a visually hidden
171
171
  * aria-describedby hint (see `escapeHint`).
172
172
  *
173
+ * The editor carries an explicit tabindex="0" (including when read-only) so
174
+ * the scrollable container passes axe's scrollable-region-focusable check.
175
+ *
173
176
  * @example
174
177
  * ```
175
178
  * const [code, setCode] = useState('');
@@ -472,7 +475,14 @@ export function CodeEditor({
472
475
  ref: editorRef
473
476
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
474
477
  ,
475
- contentEditable: isReadOnly ? false : 'plaintext-only',
478
+ contentEditable: isReadOnly ? false : 'plaintext-only'
479
+ // Explicit tabindex: editing hosts have an effective tabIndex of 0
480
+ // already, but axe reads the attribute, and contenteditable is not
481
+ // on its natively-focusable whitelist — without it a maxHeight
482
+ // editor fails scrollable-region-focusable. Also keeps read-only
483
+ // editors keyboard-focusable, like a readonly textarea.
484
+ ,
485
+ tabIndex: 0,
476
486
  role: "textbox",
477
487
  "aria-multiline": "true",
478
488
  "aria-label": label,
@@ -1 +1 @@
1
- {"version":3,"file":"MonthlyView.d.ts","sourceRoot":"","sources":["../../src/Schedule/MonthlyView.tsx"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAEV,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,0BAA0B;IACzC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1C;AAgSD,wBAAgB,yBAAyB,CAAC,EACxC,YAAgB,GACjB,GAAE,0BAA+B,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAmC5E"}
1
+ {"version":3,"file":"MonthlyView.d.ts","sourceRoot":"","sources":["../../src/Schedule/MonthlyView.tsx"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAEV,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,0BAA0B;IACzC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1C;AA4SD,wBAAgB,yBAAyB,CAAC,EACxC,YAAgB,GACjB,GAAE,0BAA+B,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAmC5E"}
@@ -45,7 +45,12 @@ function ScheduleMonthlyView(_props) {
45
45
  children: /*#__PURE__*/_jsxs("div", {
46
46
  role: "grid",
47
47
  "aria-label": formatMonthTitle(rangeDate, timezoneID),
48
- "aria-readonly": true,
48
+ "aria-readonly": true
49
+ // The grid scrolls horizontally at narrow viewports and contains no
50
+ // focusable descendants, so it must be focusable itself for keyboard
51
+ // scrolling (axe: scrollable-region-focusable).
52
+ ,
53
+ tabIndex: 0,
49
54
  ...stylex.props(styles.monthGrid),
50
55
  children: [/*#__PURE__*/_jsx("div", {
51
56
  role: "row",
package/dist/index.d.ts CHANGED
@@ -25,7 +25,6 @@ export { RadialChart, type RadialChartProps, RadialGrid, type RadialGridProps, R
25
25
  export { ThreeDChart, type ThreeDChartProps, ThreeDScatter, ThreeDScatterGL, type ThreeDScatterProps, type ThreeDScatterGLProps, ThreeDBar, type ThreeDBarProps, ThreeDGrid, type ThreeDGridProps, ThreeDAxis, type ThreeDAxisProps, ThreeDSurface, type ThreeDSurfaceProps, use3D, type ThreeDContext, type Camera, type Point3D, type ProjectedPoint, } from './ThreeD';
26
26
  export { ChartBrush, type ChartBrushProps, type BrushMode, type BrushRange, ChartZoom, type ChartZoomProps, ChartSelect, type ChartSelectProps, ChartReferenceLine, type ChartReferenceLineProps, } from './Chart';
27
27
  export { SankeyChart, type SankeyChartProps, SankeyLink, type SankeyLinkProps, SankeyNode, type SankeyNodeProps, SankeyLabel, type SankeyLabelProps, useSankey, type SankeyNodeDatum, type SankeyLinkDatum, type SankeyColumn, type SankeyColumnDef, type SankeyNodeLayout, type SankeyLinkLayout, type SankeyColumnLayout, SankeyGrid, type SankeyGridProps, type SankeyContext, } from './Sankey';
28
- export * from './Stepper';
29
28
  export * from './CircularProgress';
30
29
  export * from './ListInput';
31
30
  export { LogStream, type LogStreamProps, type LogEntry, type LogStreamLevel, } from './LogStream';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -58,7 +58,6 @@ export { SankeyChart, SankeyLink, SankeyNode, SankeyLabel, useSankey, SankeyGrid
58
58
 
59
59
  // Chart v2 (config model) moved to its own package: @astryxdesign/charts.
60
60
  // It is no longer re-exported from @astryxdesign/lab.
61
- export * from "./Stepper/index.js";
62
61
  export * from "./CircularProgress/index.js";
63
62
 
64
63
  // ListInput — compact editor for short collections of simple records
package/dist/lab.css CHANGED
@@ -11,14 +11,11 @@
11
11
  @property --x-gridTemplateColumns { syntax: "*"; inherits: false;}
12
12
  @property --x-height { syntax: "*"; inherits: false;}
13
13
  @property --x-insetInlineStart { syntax: "*"; inherits: false;}
14
- @property --x-marginBlock { syntax: "*"; inherits: false;}
15
14
  @property --x-marginBlockStart { syntax: "*"; inherits: false;}
16
15
  @property --x-maxHeight { syntax: "*"; inherits: false;}
17
16
  @property --x-maxWidth { syntax: "*"; inherits: false;}
18
17
  @property --x-minHeight { syntax: "*"; inherits: false;}
19
18
  @property --x-minWidth { syntax: "*"; inherits: false;}
20
- @property --x-paddingBlock { syntax: "*"; inherits: false;}
21
- @property --x-paddingInline { syntax: "*"; inherits: false;}
22
19
  @property --x-top { syntax: "*"; inherits: false;}
23
20
  @property --x-transform { syntax: "*"; inherits: false;}
24
21
  @property --x-viewTransitionName { syntax: "*"; inherits: false;}
@@ -125,7 +122,6 @@
125
122
  .x33j1x8:not(#\#):not(#\#){grid-row:var(--x-gridRow)}
126
123
  .x17y0mx6:not(#\#):not(#\#){inset-inline:0}
127
124
  .x1yqqeh1:not(#\#):not(#\#){margin-block:var(--spacing-0-5)}
128
- .x1oqu0vw:not(#\#):not(#\#){margin-block:var(--x-marginBlock)}
129
125
  .x1a2a7pz:not(#\#):not(#\#){outline:none}
130
126
  .xysyzu8:not(#\#):not(#\#){overflow:auto}
131
127
  .xb3r6kr:not(#\#):not(#\#){overflow:hidden}
@@ -137,15 +133,12 @@
137
133
  .xu0wf1k:not(#\#):not(#\#){padding-block:var(--spacing-1)}
138
134
  .xce4md1:not(#\#):not(#\#){padding-block:var(--spacing-2)}
139
135
  .x8o8v82:not(#\#):not(#\#){padding-block:var(--spacing-3)}
140
- .x1giekp1:not(#\#):not(#\#){padding-block:var(--x-paddingBlock)}
141
136
  .xnjsko4:not(#\#):not(#\#){padding-inline:0}
142
137
  .x4ezzuc:not(#\#):not(#\#){padding-inline:var(--spacing-1-5)}
143
138
  .x7a5moj:not(#\#):not(#\#){padding-inline:var(--spacing-1)}
144
139
  .xf314gf:not(#\#):not(#\#){padding-inline:var(--spacing-2)}
145
140
  .xrrkdod:not(#\#):not(#\#){padding-inline:var(--spacing-3)}
146
141
  .x1pzlopt:not(#\#):not(#\#){padding-inline:var(--spacing-4)}
147
- .x30g6up:not(#\#):not(#\#){padding-inline:var(--x-paddingInline)}
148
- .x1ku5rj1:not(#\#):not(#\#){place-items:center}
149
142
  .x1hl2dhg:not(#\#):not(#\#){text-decoration:none}
150
143
  .xb0j27v:not(#\#):not(#\#){transition:grid-template-rows var(--duration-medium) var(--ease-standard)}
151
144
  .x1ob6yzd:not(#\#):not(#\#){transition:transform var(--duration-fast) var(--ease-standard)}
@@ -168,7 +161,6 @@
168
161
  .xuk3077:not(#\#):not(#\#):not(#\#){align-items:flex-end}
169
162
  .x1cy8zhl:not(#\#):not(#\#):not(#\#){align-items:flex-start}
170
163
  .x7a106z:not(#\#):not(#\#):not(#\#){align-items:start}
171
- .x1qjc9v5:not(#\#):not(#\#):not(#\#){align-items:stretch}
172
164
  .x7fd4wk:not(#\#):not(#\#):not(#\#){align-self:end}
173
165
  .xqcrz7y:not(#\#):not(#\#):not(#\#){align-self:flex-start}
174
166
  .x1y8v6su:not(#\#):not(#\#):not(#\#){align-self:start}
@@ -237,12 +229,9 @@
237
229
  .xg9c4l2:not(#\#):not(#\#):not(#\#){background-color:var(--color-border-red)}
238
230
  .x1m3yk8c:not(#\#):not(#\#):not(#\#){background-color:var(--color-border-teal)}
239
231
  .x154rz6c:not(#\#):not(#\#):not(#\#){background-color:var(--color-border-yellow)}
240
- .x1m4xfpy:not(#\#):not(#\#):not(#\#){background-color:var(--color-border)}
241
232
  .x1pjz0fi:not(#\#):not(#\#):not(#\#){background-color:var(--color-error)}
242
233
  .x1q5y3ey:not(#\#):not(#\#):not(#\#){background-color:var(--color-icon-secondary)}
243
- .xdsz4j9:not(#\#):not(#\#):not(#\#){background-color:var(--color-success)}
244
234
  .xdomwnj:not(#\#):not(#\#):not(#\#){background-color:var(--color-text-secondary)}
245
- .x1q8g9m5:not(#\#):not(#\#):not(#\#){background-color:var(--color-warning)}
246
235
  .xct3ic7:not(#\#):not(#\#):not(#\#){background-image:linear-gradient(90deg,var(--color-text-secondary) 0%,var(--color-text-disabled) 50%,var(--color-text-secondary) 100%)}
247
236
  .x18o3ruo:not(#\#):not(#\#):not(#\#){background-image:none}
248
237
  .xakli9p:not(#\#):not(#\#):not(#\#){background-size:200% 100%}
@@ -281,15 +270,11 @@
281
270
  .x1lenag:not(#\#):not(#\#):not(#\#){color:light-dark(var(--color-error),color-mix(in srgb,var(--color-error) 82%,white))}
282
271
  .x19co3pv:not(#\#):not(#\#):not(#\#){color:transparent}
283
272
  .xqwr325:not(#\#):not(#\#):not(#\#){color:var(--color-accent)}
284
- .xrkvqaz:not(#\#):not(#\#):not(#\#){color:var(--color-background-surface)}
285
273
  .xjt36v0:not(#\#):not(#\#):not(#\#){color:var(--color-error)}
286
274
  .xqa6c3m:not(#\#):not(#\#):not(#\#){color:var(--color-icon-disabled)}
287
275
  .xtbr613:not(#\#):not(#\#):not(#\#){color:var(--color-icon-primary)}
288
276
  .xv9yike:not(#\#):not(#\#):not(#\#){color:var(--color-icon-secondary)}
289
277
  .x17wrial:not(#\#):not(#\#):not(#\#){color:var(--color-on-accent)}
290
- .x1m024r3:not(#\#):not(#\#):not(#\#){color:var(--color-on-error)}
291
- .xri61p4:not(#\#):not(#\#):not(#\#){color:var(--color-on-success)}
292
- .xrebv38:not(#\#):not(#\#):not(#\#){color:var(--color-on-warning)}
293
278
  .xtjic6:not(#\#):not(#\#):not(#\#){color:var(--color-success)}
294
279
  .xjse4m1:not(#\#):not(#\#):not(#\#){color:var(--color-text-accent)}
295
280
  .x1vvqiwl:not(#\#):not(#\#):not(#\#){color:var(--color-text-blue)}
@@ -310,7 +295,6 @@
310
295
  .xak3so:not(#\#):not(#\#):not(#\#){column-gap:var(--spacing-2)}
311
296
  .xewh9hi:not(#\#):not(#\#):not(#\#){column-gap:var(--spacing-3)}
312
297
  .x1w36mze:not(#\#):not(#\#):not(#\#){contain-intrinsic-height:auto 28px}
313
- .x1hppuf3:not(#\#):not(#\#):not(#\#){container-name:astryx-stepper}
314
298
  .x63rumg:not(#\#):not(#\#):not(#\#){container-name:list-input}
315
299
  .x12h1iku:not(#\#):not(#\#):not(#\#){container-type:inline-size}
316
300
  .xb5mbof:not(#\#):not(#\#):not(#\#){content-visibility:auto}
@@ -326,7 +310,6 @@
326
310
  .xbh8q5q:not(#\#):not(#\#):not(#\#){fill:none}
327
311
  .xdl72j9:not(#\#):not(#\#):not(#\#){flex-basis:auto}
328
312
  .xdt5ytf:not(#\#):not(#\#):not(#\#){flex-direction:column}
329
- .x1q0g3np:not(#\#):not(#\#):not(#\#){flex-direction:row}
330
313
  .x1iyjqo2:not(#\#):not(#\#):not(#\#){flex-grow:1}
331
314
  .x2lah0s:not(#\#):not(#\#):not(#\#){flex-shrink:0}
332
315
  .xs83m0k:not(#\#):not(#\#):not(#\#){flex-shrink:1}
@@ -391,8 +374,6 @@
391
374
  .x1lqcxt8:not(#\#):not(#\#):not(#\#){justify-self:start}
392
375
  .x9pfba7:not(#\#):not(#\#):not(#\#){letter-spacing:.08em}
393
376
  .xa7kkou:not(#\#):not(#\#):not(#\#){line-height:1.7}
394
- .xo5v014:not(#\#):not(#\#):not(#\#){line-height:1}
395
- .x1d3mw78:not(#\#):not(#\#):not(#\#){line-height:16px}
396
377
  .xklk4pu:not(#\#):not(#\#):not(#\#){line-height:30px}
397
378
  .xw6l6zx:not(#\#):not(#\#):not(#\#){line-height:var(--text-body-leading)}
398
379
  .x17iicif:not(#\#):not(#\#):not(#\#){line-height:var(--text-code-leading)}
@@ -419,11 +400,8 @@
419
400
  .x1t818jl:not(#\#):not(#\#):not(#\#){padding-inline-end:var(--spacing-3)}
420
401
  .x1f43n9v:not(#\#):not(#\#):not(#\#){padding-inline-start:calc(16px + var(--spacing-1-5))}
421
402
  .xmarwi5:not(#\#):not(#\#):not(#\#){padding-inline-start:var(--icon-inline-offset)}
422
- .x18gyask:not(#\#):not(#\#):not(#\#){padding-inline-start:var(--spacing-0)}
423
403
  .x1vsv5vr:not(#\#):not(#\#):not(#\#){padding-inline-start:var(--spacing-1)}
424
404
  .x1rey3nv:not(#\#):not(#\#):not(#\#){padding-inline-start:var(--spacing-4)}
425
- .x31w388:not(#\#):not(#\#):not(#\#){padding-inline-start:var(--spacing-6)}
426
- .xchaq28:not(#\#):not(#\#):not(#\#){padding-inline-start:var(--spacing-7)}
427
405
  .x67bb7w:not(#\#):not(#\#):not(#\#){pointer-events:auto}
428
406
  .x47corl:not(#\#):not(#\#):not(#\#){pointer-events:none}
429
407
  .x10l6tqk:not(#\#):not(#\#):not(#\#){position:absolute}
@@ -447,7 +425,6 @@
447
425
  .x2b8uid:not(#\#):not(#\#):not(#\#){text-align:center}
448
426
  .xp4054r:not(#\#):not(#\#):not(#\#){text-align:end}
449
427
  .xdpxx8g:not(#\#):not(#\#):not(#\#){text-align:left}
450
- .x1yc453h:not(#\#):not(#\#):not(#\#){text-align:start}
451
428
  .xlyipyv:not(#\#):not(#\#):not(#\#){text-overflow:ellipsis}
452
429
  .xtvhhri:not(#\#):not(#\#):not(#\#){text-transform:uppercase}
453
430
  .x5ve5x3:not(#\#):not(#\#):not(#\#){touch-action:none}
@@ -476,7 +453,6 @@
476
453
  .xxymvpz:not(#\#):not(#\#):not(#\#){vertical-align:middle}
477
454
  .xqwjeat:not(#\#):not(#\#):not(#\#){view-transition-name:var(--x-viewTransitionName)}
478
455
  .xlshs6z:not(#\#):not(#\#):not(#\#){visibility:hidden}
479
- .xnpuxes:not(#\#):not(#\#):not(#\#){visibility:visible}
480
456
  .xuxw1ft:not(#\#):not(#\#):not(#\#){white-space:nowrap}
481
457
  .x126k92a:not(#\#):not(#\#):not(#\#){white-space:pre-wrap}
482
458
  .x1sdyfia:not(#\#):not(#\#):not(#\#){white-space:pre}
@@ -485,15 +461,12 @@
485
461
  .x1vjfegm:not(#\#):not(#\#):not(#\#){z-index:1}
486
462
  .x1355qak:not(#\#):not(#\#):not(#\#){z-index:20}
487
463
  .xr3buco:not(#\#):not(#\#):not(#\#){z-index:var(--x-zIndex)}
488
- .x1rmeqbc.x1rmeqbc:where(.x1fcdk97:first-child *):not(#\#):not(#\#):not(#\#){visibility:hidden}
489
- .xehs70j.xehs70j:where(.x1fcdk97:last-child *):not(#\#):not(#\#):not(#\#){visibility:hidden}
490
464
  .x1iutq3a.x1iutq3a:hover:where(:not(:disabled,[aria-disabled="true"])):not(#\#):not(#\#):not(#\#){background-color:transparent}
491
465
  .xrz1bfo.xrz1bfo:hover:where(:not(:disabled,[aria-disabled="true"])):not(#\#):not(#\#):not(#\#){background-image:none}
492
466
  .x16khyan:is(:disabled,[aria-disabled="true"]):not(#\#):not(#\#):not(#\#){cursor:default}
493
467
  .x1bqaal:focus-visible:not(#\#):not(#\#):not(#\#){outline-offset:-2px}
494
468
  .x1df3fe5:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){transform:translateX(-100%)}
495
469
  .xttggg:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){transform:translateX(100%)}
496
- .xyxi2l3:active:not(#\#):not(#\#):not(#\#){background-color:var(--color-overlay-pressed)}
497
470
  .xuqm82a:active:not(#\#):not(#\#):not(#\#){background-image:none}
498
471
  @media (prefers-reduced-motion: reduce){.xnh0sag.xnh0sag:not(#\#):not(#\#):not(#\#){animation-duration:3s}}
499
472
  @media (prefers-reduced-motion: reduce){.xy02sl2.xy02sl2:not(#\#):not(#\#):not(#\#){animation-duration:4s}}
@@ -510,7 +483,6 @@
510
483
  @container (max-width: 40rem){.x12eanku.x12eanku:not(#\#):not(#\#):not(#\#){border-inline-start-width:0}}
511
484
  @container list-input (max-width: 640px){.x1jiamoa.x1jiamoa:not(#\#):not(#\#):not(#\#){display:block}}
512
485
  @container list-input (max-width: 640px){.x12gktpv.x12gktpv:not(#\#):not(#\#):not(#\#){display:contents}}
513
- @container astryx-stepper (max-width: 480px){.x1wzf6n4.x1wzf6n4:not(#\#):not(#\#):not(#\#){display:none}}
514
486
  @container (max-width: 40rem){.x1sp3fdr.x1sp3fdr:not(#\#):not(#\#):not(#\#){grid-template-columns:minmax(0,1fr)}}
515
487
  @container list-input (max-width: 640px){.x540v0d.x540v0d:not(#\#):not(#\#):not(#\#){grid-template-columns:minmax(0,1fr)}}
516
488
  @container list-input (max-width: 640px){.xrs5tkd.xrs5tkd:not(#\#):not(#\#):not(#\#){row-gap:var(--spacing-2)}}
@@ -540,9 +512,6 @@
540
512
  .x1d9x2de:not(#\#):not(#\#):not(#\#):not(#\#){height:640px}
541
513
  .xt7dq6l:not(#\#):not(#\#):not(#\#):not(#\#){height:auto}
542
514
  .xhigkf7:not(#\#):not(#\#):not(#\#):not(#\#){height:var(--icon-size)}
543
- .x11c6zpc:not(#\#):not(#\#):not(#\#):not(#\#){height:var(--spacing-1)}
544
- .x6b6gus:not(#\#):not(#\#):not(#\#):not(#\#){height:var(--spacing-4)}
545
- .x1grt7ep:not(#\#):not(#\#):not(#\#):not(#\#){height:var(--spacing-5)}
546
515
  .x16ye13r:not(#\#):not(#\#):not(#\#):not(#\#){height:var(--x-height)}
547
516
  .x1unci72:not(#\#):not(#\#):not(#\#):not(#\#){left:var(--spacing-4)}
548
517
  .xlstkdb:not(#\#):not(#\#):not(#\#):not(#\#){margin-bottom:var(--spacing-0-5)}
@@ -565,18 +534,15 @@
565
534
  .xjwf9q1:not(#\#):not(#\#):not(#\#):not(#\#){min-height:24px}
566
535
  .x1cy360x:not(#\#):not(#\#):not(#\#):not(#\#){min-height:3em}
567
536
  .x1uogy3y:not(#\#):not(#\#):not(#\#):not(#\#){min-height:var(--size-element-md)}
568
- .x175cymr:not(#\#):not(#\#):not(#\#):not(#\#){min-height:var(--spacing-2)}
569
537
  .xu95rz8:not(#\#):not(#\#):not(#\#):not(#\#){min-height:var(--transfer-list-panel-min-block-size)}
570
538
  .x82snj4:not(#\#):not(#\#):not(#\#):not(#\#){min-height:var(--x-minHeight)}
571
539
  .xeuugli:not(#\#):not(#\#):not(#\#):not(#\#){min-width:0}
572
540
  .x17s4nb9:not(#\#):not(#\#):not(#\#):not(#\#){min-width:30px}
573
541
  .x1uz6y0c:not(#\#):not(#\#):not(#\#):not(#\#){min-width:784px}
574
- .x18ki04u:not(#\#):not(#\#):not(#\#):not(#\#){min-width:var(--spacing-2)}
575
542
  .xkj4a21:not(#\#):not(#\#):not(#\#):not(#\#){min-width:var(--x-minWidth)}
576
543
  .xw2csxc:not(#\#):not(#\#):not(#\#):not(#\#){overflow-x:auto}
577
544
  .x6ikm8r:not(#\#):not(#\#):not(#\#):not(#\#){overflow-x:hidden}
578
545
  .x1odjw0f:not(#\#):not(#\#):not(#\#):not(#\#){overflow-y:auto}
579
- .x1j85h84:not(#\#):not(#\#):not(#\#):not(#\#){padding-bottom:1px}
580
546
  .x1a148e8:not(#\#):not(#\#):not(#\#):not(#\#){padding-bottom:env(safe-area-inset-bottom,0px)}
581
547
  .xy143xn:not(#\#):not(#\#):not(#\#):not(#\#){padding-bottom:var(--spacing-1)}
582
548
  .xpgmcrp:not(#\#):not(#\#):not(#\#):not(#\#){padding-top:var(--icon-block-offset)}
@@ -597,9 +563,6 @@
597
563
  .x1td3qas:not(#\#):not(#\#):not(#\#):not(#\#){width:32px}
598
564
  .x1ftt334:not(#\#):not(#\#):not(#\#):not(#\#){width:5px}
599
565
  .x1oai4fc:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--icon-size)}
600
- .xx9zwd3:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--spacing-1)}
601
- .x12xnipv:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--spacing-4)}
602
- .xfyiiit:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--spacing-5)}
603
566
  .x11ymkkh:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--x-1xmrurk)}
604
567
  .x5lhr3w:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--x-width)}
605
568
  .x14l7nz5:first-child:not(#\#):not(#\#):not(#\#):not(#\#){margin-top:0}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/lab",
3
- "version": "0.4.7-canary.b7fc8b1",
3
+ "version": "0.4.7-canary.de6d448",
4
4
  "description": "Experimental Astryx components — published to npm only under the @canary dist-tag for early testing; never released as a stable (latest) version.",
5
5
  "author": "Meta Open Source",
6
6
  "license": "MIT",
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@stylexjs/stylex": ">=0.10.0",
48
- "@astryxdesign/core": "0.4.7-canary.b7fc8b1",
48
+ "@astryxdesign/core": "0.4.7-canary.de6d448",
49
49
  "react": ">=19.0.0",
50
50
  "react-dom": ">=19.0.0"
51
51
  },
@@ -55,7 +55,7 @@
55
55
  "d3-shape": "^3.2.0"
56
56
  },
57
57
  "devDependencies": {
58
- "@astryxdesign/cli": "0.4.7-canary.b7fc8b1",
58
+ "@astryxdesign/cli": "0.4.7-canary.de6d448",
59
59
  "@types/d3-array": "^3.2.2",
60
60
  "@types/d3-scale": "^4.0.9",
61
61
  "@types/d3-shape": "^3.1.8",
@@ -188,4 +188,40 @@ describe('CodeEditor', () => {
188
188
 
189
189
  expect(onChange).toHaveBeenCalledWith(' a;\nb;');
190
190
  });
191
+
192
+ it('exposes an explicit tabindex so scrollable editors count as focusable content', () => {
193
+ // contenteditable is not on axe's natively-focusable whitelist, and axe
194
+ // reads the tabindex ATTRIBUTE (not the browser's effective tabIndex),
195
+ // so the scrollable editorContainer only passes scrollable-region-focusable
196
+ // when the <code> editor materializes tabindex="0" explicitly.
197
+ render(
198
+ <CodeEditor
199
+ value={Array.from({length: 30}, (_, i) => `line ${i + 1};`).join('\n')}
200
+ onChange={() => {}}
201
+ language="typescript"
202
+ label="Edit snippet"
203
+ maxHeight={200}
204
+ />,
205
+ );
206
+ expect(screen.getByRole('textbox', {name: 'Edit snippet'})).toHaveAttribute(
207
+ 'tabindex',
208
+ '0',
209
+ );
210
+ });
211
+
212
+ it('keeps read-only editors keyboard-focusable, like a readonly textarea', () => {
213
+ render(
214
+ <CodeEditor
215
+ value="const x = 1;"
216
+ onChange={() => {}}
217
+ language="typescript"
218
+ label="Edit snippet"
219
+ isReadOnly
220
+ />,
221
+ );
222
+ expect(screen.getByRole('textbox', {name: 'Edit snippet'})).toHaveAttribute(
223
+ 'tabindex',
224
+ '0',
225
+ );
226
+ });
191
227
  });
@@ -242,6 +242,9 @@ let editorInstanceCounter = 0;
242
242
  * The escape is advertised to assistive technology via a visually hidden
243
243
  * aria-describedby hint (see `escapeHint`).
244
244
  *
245
+ * The editor carries an explicit tabindex="0" (including when read-only) so
246
+ * the scrollable container passes axe's scrollable-region-focusable check.
247
+ *
245
248
  * @example
246
249
  * ```
247
250
  * const [code, setCode] = useState('');
@@ -575,6 +578,12 @@ export function CodeEditor({
575
578
  ref={editorRef}
576
579
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
577
580
  contentEditable={isReadOnly ? false : ('plaintext-only' as any)}
581
+ // Explicit tabindex: editing hosts have an effective tabIndex of 0
582
+ // already, but axe reads the attribute, and contenteditable is not
583
+ // on its natively-focusable whitelist — without it a maxHeight
584
+ // editor fails scrollable-region-focusable. Also keeps read-only
585
+ // editors keyboard-focusable, like a readonly textarea.
586
+ tabIndex={0}
578
587
  role="textbox"
579
588
  aria-multiline="true"
580
589
  aria-label={label}
@@ -57,8 +57,16 @@ export interface ScheduleMonthlyViewOptions {
57
57
  function ScheduleMonthlyView(
58
58
  _props: ScheduleViewComponentProps<ScheduleMonthlyViewOptions>,
59
59
  ) {
60
- const {events, categories, date, focusDate, timezoneID, range, isLoading, headingLevel} =
61
- useScheduleContext();
60
+ const {
61
+ events,
62
+ categories,
63
+ date,
64
+ focusDate,
65
+ timezoneID,
66
+ range,
67
+ isLoading,
68
+ headingLevel,
69
+ } = useScheduleContext();
62
70
  const rangeDate = date.toPlainDate();
63
71
  const highlightedDate = focusDate.toPlainDate();
64
72
  const currentTime = useCurrentTime();
@@ -76,6 +84,10 @@ function ScheduleMonthlyView(
76
84
  role="grid"
77
85
  aria-label={formatMonthTitle(rangeDate, timezoneID)}
78
86
  aria-readonly
87
+ // The grid scrolls horizontally at narrow viewports and contains no
88
+ // focusable descendants, so it must be focusable itself for keyboard
89
+ // scrolling (axe: scrollable-region-focusable).
90
+ tabIndex={0}
79
91
  {...stylex.props(styles.monthGrid)}>
80
92
  <div role="row" {...stylex.props(styles.weekHeader)}>
81
93
  {days.slice(0, 7).map((day, index) => (
@@ -114,9 +114,9 @@ describe('Schedule', () => {
114
114
  await waitFor(() => {
115
115
  expect(screen.getByText('Visible sync')).toBeInTheDocument();
116
116
  });
117
- expect(
118
- screen.getAllByRole('heading', {level: 3}).length,
119
- ).toBeGreaterThan(0);
117
+ expect(screen.getAllByRole('heading', {level: 3}).length).toBeGreaterThan(
118
+ 0,
119
+ );
120
120
  });
121
121
 
122
122
  it('renders list day headings at the configured headingLevel (default 3)', async () => {
@@ -133,9 +133,9 @@ describe('Schedule', () => {
133
133
  await waitFor(() => {
134
134
  expect(screen.getByText('Visible sync')).toBeInTheDocument();
135
135
  });
136
- expect(
137
- screen.getAllByRole('heading', {level: 3}).length,
138
- ).toBeGreaterThan(0);
136
+ expect(screen.getAllByRole('heading', {level: 3}).length).toBeGreaterThan(
137
+ 0,
138
+ );
139
139
  });
140
140
 
141
141
  it('loads async events with Instant range boundaries', async () => {
@@ -249,6 +249,27 @@ describe('Schedule', () => {
249
249
  ).toBeInTheDocument();
250
250
  });
251
251
 
252
+ it('makes the scrollable monthly grid keyboard-focusable', () => {
253
+ // The month grid is a horizontal scroll container with no focusable
254
+ // descendants, so it needs tabindex="0" itself for
255
+ // scrollable-region-focusable to pass and for keyboard scrolling.
256
+ render(
257
+ <Schedule
258
+ view={createScheduleMonthlyView()}
259
+ events={events}
260
+ categories={categories}
261
+ date={Date.UTC(2026, 4, 13)}
262
+ focusDate={Date.UTC(2026, 4, 13)}
263
+ timezoneID="UTC"
264
+ />,
265
+ );
266
+
267
+ expect(screen.getByRole('grid', {name: 'May 2026'})).toHaveAttribute(
268
+ 'tabindex',
269
+ '0',
270
+ );
271
+ });
272
+
252
273
  it('exposes time grid views as ARIA grids', () => {
253
274
  render(
254
275
  <Schedule
package/src/index.ts CHANGED
@@ -240,7 +240,6 @@ export {
240
240
 
241
241
  // Chart v2 (config model) moved to its own package: @astryxdesign/charts.
242
242
  // It is no longer re-exported from @astryxdesign/lab.
243
- export * from './Stepper';
244
243
  export * from './CircularProgress';
245
244
 
246
245
  // ListInput — compact editor for short collections of simple records
@@ -1,130 +0,0 @@
1
- /**
2
- * @file Step.tsx
3
- * @input Uses React, stylex, theme tokens, StepperContext
4
- * @output Exports Step component and StepProps
5
- * @position Individual step item; used inside Stepper
6
- *
7
- * SYNC: When modified, update these files to stay in sync:
8
- * - /packages/lab/src/Stepper/Stepper.doc.mjs
9
- * - /packages/lab/src/Stepper/Stepper.test.tsx
10
- * - /packages/lab/src/Stepper/index.ts
11
- * - /apps/storybook/stories/Stepper.stories.tsx
12
- * - /packages/cli/assets/templates/blocks/components/Stepper/ (showcase blocks)
13
- */
14
- import { type ReactNode } from 'react';
15
- import type { BaseProps } from '@astryxdesign/core';
16
- import type { StepStatus } from './StepStatus';
17
- /**
18
- * Built-in indicator presets. Anything other than these strings passed to
19
- * `indicator` is treated as a custom ReactNode (e.g. an `<Icon />`).
20
- * - 'auto': numbered badge for not-yet-reached steps, a check once completed
21
- * (default)
22
- * - 'number': always a numbered badge
23
- * - 'none': no indicator — just the progress bar and label
24
- */
25
- export type StepIndicatorPreset = 'auto' | 'number' | 'none';
26
- export type StepDensity = 'compact' | 'balanced' | 'spacious';
27
- export interface StepProps extends BaseProps<HTMLLIElement> {
28
- /** Ref forwarded to the root element */
29
- ref?: React.Ref<HTMLLIElement>;
30
- /**
31
- * Zero-based index of this step. Used to derive progress (completed /
32
- * active / not-started) relative to the parent's `activeStep`.
33
- */
34
- step: number;
35
- /**
36
- * Step label text.
37
- */
38
- label: string;
39
- /**
40
- * Optional description shown below the label.
41
- */
42
- description?: string;
43
- /**
44
- * Content rendered below the label and description. Useful in vertical
45
- * steppers to show form fields or detailed content for each step.
46
- */
47
- children?: ReactNode;
48
- /**
49
- * Custom icon rendered inside the indicator. Accepts any ReactNode (for
50
- * example an `<Icon />`). Equivalent to passing the node directly to
51
- * `indicator`; takes precedence over the built-in number/check.
52
- */
53
- icon?: ReactNode;
54
- /**
55
- * Semantic status for the step, mapped to the global Astryx semantic tokens
56
- * (`accent`, `success`, `warning`, `error`). In the default `auto` indicator
57
- * mode it sets both the indicator color and a matching glyph: `success` shows
58
- * a green check-circle, `warning`/`error` show the shared Input status icons.
59
- * `accent` is color-only. The current (in-progress) step always keeps its
60
- * current-step indicator regardless of `status`. Never recolors the
61
- * connector/track.
62
- *
63
- * Because the indicator glyphs are decorative (aria-hidden), the status also
64
- * reaches assistive technology as text: visually hidden "completed" /
65
- * "warning" / "error" next to the label, and composed into the accessible
66
- * name of clickable steps.
67
- */
68
- status?: StepStatus;
69
- /**
70
- * Disable interaction for this step.
71
- * @default false
72
- */
73
- isDisabled?: boolean;
74
- /**
75
- * Marks the step as optional, appending an "Optional" affordance after the
76
- * label.
77
- * @default false
78
- */
79
- isOptional?: boolean;
80
- /**
81
- * Trailing content rendered at the end of the label row (e.g. a timestamp
82
- * or status chip).
83
- */
84
- endContent?: ReactNode;
85
- /**
86
- * What to show as the step indicator. Accepts a preset string or any
87
- * ReactNode:
88
- * - 'auto': numbered badge until completed, then a check (default)
89
- * - 'number': always a numbered badge
90
- * - 'none': no indicator, just the bar + label
91
- * - ReactNode: any custom icon or element to render as the indicator
92
- * @default 'auto'
93
- */
94
- indicator?: StepIndicatorPreset | ReactNode;
95
- /**
96
- * Controls vertical padding of the step. Falls back to the stepper-level
97
- * density when unset.
98
- * - 'compact': minimal padding (4px block)
99
- * - 'balanced': default (8px block)
100
- * - 'spacious': generous (12px block, 12px inline)
101
- */
102
- density?: StepDensity;
103
- }
104
- /**
105
- * An individual step within an Stepper. Renders a 4px progress-bar segment,
106
- * an indicator (numbered badge, check, or any custom icon), a label with
107
- * optional description, and an optional content slot.
108
- *
109
- * Progress (completed / active / not-started) is derived from the parent's
110
- * `activeStep` and this step's `step` prop. The optional `status` prop layers a
111
- * semantic meaning on top: in the default `auto` indicator mode it recolors the
112
- * indicator and swaps in a matching glyph (`success` → green check-circle,
113
- * `warning`/`error` → the shared Input status icons). The current step always
114
- * keeps its current-step ring. `status` never recolors the connector/track.
115
- *
116
- * @example
117
- * ```
118
- * <Step step={0} label="Account details" description="Enter your email" />
119
- * ```
120
- *
121
- * @example
122
- * ```
123
- * <Step step={1} label="Payment" status="error" />
124
- * ```
125
- */
126
- export declare function Step({ step, label, description, children, icon, status, isDisabled, isOptional, endContent, indicator: indicatorProp, density: densityProp, xstyle, className, style, ref, 'data-testid': dataTestId, ...rest }: StepProps): import("react").JSX.Element;
127
- export declare namespace Step {
128
- var displayName: string;
129
- }
130
- //# sourceMappingURL=Step.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Step.d.ts","sourceRoot":"","sources":["../../src/Stepper/Step.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAarC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAOlD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,SAAU,SAAQ,SAAS,CAAC,aAAa,CAAC;IACzD,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC5C;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAigBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,UAAkB,EAClB,UAAkB,EAClB,UAAU,EACV,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,EACpB,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,aAAa,EAAE,UAAU,EACzB,GAAG,IAAI,EACR,EAAE,SAAS,+BA0nBX;yBA5oBe,IAAI"}