@photon-ai/pho-ui 2.6.0 → 2.7.0

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 (120) hide show
  1. package/dist/chunks/IconChevronDown-CZilB71T.js +11 -0
  2. package/dist/chunks/IconChevronDown-CZilB71T.js.map +1 -0
  3. package/dist/chunks/IconSearch-BKAHkLyX.js +14 -0
  4. package/dist/chunks/IconSearch-BKAHkLyX.js.map +1 -0
  5. package/dist/chunks/animated-height-CCO-Ocoz.js +48 -0
  6. package/dist/chunks/animated-height-CCO-Ocoz.js.map +1 -0
  7. package/dist/chunks/basic-page-DR5szOOs.js +1373 -0
  8. package/dist/chunks/basic-page-DR5szOOs.js.map +1 -0
  9. package/dist/chunks/{button-DNNs5RsT.js → button-CdqS_t5a.js} +62 -65
  10. package/dist/chunks/button-CdqS_t5a.js.map +1 -0
  11. package/dist/chunks/checkbox-Cdm08HWG.js +129 -0
  12. package/dist/chunks/checkbox-Cdm08HWG.js.map +1 -0
  13. package/dist/chunks/{choice-card-CunOnY9l.js → choice-card-BVNP1NB6.js} +2 -2
  14. package/dist/chunks/{choice-card-CunOnY9l.js.map → choice-card-BVNP1NB6.js.map} +1 -1
  15. package/dist/chunks/data-table-DwbPU0zt.js +2970 -0
  16. package/dist/chunks/data-table-DwbPU0zt.js.map +1 -0
  17. package/dist/chunks/{dialog-8SRNi_rv.js → dialog-BxKACOj5.js} +4 -4
  18. package/dist/chunks/{dialog-8SRNi_rv.js.map → dialog-BxKACOj5.js.map} +1 -1
  19. package/dist/chunks/{error-Crs-wqMC.js → error-D0yoFxCv.js} +2 -2
  20. package/dist/chunks/{error-Crs-wqMC.js.map → error-D0yoFxCv.js.map} +1 -1
  21. package/dist/chunks/is-react-component-DSnjtBmo.js +10 -0
  22. package/dist/chunks/is-react-component-DSnjtBmo.js.map +1 -0
  23. package/dist/chunks/link-provider-DXzDQ08N.js +24 -0
  24. package/dist/chunks/link-provider-DXzDQ08N.js.map +1 -0
  25. package/dist/chunks/rolldown-runtime-DG5F_Nuu.js +27 -0
  26. package/dist/chunks/{scroll-area-Bu7egArU.js → scroll-area-BO-9PMM7.js} +27 -26
  27. package/dist/chunks/scroll-area-BO-9PMM7.js.map +1 -0
  28. package/dist/chunks/sidebar-DVzZsCts.js +223 -0
  29. package/dist/chunks/sidebar-DVzZsCts.js.map +1 -0
  30. package/dist/chunks/skeleton-DwjSl4vC.js +18 -0
  31. package/dist/chunks/skeleton-DwjSl4vC.js.map +1 -0
  32. package/dist/chunks/{toast-DoXaRPIZ.js → toast-iSf6NuAS.js} +43 -45
  33. package/dist/chunks/toast-iSf6NuAS.js.map +1 -0
  34. package/dist/chunks/use-press-pulse-IbNstUT0.js +58 -0
  35. package/dist/chunks/use-press-pulse-IbNstUT0.js.map +1 -0
  36. package/dist/components/button.js +1 -1
  37. package/dist/components/checkbox.js +4 -126
  38. package/dist/components/command.js +54 -57
  39. package/dist/components/command.js.map +1 -1
  40. package/dist/components/data-table.js +11 -0
  41. package/dist/components/dialog.js +1 -1
  42. package/dist/components/error.js +1 -1
  43. package/dist/components/phone-input.js +609 -616
  44. package/dist/components/phone-input.js.map +1 -1
  45. package/dist/components/radio-group.js +2 -2
  46. package/dist/components/scroll-area.js +1 -1
  47. package/dist/components/select.js +35 -39
  48. package/dist/components/select.js.map +1 -1
  49. package/dist/components/skeleton.js +2 -15
  50. package/dist/components/toast.js +1 -1
  51. package/dist/index.js +94 -73
  52. package/dist/motion.js +89 -0
  53. package/dist/motion.js.map +1 -0
  54. package/dist/primitives/accordion.js +1 -1
  55. package/dist/primitives/alert-dialog.js +1 -1
  56. package/dist/primitives/autocomplete.js +1 -1
  57. package/dist/primitives/avatar.js +1 -1
  58. package/dist/primitives/button.js +1 -1
  59. package/dist/primitives/checkbox-group.js +1 -1
  60. package/dist/primitives/checkbox.js +1 -1
  61. package/dist/primitives/collapsible.js +1 -1
  62. package/dist/primitives/combobox.js +1 -1
  63. package/dist/primitives/context-menu.js +1 -1
  64. package/dist/primitives/csp-provider.js +1 -1
  65. package/dist/primitives/dialog.js +1 -1
  66. package/dist/primitives/direction-provider.js +1 -1
  67. package/dist/primitives/drawer.js +1 -1
  68. package/dist/primitives/field.js +1 -1
  69. package/dist/primitives/fieldset.js +1 -1
  70. package/dist/primitives/form.js +1 -1
  71. package/dist/primitives/input.js +1 -1
  72. package/dist/primitives/menu.js +1 -1
  73. package/dist/primitives/menubar.js +1 -1
  74. package/dist/primitives/meter.js +1 -1
  75. package/dist/primitives/navigation-menu.js +1 -1
  76. package/dist/primitives/number-field.js +1 -1
  77. package/dist/primitives/otp-field.js +1 -1
  78. package/dist/primitives/popover.js +1 -1
  79. package/dist/primitives/preview-card.js +1 -1
  80. package/dist/primitives/progress.js +1 -1
  81. package/dist/primitives/radio-group.js +1 -1
  82. package/dist/primitives/radio.js +1 -1
  83. package/dist/primitives/scroll-area.js +1 -1
  84. package/dist/primitives/select.js +1 -1
  85. package/dist/primitives/separator.js +1 -1
  86. package/dist/primitives/slider.js +1 -1
  87. package/dist/primitives/switch.js +1 -1
  88. package/dist/primitives/tabs.js +1 -1
  89. package/dist/primitives/toast.js +1 -1
  90. package/dist/primitives/toggle-group.js +1 -1
  91. package/dist/primitives/toggle.js +1 -1
  92. package/dist/primitives/toolbar.js +1 -1
  93. package/dist/primitives/tooltip.js +1 -1
  94. package/dist/primitives.js +3 -3
  95. package/dist/sections/basic-page.js +16 -14
  96. package/dist/sections/sidebar.js +1 -1
  97. package/dist/src/components/data-table/data-table.d.ts +227 -0
  98. package/dist/src/components/data-table/index.d.ts +2 -0
  99. package/dist/src/index.d.ts +1 -0
  100. package/dist/src/motion/index.d.ts +149 -0
  101. package/dist/src/sections/basic-page/basic-page.d.ts +47 -7
  102. package/dist/src/sections/basic-page/index.d.ts +1 -0
  103. package/dist/utils.js +13 -12
  104. package/package.json +10 -1
  105. package/dist/chunks/animated-height-C2eQstGy.js +0 -51
  106. package/dist/chunks/animated-height-C2eQstGy.js.map +0 -1
  107. package/dist/chunks/basic-page-DsI1xo6p.js +0 -1295
  108. package/dist/chunks/basic-page-DsI1xo6p.js.map +0 -1
  109. package/dist/chunks/button-DNNs5RsT.js.map +0 -1
  110. package/dist/chunks/link-provider-9TFNyDqO.js +0 -28
  111. package/dist/chunks/link-provider-9TFNyDqO.js.map +0 -1
  112. package/dist/chunks/rolldown-runtime-wKSmTnsc.js +0 -22
  113. package/dist/chunks/scroll-area-Bu7egArU.js.map +0 -1
  114. package/dist/chunks/sidebar-DvB-G0BP.js +0 -231
  115. package/dist/chunks/sidebar-DvB-G0BP.js.map +0 -1
  116. package/dist/chunks/toast-DoXaRPIZ.js.map +0 -1
  117. package/dist/chunks/use-press-pulse-8iorQPsh.js +0 -62
  118. package/dist/chunks/use-press-pulse-8iorQPsh.js.map +0 -1
  119. package/dist/components/checkbox.js.map +0 -1
  120. package/dist/components/skeleton.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { AnchorHTMLAttributes, ComponentProps, ReactNode, Ref } from 'react';
2
2
  import { ButtonLinkProps, ButtonProps } from '../../components/button';
3
3
  import { Form as FormElement } from '../../components/form';
4
+ import { DataTable } from '../../components/data-table';
4
5
  /** Bordered card that stacks rows with hairline dividers. */
5
6
  export declare const BASIC_PAGE_CARD = "rounded-base border border-pho-secondary bg-pho-primary divide-y divide-pho-secondary [&>:has(+[data-basic-page-alert])]:border-b-0";
6
7
  /**
@@ -71,12 +72,14 @@ export interface BasicPageRootProps extends ComponentProps<"div"> {
71
72
  */
72
73
  condense?: boolean;
73
74
  /**
74
- * The content column's cap. `base` (default) is the 42rem reading
75
- * column every settings page uses; `wide` opens it to 80rem for a page
76
- * that is a list first — rows with several columns. Forms stay on
77
- * `base`: across a wide row a label and its control drift out of one
78
- * glance. Either width can host an `Aside` — the column keeps its cap
79
- * beside the panel, and leftover space is margin, not content width.
75
+ * The content column's cap. `base` is the 42rem reading column every
76
+ * settings page uses; `wide` opens it to 80rem for a page that is a
77
+ * list first — rows with several columns. Left unsaid, the page sizes
78
+ * itself: `base`, until it carries a `Table` — records in columns run
79
+ * wide on their own. Forms stay on `base`: across a wide row a label
80
+ * and its control drift out of one glance. Either width can host an
81
+ * `Aside` — the column keeps its cap beside the panel, and leftover
82
+ * space is margin, not content width.
80
83
  */
81
84
  width?: "base" | "wide";
82
85
  }
@@ -192,7 +195,7 @@ export interface BasicPageStackProps extends Omit<ComponentProps<"div">, RevealM
192
195
  *
193
196
  * Static under reduced motion.
194
197
  */
195
- declare function Stack({ className, children, ...props }: BasicPageStackProps): import("react").JSX.Element;
198
+ declare function Stack({ className, children, ref: forwardedRef, ...props }: BasicPageStackProps): import("react").JSX.Element;
196
199
  /**
197
200
  * Title + optional description pair. No gap between them — the block's
198
201
  * `gap-3` only applies between this header and the card.
@@ -222,6 +225,19 @@ declare function SectionTitle({ id, className, children, ...props }: ComponentPr
222
225
  declare function Description({ className, ...props }: ComponentProps<"p"> & {
223
226
  ref?: Ref<HTMLParagraphElement>;
224
227
  }): import("react").JSX.Element;
228
+ /**
229
+ * How many rows the searchable table is showing — a `Description` that
230
+ * reads the table's search. Idle: "12 people." A query: "3 of 12."
231
+ * Renders nothing until a table with `search` is on the page. Put it in
232
+ * the `Header` under the section title.
233
+ */
234
+ declare function TableCount({ one, other, ...props }: ComponentProps<"p"> & {
235
+ /** Singular noun — "1 person." */
236
+ one: string;
237
+ /** Plural noun — "12 people." */
238
+ other: string;
239
+ ref?: Ref<HTMLParagraphElement>;
240
+ }): import("react").JSX.Element | null;
225
241
  /**
226
242
  * Optional caption below a section's `Card` (outside the card). One step
227
243
  * smaller than `Description` (`text-xs`). Not the card-internal dirty-state
@@ -687,9 +703,32 @@ export interface BasicPageAsideProps {
687
703
  * column cap beside the panel, and leftover space is margin.
688
704
  */
689
705
  declare function Aside({ open, placeholder, onClose, children }: BasicPageAsideProps): import('react').ReactPortal | null;
706
+ /**
707
+ * The table's search, standing at the end of a section header — put it in
708
+ * the `Header` beside the title and it adopts the searchable table's box
709
+ * (the table then renders none of its own). On a header at least 36rem
710
+ * wide the box simply stands open: the header is a container, CSS
711
+ * decides, nothing is measured. On a narrower one a round button holds
712
+ * the place; clicking it opens the box — the width glides linearly, the
713
+ * page's travel — with focus landing inside. Emptied and blurred it
714
+ * glides shut and the button returns; Escape clears, blurs, and shuts.
715
+ * Renders nothing until a table with `search` is on the page.
716
+ */
717
+ declare function Search({ variant, className, ...props }: ComponentProps<"div"> & {
718
+ /**
719
+ * The face. `box` (default) is the bordered field beside a section
720
+ * title — open on a wide header, a round button that glides it open on
721
+ * a narrow one. `ghost` is the table-chrome face: a magnifier and a
722
+ * bare field on the text line, no box — for a toolbar band or anywhere
723
+ * a boxed control would be noise; it flexes instead of folding.
724
+ */
725
+ variant?: "box" | "ghost";
726
+ }): import("react").JSX.Element;
690
727
  export declare const BasicPage: {
691
728
  Root: typeof Root;
692
729
  Aside: typeof Aside;
730
+ Search: typeof Search;
731
+ Table: typeof DataTable;
693
732
  CondenseScope: typeof CondenseScope;
694
733
  Breadcrumbs: typeof Breadcrumbs;
695
734
  Crumb: typeof Crumb;
@@ -699,6 +738,7 @@ export declare const BasicPage: {
699
738
  Header: typeof Header;
700
739
  SectionTitle: typeof SectionTitle;
701
740
  Description: typeof Description;
741
+ TableCount: typeof TableCount;
702
742
  SectionFooter: typeof SectionFooter;
703
743
  Card: typeof Card;
704
744
  Item: typeof Item;
@@ -1 +1,2 @@
1
1
  export { BasicPage, formToasts, AUTO_SAVE_DELAY_MS, useCondense, useAutoSave, type BasicPageCondense, BASIC_PAGE_CARD, CONDENSE_BAR_ENTER, CONDENSE_BAR_TRAVEL, CONDENSE_BAR_RISE_PX, BASIC_PAGE_CALLOUT, BASIC_PAGE_ROW, BASIC_PAGE_ITEM, BASIC_PAGE_ITEM_PANEL, BASIC_PAGE_ITEM_PANEL_DIVIDED, type BasicPageRootProps, type BasicPageAsideProps, type BasicPageRowProps, type BasicPageRowLinkProps, type BasicPageBackProps, type BasicPageBreadcrumbsProps, type BasicPageCrumbProps, type BasicPageFooterProps, type BasicPageFormProps, type BasicPageFormErrors, type BasicPageItemPanelProps, } from './basic-page';
2
+ export { createColumns, type DataTableColumn, type DataTableColumnMeta, type DataTableProps, type SortingState, } from '../../components/data-table';
package/dist/utils.js CHANGED
@@ -1,15 +1,16 @@
1
1
  "use client";
2
- import { t as s } from "./chunks/cn-ChIgwEl3.js";
3
- import { n as t, r as e, t as a } from "./chunks/link-provider-9TFNyDqO.js";
4
- import { t as i } from "./chunks/resolve-variant-CcD8iG5l.js";
5
- import { n as p, r as P, t as R } from "./chunks/use-press-pulse-8iorQPsh.js";
2
+ import { t as r } from "./chunks/cn-ChIgwEl3.js";
3
+ import { t } from "./chunks/is-react-component-DSnjtBmo.js";
4
+ import { t as m } from "./chunks/resolve-variant-CcD8iG5l.js";
5
+ import { n as i, t as n } from "./chunks/link-provider-DXzDQ08N.js";
6
+ import { n as P, r as R, t as S } from "./chunks/use-press-pulse-IbNstUT0.js";
6
7
  export {
7
- R as CONTROL_PRESS_SCALE,
8
- p as CONTROL_PRESS_SPRING,
9
- a as LinkProvider,
10
- s as cn,
11
- e as isReactComponent,
12
- i as resolveVariant,
13
- t as useLinkComponent,
14
- P as usePressPulse
8
+ S as CONTROL_PRESS_SCALE,
9
+ P as CONTROL_PRESS_SPRING,
10
+ n as LinkProvider,
11
+ r as cn,
12
+ t as isReactComponent,
13
+ m as resolveVariant,
14
+ i as useLinkComponent,
15
+ R as usePressPulse
15
16
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@photon-ai/pho-ui",
3
- "version": "2.6.0",
3
+ "version": "2.7.0",
4
4
  "description": "Pho Design System — Photon's React component library, built on Base UI",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -33,6 +33,10 @@
33
33
  "types": "./dist/src/components/button/index.d.ts",
34
34
  "import": "./dist/components/button.js"
35
35
  },
36
+ "./components/data-table": {
37
+ "types": "./dist/src/components/data-table/index.d.ts",
38
+ "import": "./dist/components/data-table.js"
39
+ },
36
40
  "./components/input": {
37
41
  "types": "./dist/src/components/input/index.d.ts",
38
42
  "import": "./dist/components/input.js"
@@ -233,6 +237,10 @@
233
237
  "types": "./dist/src/utils/index.d.ts",
234
238
  "import": "./dist/utils.js"
235
239
  },
240
+ "./motion": {
241
+ "types": "./dist/src/motion/index.d.ts",
242
+ "import": "./dist/motion.js"
243
+ },
236
244
  "./primitives": {
237
245
  "types": "./dist/src/primitives/index.d.ts",
238
246
  "import": "./dist/primitives.js"
@@ -430,6 +438,7 @@
430
438
  },
431
439
  "dependencies": {
432
440
  "@base-ui/react": "^1.7.0",
441
+ "@tanstack/react-table": "^9.2.3",
433
442
  "clsx": "^2.1.1",
434
443
  "cmdk": "^1.1.1",
435
444
  "country-flag-icons": "^1.6.20",
@@ -1,51 +0,0 @@
1
- "use client";
2
- import { useEffect as v, useRef as a } from "react";
3
- import { jsx as m } from "react/jsx-runtime";
4
- import { animate as g, motion as R, useMotionValue as x, useReducedMotion as H } from "motion/react";
5
- var M = {
6
- type: "spring",
7
- stiffness: 640,
8
- damping: 50
9
- };
10
- function y({ className: d, transition: r, children: p }) {
11
- const s = a(null), i = a(null), t = x("auto"), c = H();
12
- return v(() => {
13
- const h = s.current, n = i.current;
14
- if (!h || !n) return;
15
- let e = null;
16
- const u = new ResizeObserver((b) => {
17
- const f = b[0]?.borderBoxSize?.[0], o = f ? f.blockSize : n.offsetHeight, l = t.get();
18
- if (l === "auto" || c) {
19
- e?.stop(), e = null, t.set(o);
20
- return;
21
- }
22
- !e && Math.abs(l - o) < 0.5 || (e?.stop(), e = g(t, o, {
23
- ...r ?? M,
24
- onComplete: () => {
25
- e = null;
26
- }
27
- }));
28
- });
29
- return u.observe(n), () => {
30
- u.disconnect(), e?.stop();
31
- };
32
- }, [
33
- t,
34
- c,
35
- r
36
- ]), /* @__PURE__ */ m(R.div, {
37
- ref: s,
38
- className: "min-h-0 overflow-hidden",
39
- style: { height: t },
40
- children: /* @__PURE__ */ m("div", {
41
- ref: i,
42
- className: d,
43
- children: p
44
- })
45
- });
46
- }
47
- export {
48
- y as t
49
- };
50
-
51
- //# sourceMappingURL=animated-height-C2eQstGy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"animated-height-C2eQstGy.js","names":[],"sources":["../../src/utils/animated-height.tsx"],"sourcesContent":["import { useEffect, useRef, type ReactNode } from \"react\";\nimport {\n animate,\n motion,\n useMotionValue,\n useReducedMotion,\n type ValueAnimationTransition,\n} from \"motion/react\";\n\n/**\n * Height spring for container-size transitions — same feel as the onboarding /\n * invite card and BasicPage footer reveal: quick, critically damped (no\n * overshoot that would flash clipped content).\n */\nconst HEIGHT_SPRING = { type: \"spring\", stiffness: 640, damping: 50 } as const;\n\n/**\n * Animates its own height to follow the measured height of `children`, so\n * content swaps (search filtering, skeleton → data) glide instead of jumping.\n * Honors `prefers-reduced-motion` by snapping height with no spring.\n */\nexport function AnimatedHeight({\n className,\n transition,\n children,\n}: {\n className?: string;\n /** Spring override for the height follow. @default the Command spring */\n transition?: ValueAnimationTransition<number | \"auto\">;\n children: ReactNode;\n}) {\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const height = useMotionValue<number | \"auto\">(\"auto\");\n const reduceMotion = useReducedMotion();\n\n useEffect(() => {\n const container = containerRef.current;\n const content = contentRef.current;\n if (!container || !content) return;\n\n let animation: ReturnType<typeof animate> | null = null;\n\n const observer = new ResizeObserver((entries) => {\n const box = entries[0]?.borderBoxSize?.[0];\n const next = box ? box.blockSize : content.offsetHeight;\n const current = height.get();\n if (current === \"auto\" || reduceMotion) {\n animation?.stop();\n animation = null;\n height.set(next);\n return;\n }\n if (!animation && Math.abs(current - next) < 0.5) return;\n animation?.stop();\n animation = animate(height, next, {\n ...(transition ?? HEIGHT_SPRING),\n onComplete: () => {\n animation = null;\n },\n });\n });\n observer.observe(content);\n\n return () => {\n observer.disconnect();\n animation?.stop();\n };\n }, [height, reduceMotion, transition]);\n\n return (\n <motion.div\n ref={containerRef}\n // Stack (and other flex parents) set `min-height: auto` on children,\n // which sizes to content and swallows the height spring. Clip and\n // allow shrinking so the measured height can actually animate.\n className=\"min-h-0 overflow-hidden\"\n style={{ height }}\n >\n <div ref={contentRef} className={className}>\n {children}\n </div>\n </motion.div>\n );\n}\n"],"mappings":";;;;AAcA,IAAM,IAAgB;AAAA,EAAE,MAAM;AAAA,EAAU,WAAW;AAAA,EAAK,SAAS;AAAG;AAOpE,SAAgB,EAAe,EAC7B,WAAA,GACA,YAAA,GACA,UAAA,EAAA,GAMC;AACD,QAAM,IAAe,EAAuB,IAAI,GAC1C,IAAa,EAAuB,IAAI,GACxC,IAAS,EAAgC,MAAM,GAC/C,IAAe,EAAiB;AAEtC,SAAA,EAAA,MAAgB;AACd,UAAM,IAAY,EAAa,SACzB,IAAU,EAAW;AAC3B,QAAI,CAAC,KAAa,CAAC,EAAS;AAE5B,QAAI,IAA+C;AAEnD,UAAM,IAAW,IAAI,eAAA,CAAgB,MAAY;AAC/C,YAAM,IAAM,EAAQ,CAAA,GAAI,gBAAgB,CAAA,GAClC,IAAO,IAAM,EAAI,YAAY,EAAQ,cACrC,IAAU,EAAO,IAAI;AAC3B,UAAI,MAAY,UAAU,GAAc;AACtC,QAAA,GAAW,KAAK,GAChB,IAAY,MACZ,EAAO,IAAI,CAAI;AACf;AAAA,MACF;AACA,MAAI,CAAC,KAAa,KAAK,IAAI,IAAU,CAAI,IAAI,QAC7C,GAAW,KAAK,GAChB,IAAY,EAAQ,GAAQ,GAAM;AAAA,QAChC,GAAI,KAAc;AAAA,QAClB,YAAA,MAAkB;AAChB,UAAA,IAAY;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,WAAA,EAAS,QAAQ,CAAO,GAExB,MAAa;AACX,MAAA,EAAS,WAAW,GACpB,GAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG;AAAA,IAAC;AAAA,IAAQ;AAAA,IAAc;AAAA,EAAU,CAAC,GAGnC,gBAAA,EAAC,EAAO,KAAR;AAAA,IACE,KAAK;AAAA,IAIL,WAAU;AAAA,IACV,OAAO,EAAE,QAAA,EAAO;AAAA,IAEhB,UAAA,gBAAA,EAAC,OAAD;AAAA,MAAK,KAAK;AAAA,MAAuB,WAAA;AAAA,MAC9B,UAAA;AAAA,IACE,CAAA;AAAA,EACK,CAAA;AAEhB"}