@panneau/ui 0.0.0-stage → 5.0.0-alpha.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 (209) hide show
  1. package/README.md +57 -2
  2. package/dist/alert/Alert.css +78 -0
  3. package/dist/alert/Alert.d.ts +30 -0
  4. package/dist/alert/Alert.d.ts.map +1 -0
  5. package/dist/alert/Alert.js +64 -0
  6. package/dist/alert/Alert.js.map +1 -0
  7. package/dist/alert/Alert.module.js +30 -0
  8. package/dist/alert/Alert.module.js.map +1 -0
  9. package/dist/badge/Badge.css +60 -0
  10. package/dist/badge/Badge.d.ts +15 -0
  11. package/dist/badge/Badge.d.ts.map +1 -0
  12. package/dist/badge/Badge.js +21 -0
  13. package/dist/badge/Badge.js.map +1 -0
  14. package/dist/badge/Badge.module.js +22 -0
  15. package/dist/badge/Badge.module.js.map +1 -0
  16. package/dist/button/Button.css +112 -0
  17. package/dist/button/Button.d.ts +26 -0
  18. package/dist/button/Button.d.ts.map +1 -0
  19. package/dist/button/Button.js +39 -0
  20. package/dist/button/Button.js.map +1 -0
  21. package/dist/button/Button.module.js +28 -0
  22. package/dist/button/Button.module.js.map +1 -0
  23. package/dist/card/Card.css +50 -0
  24. package/dist/card/Card.d.ts +20 -0
  25. package/dist/card/Card.d.ts.map +1 -0
  26. package/dist/card/Card.js +38 -0
  27. package/dist/card/Card.js.map +1 -0
  28. package/dist/card/Card.module.js +18 -0
  29. package/dist/card/Card.module.js.map +1 -0
  30. package/dist/checkbox/Checkbox.css +79 -0
  31. package/dist/checkbox/Checkbox.d.ts +11 -0
  32. package/dist/checkbox/Checkbox.d.ts.map +1 -0
  33. package/dist/checkbox/Checkbox.js +43 -0
  34. package/dist/checkbox/Checkbox.js.map +1 -0
  35. package/dist/checkbox/Checkbox.module.js +16 -0
  36. package/dist/checkbox/Checkbox.module.js.map +1 -0
  37. package/dist/checkbox/ChoiceChrome.d.ts +15 -0
  38. package/dist/checkbox/ChoiceChrome.d.ts.map +1 -0
  39. package/dist/checkbox/ChoiceChrome.js +36 -0
  40. package/dist/checkbox/ChoiceChrome.js.map +1 -0
  41. package/dist/combo-box/ComboBox.css +26 -0
  42. package/dist/combo-box/ComboBox.d.ts +30 -0
  43. package/dist/combo-box/ComboBox.d.ts.map +1 -0
  44. package/dist/combo-box/ComboBox.js +106 -0
  45. package/dist/combo-box/ComboBox.js.map +1 -0
  46. package/dist/combo-box/ComboBox.module.js +14 -0
  47. package/dist/combo-box/ComboBox.module.js.map +1 -0
  48. package/dist/date-picker/DatePicker.css +135 -0
  49. package/dist/date-picker/DatePicker.d.ts +12 -0
  50. package/dist/date-picker/DatePicker.d.ts.map +1 -0
  51. package/dist/date-picker/DatePicker.js +93 -0
  52. package/dist/date-picker/DatePicker.js.map +1 -0
  53. package/dist/date-picker/DatePicker.module.js +30 -0
  54. package/dist/date-picker/DatePicker.module.js.map +1 -0
  55. package/dist/dialog/Dialog.css +126 -0
  56. package/dist/dialog/Dialog.d.ts +31 -0
  57. package/dist/dialog/Dialog.d.ts.map +1 -0
  58. package/dist/dialog/Dialog.js +61 -0
  59. package/dist/dialog/Dialog.js.map +1 -0
  60. package/dist/dialog/Dialog.module.js +30 -0
  61. package/dist/dialog/Dialog.module.js.map +1 -0
  62. package/dist/disclosure/Disclosure.css +54 -0
  63. package/dist/disclosure/Disclosure.d.ts +20 -0
  64. package/dist/disclosure/Disclosure.d.ts.map +1 -0
  65. package/dist/disclosure/Disclosure.js +43 -0
  66. package/dist/disclosure/Disclosure.js.map +1 -0
  67. package/dist/disclosure/Disclosure.module.js +22 -0
  68. package/dist/disclosure/Disclosure.module.js.map +1 -0
  69. package/dist/field/Field.css +145 -0
  70. package/dist/field/Field.module.js +30 -0
  71. package/dist/field/Field.module.js.map +1 -0
  72. package/dist/field/FieldParts.d.ts +32 -0
  73. package/dist/field/FieldParts.d.ts.map +1 -0
  74. package/dist/field/FieldParts.js +56 -0
  75. package/dist/field/FieldParts.js.map +1 -0
  76. package/dist/field/Fieldset.d.ts +22 -0
  77. package/dist/field/Fieldset.d.ts.map +1 -0
  78. package/dist/field/Fieldset.js +50 -0
  79. package/dist/field/Fieldset.js.map +1 -0
  80. package/dist/icon/Icon.css +5 -0
  81. package/dist/icon/Icon.d.ts +31 -0
  82. package/dist/icon/Icon.d.ts.map +1 -0
  83. package/dist/icon/Icon.js +29 -0
  84. package/dist/icon/Icon.js.map +1 -0
  85. package/dist/icon/Icon.module.js +8 -0
  86. package/dist/icon/Icon.module.js.map +1 -0
  87. package/dist/icon-button/IconButton.css +9 -0
  88. package/dist/icon-button/IconButton.d.ts +15 -0
  89. package/dist/icon-button/IconButton.d.ts.map +1 -0
  90. package/dist/icon-button/IconButton.js +26 -0
  91. package/dist/icon-button/IconButton.js.map +1 -0
  92. package/dist/icon-button/IconButton.module.js +12 -0
  93. package/dist/icon-button/IconButton.module.js.map +1 -0
  94. package/dist/index.d.ts +32 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +29 -0
  97. package/dist/intl/messages.d.ts +2 -0
  98. package/dist/intl/messages.d.ts.map +1 -0
  99. package/dist/intl/messages.js +1 -0
  100. package/dist/intl/usePanneauIntl.d.ts +7 -0
  101. package/dist/intl/usePanneauIntl.d.ts.map +1 -0
  102. package/dist/intl/usePanneauIntl.js +22 -0
  103. package/dist/intl/usePanneauIntl.js.map +1 -0
  104. package/dist/locales/index.d.ts +15 -0
  105. package/dist/locales/index.d.ts.map +1 -0
  106. package/dist/locales/index.js +21 -0
  107. package/dist/locales/index.js.map +1 -0
  108. package/dist/menu/Menu.d.ts +27 -0
  109. package/dist/menu/Menu.d.ts.map +1 -0
  110. package/dist/menu/Menu.js +57 -0
  111. package/dist/menu/Menu.js.map +1 -0
  112. package/dist/number-input/NumberInput.css +57 -0
  113. package/dist/number-input/NumberInput.d.ts +21 -0
  114. package/dist/number-input/NumberInput.d.ts.map +1 -0
  115. package/dist/number-input/NumberInput.js +82 -0
  116. package/dist/number-input/NumberInput.js.map +1 -0
  117. package/dist/number-input/NumberInput.module.js +16 -0
  118. package/dist/number-input/NumberInput.module.js.map +1 -0
  119. package/dist/popover/Popover.css +32 -0
  120. package/dist/popover/Popover.d.ts +18 -0
  121. package/dist/popover/Popover.d.ts.map +1 -0
  122. package/dist/popover/Popover.js +41 -0
  123. package/dist/popover/Popover.js.map +1 -0
  124. package/dist/popover/Popover.module.js +14 -0
  125. package/dist/popover/Popover.module.js.map +1 -0
  126. package/dist/radio-group/RadioGroup.css +83 -0
  127. package/dist/radio-group/RadioGroup.d.ts +12 -0
  128. package/dist/radio-group/RadioGroup.d.ts.map +1 -0
  129. package/dist/radio-group/RadioGroup.js +61 -0
  130. package/dist/radio-group/RadioGroup.js.map +1 -0
  131. package/dist/radio-group/RadioGroup.module.js +20 -0
  132. package/dist/radio-group/RadioGroup.module.js.map +1 -0
  133. package/dist/root/PanneauRoot.css +251 -0
  134. package/dist/root/PanneauRoot.d.ts +34 -0
  135. package/dist/root/PanneauRoot.d.ts.map +1 -0
  136. package/dist/root/PanneauRoot.js +84 -0
  137. package/dist/root/PanneauRoot.js.map +1 -0
  138. package/dist/root/PanneauRoot.module.js +12 -0
  139. package/dist/root/PanneauRoot.module.js.map +1 -0
  140. package/dist/select/ListBox.css +104 -0
  141. package/dist/select/ListBox.module.js +32 -0
  142. package/dist/select/ListBox.module.js.map +1 -0
  143. package/dist/select/Select.d.ts +45 -0
  144. package/dist/select/Select.d.ts.map +1 -0
  145. package/dist/select/Select.js +136 -0
  146. package/dist/select/Select.js.map +1 -0
  147. package/dist/spinner/Spinner.css +40 -0
  148. package/dist/spinner/Spinner.d.ts +11 -0
  149. package/dist/spinner/Spinner.d.ts.map +1 -0
  150. package/dist/spinner/Spinner.js +25 -0
  151. package/dist/spinner/Spinner.js.map +1 -0
  152. package/dist/spinner/Spinner.module.js +18 -0
  153. package/dist/spinner/Spinner.module.js.map +1 -0
  154. package/dist/switch/Switch.css +69 -0
  155. package/dist/switch/Switch.d.ts +11 -0
  156. package/dist/switch/Switch.d.ts.map +1 -0
  157. package/dist/switch/Switch.js +33 -0
  158. package/dist/switch/Switch.js.map +1 -0
  159. package/dist/switch/Switch.module.js +15 -0
  160. package/dist/switch/Switch.module.js.map +1 -0
  161. package/dist/tabs/Tabs.css +83 -0
  162. package/dist/tabs/Tabs.d.ts +27 -0
  163. package/dist/tabs/Tabs.d.ts.map +1 -0
  164. package/dist/tabs/Tabs.js +141 -0
  165. package/dist/tabs/Tabs.js.map +1 -0
  166. package/dist/tabs/Tabs.module.js +16 -0
  167. package/dist/tabs/Tabs.module.js.map +1 -0
  168. package/dist/text-area/TextArea.css +8 -0
  169. package/dist/text-area/TextArea.d.ts +11 -0
  170. package/dist/text-area/TextArea.d.ts.map +1 -0
  171. package/dist/text-area/TextArea.js +41 -0
  172. package/dist/text-area/TextArea.js.map +1 -0
  173. package/dist/text-area/TextArea.module.js +8 -0
  174. package/dist/text-area/TextArea.module.js.map +1 -0
  175. package/dist/text-input/TextInput.d.ts +17 -0
  176. package/dist/text-input/TextInput.d.ts.map +1 -0
  177. package/dist/text-input/TextInput.js +61 -0
  178. package/dist/text-input/TextInput.js.map +1 -0
  179. package/dist/theme/bootstrap.d.ts +8 -0
  180. package/dist/theme/bootstrap.d.ts.map +1 -0
  181. package/dist/theme/bootstrap.js +61 -0
  182. package/dist/theme/bootstrap.js.map +1 -0
  183. package/dist/theme/theme.d.ts +23 -0
  184. package/dist/theme/theme.d.ts.map +1 -0
  185. package/dist/theme/theme.js +30 -0
  186. package/dist/theme/theme.js.map +1 -0
  187. package/dist/time-input/TimeInput.d.ts +8 -0
  188. package/dist/time-input/TimeInput.d.ts.map +1 -0
  189. package/dist/time-input/TimeInput.js +45 -0
  190. package/dist/time-input/TimeInput.js.map +1 -0
  191. package/dist/toast/Toast.css +109 -0
  192. package/dist/toast/Toast.d.ts +39 -0
  193. package/dist/toast/Toast.d.ts.map +1 -0
  194. package/dist/toast/Toast.js +152 -0
  195. package/dist/toast/Toast.js.map +1 -0
  196. package/dist/toast/Toast.module.js +30 -0
  197. package/dist/toast/Toast.module.js.map +1 -0
  198. package/dist/tooltip/Tooltip.css +25 -0
  199. package/dist/tooltip/Tooltip.d.ts +19 -0
  200. package/dist/tooltip/Tooltip.d.ts.map +1 -0
  201. package/dist/tooltip/Tooltip.js +29 -0
  202. package/dist/tooltip/Tooltip.js.map +1 -0
  203. package/dist/tooltip/Tooltip.module.js +12 -0
  204. package/dist/tooltip/Tooltip.module.js.map +1 -0
  205. package/dist/utils/cx.d.ts +3 -0
  206. package/dist/utils/cx.d.ts.map +1 -0
  207. package/dist/utils/cx.js +9 -0
  208. package/dist/utils/cx.js.map +1 -0
  209. package/package.json +48 -5
@@ -0,0 +1,83 @@
1
+ .panneau-tabs-JqDxcK {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--panneau-space-4);
5
+ min-width: 0;
6
+ }
7
+
8
+ .panneau-list-uiIzNm {
9
+ display: flex;
10
+ gap: var(--panneau-space-1);
11
+ overflow-x: auto;
12
+ border-bottom: var(--panneau-border-width) solid var(--panneau-color-border);
13
+ scrollbar-width: none;
14
+ }
15
+
16
+ .panneau-list-uiIzNm::-webkit-scrollbar {
17
+ display: none;
18
+ }
19
+
20
+ .panneau-tab-dwPfFm {
21
+ position: relative;
22
+ display: inline-flex;
23
+ flex: 0 0 auto;
24
+ align-items: center;
25
+ gap: var(--panneau-space-2);
26
+ min-height: var(--panneau-control-height);
27
+ padding: 0 var(--panneau-space-3);
28
+ font-size: var(--panneau-font-size-md);
29
+ font-weight: var(--panneau-font-weight-medium);
30
+ color: var(--panneau-color-text-muted);
31
+ white-space: nowrap;
32
+ cursor: pointer;
33
+ outline: none;
34
+ -webkit-tap-highlight-color: transparent;
35
+ }
36
+
37
+ .panneau-tab-dwPfFm::after {
38
+ position: absolute;
39
+ inset-inline: var(--panneau-space-2);
40
+ bottom: calc(-1 * var(--panneau-border-width));
41
+ height: 2px;
42
+ content: '';
43
+ background-color: transparent;
44
+ border-radius: 2px 2px 0 0;
45
+ }
46
+
47
+ .panneau-tab-dwPfFm[data-hovered] {
48
+ color: var(--panneau-color-text);
49
+ }
50
+
51
+ .panneau-tab-dwPfFm[data-selected] {
52
+ color: var(--panneau-color-text);
53
+ }
54
+
55
+ .panneau-tab-dwPfFm[data-selected]::after {
56
+ background-color: var(--panneau-color-accent);
57
+ }
58
+
59
+ .panneau-tab-dwPfFm[data-disabled] {
60
+ cursor: not-allowed;
61
+ opacity: 0.5;
62
+ }
63
+
64
+ .panneau-tab-dwPfFm[data-focus-visible] {
65
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
66
+ outline-offset: -2px;
67
+ border-radius: var(--panneau-radius-sm);
68
+ }
69
+
70
+ .panneau-panel-H3uAcq {
71
+ min-width: 0;
72
+ outline: none;
73
+ }
74
+
75
+ .panneau-panel-H3uAcq[data-focus-visible] {
76
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
77
+ outline-offset: 2px;
78
+ }
79
+
80
+ .panneau-panel-H3uAcq[data-inert],
81
+ .panneau-panel-H3uAcq[inert] {
82
+ display: none;
83
+ }
@@ -0,0 +1,27 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type TabListProps as AriaTabListProps, type TabPanelProps as AriaTabPanelProps, type TabProps as AriaTabProps, type TabsProps as AriaTabsProps } from 'react-aria-components';
3
+ export interface TabsProps extends Omit<AriaTabsProps, 'className' | 'style'> {
4
+ className?: string;
5
+ }
6
+ /** Tabs: a `TabList` of `Tab`s, then a `TabPanel` per tab, matched by `id`. */
7
+ export declare function Tabs({ className, ...props }: TabsProps): import("react").JSX.Element;
8
+ export interface TabListProps<T extends object> extends Omit<AriaTabListProps<T>, 'className' | 'style'> {
9
+ className?: string;
10
+ }
11
+ /** The row of tabs. It scrolls sideways when the tabs don't fit, on phones. */
12
+ export declare function TabList<T extends object>({ className, ...props }: TabListProps<T>): import("react").JSX.Element;
13
+ export interface TabProps extends Omit<AriaTabProps, 'className' | 'style' | 'children'> {
14
+ children?: ReactNode;
15
+ className?: string;
16
+ }
17
+ /** A tab. Put a `Badge` in it for a count, such as the errors of the panel. */
18
+ export declare function Tab({ className, ...props }: TabProps): import("react").JSX.Element;
19
+ export interface TabPanelProps extends Omit<AriaTabPanelProps, 'className' | 'style'> {
20
+ className?: string;
21
+ }
22
+ /**
23
+ * The content of a tab. With `shouldForceMount`, the panel stays mounted (and hidden) when another
24
+ * tab is selected, which keeps the state of its fields.
25
+ */
26
+ export declare function TabPanel({ className, ...props }: TabPanelProps): import("react").JSX.Element;
27
+ //# sourceMappingURL=Tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../../src/tabs/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAGH,KAAK,YAAY,IAAI,gBAAgB,EAErC,KAAK,aAAa,IAAI,iBAAiB,EACvC,KAAK,QAAQ,IAAI,YAAY,EAE7B,KAAK,SAAS,IAAI,aAAa,EAClC,MAAM,uBAAuB,CAAC;AAK/B,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,OAAO,CAAC;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,+EAA+E;AAC/E,wBAAgB,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,+BAEtD;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,IAAI,CACxD,gBAAgB,CAAC,CAAC,CAAC,EACnB,WAAW,GAAG,OAAO,CACxB;IACG,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,+BAEjF;AAED,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;IACpF,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,+EAA+E;AAC/E,wBAAgB,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,QAAQ,+BAEpD;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,OAAO,CAAC;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BAE9D"}
@@ -0,0 +1,141 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import Tabs_module_default from "./Tabs.module.js";
3
+ import { Tab, TabList, TabPanel, Tabs } from "react-aria-components";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import { c } from "react/compiler-runtime";
6
+ //#region src/tabs/Tabs.tsx
7
+ /** Tabs: a `TabList` of `Tab`s, then a `TabPanel` per tab, matched by `id`. */
8
+ function Tabs$1(t0) {
9
+ const $ = c(8);
10
+ let className;
11
+ let props;
12
+ if ($[0] !== t0) {
13
+ ({className, ...props} = t0);
14
+ $[0] = t0;
15
+ $[1] = className;
16
+ $[2] = props;
17
+ } else {
18
+ className = $[1];
19
+ props = $[2];
20
+ }
21
+ let t1;
22
+ if ($[3] !== className) {
23
+ t1 = cx(Tabs_module_default.tabs, className);
24
+ $[3] = className;
25
+ $[4] = t1;
26
+ } else t1 = $[4];
27
+ let t2;
28
+ if ($[5] !== props || $[6] !== t1) {
29
+ t2 = /* @__PURE__ */ jsx(Tabs, {
30
+ ...props,
31
+ className: t1
32
+ });
33
+ $[5] = props;
34
+ $[6] = t1;
35
+ $[7] = t2;
36
+ } else t2 = $[7];
37
+ return t2;
38
+ }
39
+ /** The row of tabs. It scrolls sideways when the tabs don't fit, on phones. */
40
+ function TabList$1(t0) {
41
+ const $ = c(8);
42
+ let className;
43
+ let props;
44
+ if ($[0] !== t0) {
45
+ ({className, ...props} = t0);
46
+ $[0] = t0;
47
+ $[1] = className;
48
+ $[2] = props;
49
+ } else {
50
+ className = $[1];
51
+ props = $[2];
52
+ }
53
+ let t1;
54
+ if ($[3] !== className) {
55
+ t1 = cx(Tabs_module_default.list, className);
56
+ $[3] = className;
57
+ $[4] = t1;
58
+ } else t1 = $[4];
59
+ let t2;
60
+ if ($[5] !== props || $[6] !== t1) {
61
+ t2 = /* @__PURE__ */ jsx(TabList, {
62
+ ...props,
63
+ className: t1
64
+ });
65
+ $[5] = props;
66
+ $[6] = t1;
67
+ $[7] = t2;
68
+ } else t2 = $[7];
69
+ return t2;
70
+ }
71
+ /** A tab. Put a `Badge` in it for a count, such as the errors of the panel. */
72
+ function Tab$1(t0) {
73
+ const $ = c(8);
74
+ let className;
75
+ let props;
76
+ if ($[0] !== t0) {
77
+ ({className, ...props} = t0);
78
+ $[0] = t0;
79
+ $[1] = className;
80
+ $[2] = props;
81
+ } else {
82
+ className = $[1];
83
+ props = $[2];
84
+ }
85
+ let t1;
86
+ if ($[3] !== className) {
87
+ t1 = cx(Tabs_module_default.tab, className);
88
+ $[3] = className;
89
+ $[4] = t1;
90
+ } else t1 = $[4];
91
+ let t2;
92
+ if ($[5] !== props || $[6] !== t1) {
93
+ t2 = /* @__PURE__ */ jsx(Tab, {
94
+ ...props,
95
+ className: t1
96
+ });
97
+ $[5] = props;
98
+ $[6] = t1;
99
+ $[7] = t2;
100
+ } else t2 = $[7];
101
+ return t2;
102
+ }
103
+ /**
104
+ * The content of a tab. With `shouldForceMount`, the panel stays mounted (and hidden) when another
105
+ * tab is selected, which keeps the state of its fields.
106
+ */
107
+ function TabPanel$1(t0) {
108
+ const $ = c(8);
109
+ let className;
110
+ let props;
111
+ if ($[0] !== t0) {
112
+ ({className, ...props} = t0);
113
+ $[0] = t0;
114
+ $[1] = className;
115
+ $[2] = props;
116
+ } else {
117
+ className = $[1];
118
+ props = $[2];
119
+ }
120
+ let t1;
121
+ if ($[3] !== className) {
122
+ t1 = cx(Tabs_module_default.panel, className);
123
+ $[3] = className;
124
+ $[4] = t1;
125
+ } else t1 = $[4];
126
+ let t2;
127
+ if ($[5] !== props || $[6] !== t1) {
128
+ t2 = /* @__PURE__ */ jsx(TabPanel, {
129
+ ...props,
130
+ className: t1
131
+ });
132
+ $[5] = props;
133
+ $[6] = t1;
134
+ $[7] = t2;
135
+ } else t2 = $[7];
136
+ return t2;
137
+ }
138
+ //#endregion
139
+ export { Tab$1 as Tab, TabList$1 as TabList, TabPanel$1 as TabPanel, Tabs$1 as Tabs };
140
+
141
+ //# sourceMappingURL=Tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.js","names":["Tabs","_c","styles","AriaTabs","TabList","AriaTabList","Tab","AriaTab","TabPanel","AriaTabPanel"],"sources":["../../src/tabs/Tabs.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport {\n Tab as AriaTab,\n TabList as AriaTabList,\n type TabListProps as AriaTabListProps,\n TabPanel as AriaTabPanel,\n type TabPanelProps as AriaTabPanelProps,\n type TabProps as AriaTabProps,\n Tabs as AriaTabs,\n type TabsProps as AriaTabsProps,\n} from 'react-aria-components';\n\nimport { cx } from '../utils/cx';\nimport styles from './Tabs.module.css';\n\nexport interface TabsProps extends Omit<AriaTabsProps, 'className' | 'style'> {\n className?: string;\n}\n\n/** Tabs: a `TabList` of `Tab`s, then a `TabPanel` per tab, matched by `id`. */\nexport function Tabs({ className, ...props }: TabsProps) {\n return <AriaTabs {...props} className={cx(styles.tabs, className)} />;\n}\n\nexport interface TabListProps<T extends object> extends Omit<\n AriaTabListProps<T>,\n 'className' | 'style'\n> {\n className?: string;\n}\n\n/** The row of tabs. It scrolls sideways when the tabs don't fit, on phones. */\nexport function TabList<T extends object>({ className, ...props }: TabListProps<T>) {\n return <AriaTabList {...props} className={cx(styles.list, className)} />;\n}\n\nexport interface TabProps extends Omit<AriaTabProps, 'className' | 'style' | 'children'> {\n children?: ReactNode;\n className?: string;\n}\n\n/** A tab. Put a `Badge` in it for a count, such as the errors of the panel. */\nexport function Tab({ className, ...props }: TabProps) {\n return <AriaTab {...props} className={cx(styles.tab, className)} />;\n}\n\nexport interface TabPanelProps extends Omit<AriaTabPanelProps, 'className' | 'style'> {\n className?: string;\n}\n\n/**\n * The content of a tab. With `shouldForceMount`, the panel stays mounted (and hidden) when another\n * tab is selected, which keeps the state of its fields.\n */\nexport function TabPanel({ className, ...props }: TabPanelProps) {\n return <AriaTabPanel {...props} className={cx(styles.panel, className)} />;\n}\n"],"mappings":";;;;;;;AAoBA,SAAOA,OAAA,IAAA;CAAA,MAAA,IAAAC,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAc,CAAA,CAAA,WAAA,GAAA,SAAA;EAAkC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,YAAA,EAAA;EAAA,QAAA,EAAA;CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,WAAA;EACZ,KAAA,GAAGC,oBAAM,MAAO,SAAS;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA,EAAA,OAAA,IAAA;EAA1D,KAAA,oBAACC,MAAD;GAAS,GAAK;GAAkB,WAAA;EAA0B,CAAA;EAAI,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAA9D;AAA8D;;AAWzE,SAAOC,UAAA,IAAA;CAAA,MAAA,IAAAH,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAmC,CAAA,CAAA,WAAA,GAAA,SAAA;EAAwC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,YAAA,EAAA;EAAA,QAAA,EAAA;CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,WAAA;EACpC,KAAA,GAAGC,oBAAM,MAAO,SAAS;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA,EAAA,OAAA,IAAA;EAA7D,KAAA,oBAACG,SAAD;GAAY,GAAK;GAAkB,WAAA;EAA0B,CAAA;EAAI,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAAjE;AAAiE;;AAS5E,SAAOC,MAAA,IAAA;CAAA,MAAA,IAAAL,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAa,CAAA,CAAA,WAAA,GAAA,SAAA;EAAiC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,YAAA,EAAA;EAAA,QAAA,EAAA;CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,WAAA;EACX,KAAA,GAAGC,oBAAM,KAAM,SAAS;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA,EAAA,OAAA,IAAA;EAAxD,KAAA,oBAACK,KAAD;GAAQ,GAAK;GAAkB,WAAA;EAAyB,CAAA;EAAI,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAA5D;AAA4D;;;;;AAWvE,SAAOC,WAAA,IAAA;CAAA,MAAA,IAAAP,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAkB,CAAA,CAAA,WAAA,GAAA,SAAA;EAAsC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,YAAA,EAAA;EAAA,QAAA,EAAA;CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,WAAA;EAChB,KAAA,GAAGC,oBAAM,OAAQ,SAAS;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA,EAAA,OAAA,IAAA;EAA/D,KAAA,oBAACO,UAAD;GAAa,GAAK;GAAkB,WAAA;EAA2B,CAAA;EAAI,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAAnE;AAAmE"}
@@ -0,0 +1,16 @@
1
+ import "./Tabs.css";
2
+ //#region src/tabs/Tabs.module.css
3
+ var tabs = "panneau-tabs-JqDxcK";
4
+ var list = "panneau-list-uiIzNm";
5
+ var tab = "panneau-tab-dwPfFm";
6
+ var panel = "panneau-panel-H3uAcq";
7
+ var Tabs_module_default = {
8
+ tabs,
9
+ list,
10
+ tab,
11
+ panel
12
+ };
13
+ //#endregion
14
+ export { Tabs_module_default as default, list, panel, tab, tabs };
15
+
16
+ //# sourceMappingURL=Tabs.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.module.js","names":[],"sources":["../../src/tabs/Tabs.module.css"],"sourcesContent":[".tabs {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-4);\n min-width: 0;\n}\n\n.list {\n display: flex;\n gap: var(--panneau-space-1);\n overflow-x: auto;\n border-bottom: var(--panneau-border-width) solid var(--panneau-color-border);\n scrollbar-width: none;\n}\n\n.list::-webkit-scrollbar {\n display: none;\n}\n\n.tab {\n position: relative;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n gap: var(--panneau-space-2);\n min-height: var(--panneau-control-height);\n padding: 0 var(--panneau-space-3);\n font-size: var(--panneau-font-size-md);\n font-weight: var(--panneau-font-weight-medium);\n color: var(--panneau-color-text-muted);\n white-space: nowrap;\n cursor: pointer;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.tab::after {\n position: absolute;\n inset-inline: var(--panneau-space-2);\n bottom: calc(-1 * var(--panneau-border-width));\n height: 2px;\n content: '';\n background-color: transparent;\n border-radius: 2px 2px 0 0;\n}\n\n.tab[data-hovered] {\n color: var(--panneau-color-text);\n}\n\n.tab[data-selected] {\n color: var(--panneau-color-text);\n}\n\n.tab[data-selected]::after {\n background-color: var(--panneau-color-accent);\n}\n\n.tab[data-disabled] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.tab[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: -2px;\n border-radius: var(--panneau-radius-sm);\n}\n\n.panel {\n min-width: 0;\n outline: none;\n}\n\n.panel[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.panel[data-inert],\n.panel[inert] {\n display: none;\n}\n"],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /* Doubled class: overrides the shared control, whatever the CSS order. */
2
+ .panneau-textArea-ET01uE.panneau-textArea-ET01uE {
3
+ display: block;
4
+ min-height: calc(var(--panneau-control-height) * 2);
5
+ padding: var(--panneau-space-2) var(--panneau-space-3);
6
+ line-height: var(--panneau-line-height);
7
+ resize: vertical;
8
+ }
@@ -0,0 +1,11 @@
1
+ import { type TextFieldProps as AriaTextFieldProps } from 'react-aria-components';
2
+ import { type FieldChromeProps } from '../field/FieldParts';
3
+ export interface TextAreaProps extends Omit<AriaTextFieldProps, 'className' | 'style' | 'children' | 'isInvalid' | 'validate'>, FieldChromeProps {
4
+ placeholder?: string;
5
+ /** Visible lines of text. Defaults to 4. */
6
+ rows?: number;
7
+ textAreaClassName?: string;
8
+ }
9
+ /** A multi-line text input with its label, description and errors. */
10
+ export declare function TextArea({ label, description, errors, placeholder, rows, className, labelClassName, descriptionClassName, errorsClassName, textAreaClassName, isRequired, ...props }: TextAreaProps): import("react").JSX.Element;
11
+ //# sourceMappingURL=TextArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextArea.d.ts","sourceRoot":"","sources":["../../src/text-area/TextArea.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,cAAc,IAAI,kBAAkB,EAE5C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,aACb,SACI,IAAI,CAAC,kBAAkB,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC,EACvF,gBAAgB;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,sEAAsE;AACtE,wBAAgB,QAAQ,CAAC,EACrB,KAAK,EACL,WAAW,EACX,MAAW,EACX,WAAW,EACX,IAAQ,EACR,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,GAAG,KAAK,EACX,EAAE,aAAa,+BAqBf"}
@@ -0,0 +1,41 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import Field_module_default from "../field/Field.module.js";
3
+ import { FieldDescription, FieldErrors, FieldLabel } from "../field/FieldParts.js";
4
+ import TextArea_module_default from "./TextArea.module.js";
5
+ import { TextArea, TextField } from "react-aria-components";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/text-area/TextArea.tsx
8
+ /** A multi-line text input with its label, description and errors. */
9
+ function TextArea$1({ label, description, errors = [], placeholder, rows = 4, className, labelClassName, descriptionClassName, errorsClassName, textAreaClassName, isRequired, ...props }) {
10
+ return /* @__PURE__ */ jsxs(TextField, {
11
+ ...props,
12
+ isRequired,
13
+ isInvalid: errors.length > 0,
14
+ validationBehavior: "aria",
15
+ className: cx(Field_module_default.field, className),
16
+ children: [
17
+ /* @__PURE__ */ jsx(FieldLabel, {
18
+ isRequired,
19
+ className: labelClassName,
20
+ children: label
21
+ }),
22
+ /* @__PURE__ */ jsx(TextArea, {
23
+ placeholder,
24
+ rows,
25
+ className: cx(Field_module_default.control, TextArea_module_default.textArea, textAreaClassName)
26
+ }),
27
+ /* @__PURE__ */ jsx(FieldDescription, {
28
+ className: descriptionClassName,
29
+ children: description
30
+ }),
31
+ /* @__PURE__ */ jsx(FieldErrors, {
32
+ errors,
33
+ className: errorsClassName
34
+ })
35
+ ]
36
+ });
37
+ }
38
+ //#endregion
39
+ export { TextArea$1 as TextArea };
40
+
41
+ //# sourceMappingURL=TextArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextArea.js","names":["TextArea","fieldStyles","AriaTextArea","styles"],"sources":["../../src/text-area/TextArea.tsx"],"sourcesContent":["import {\n TextArea as AriaTextArea,\n type TextFieldProps as AriaTextFieldProps,\n TextField,\n} from 'react-aria-components';\n\nimport {\n type FieldChromeProps,\n FieldDescription,\n FieldErrors,\n FieldLabel,\n fieldStyles,\n} from '../field/FieldParts';\nimport { cx } from '../utils/cx';\nimport styles from './TextArea.module.css';\n\nexport interface TextAreaProps\n extends\n Omit<AriaTextFieldProps, 'className' | 'style' | 'children' | 'isInvalid' | 'validate'>,\n FieldChromeProps {\n placeholder?: string;\n /** Visible lines of text. Defaults to 4. */\n rows?: number;\n textAreaClassName?: string;\n}\n\n/** A multi-line text input with its label, description and errors. */\nexport function TextArea({\n label,\n description,\n errors = [],\n placeholder,\n rows = 4,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n textAreaClassName,\n isRequired,\n ...props\n}: TextAreaProps) {\n return (\n <TextField\n {...props}\n isRequired={isRequired}\n isInvalid={errors.length > 0}\n validationBehavior=\"aria\"\n className={cx(fieldStyles.field, className)}\n >\n <FieldLabel isRequired={isRequired} className={labelClassName}>\n {label}\n </FieldLabel>\n <AriaTextArea\n placeholder={placeholder}\n rows={rows}\n className={cx(fieldStyles.control, styles.textArea, textAreaClassName)}\n />\n <FieldDescription className={descriptionClassName}>{description}</FieldDescription>\n <FieldErrors errors={errors} className={errorsClassName} />\n </TextField>\n );\n}\n"],"mappings":";;;;;;;;AA2BA,SAAgBA,WAAS,EACrB,OACA,aACA,SAAS,CAAA,GACT,aACA,OAAO,GACP,WACA,gBACA,sBACA,iBACA,mBACA,YACA,GAAG,SACW;CACd,OACI,qBAAC,WAAD;EACI,GAAI;EACQ;EACZ,WAAW,OAAO,SAAS;EAC3B,oBAAmB;EACnB,WAAW,GAAGC,qBAAY,OAAO,SAAS;EAL9C,UAAA;GAOI,oBAAC,YAAD;IAAwB;IAAY,WAAW;IAC1C,UAAA;GACO,CAAA;GACZ,oBAACC,UAAD;IACiB;IACP;IACN,WAAW,GAAGD,qBAAY,SAASE,wBAAO,UAAU,iBAAiB;GAAE,CAAA;GAE3E,oBAAC,kBAAD;IAAkB,WAAW;IAAuB,UAAA;GAA8B,CAAA;GAClF,oBAAC,aAAD;IAAqB;IAAQ,WAAW;GAAgB,CAAA;EACjD;;AAEnB"}
@@ -0,0 +1,8 @@
1
+ import "./TextArea.css";
2
+ //#region src/text-area/TextArea.module.css
3
+ var textArea = "panneau-textArea-ET01uE";
4
+ var TextArea_module_default = { textArea };
5
+ //#endregion
6
+ export { TextArea_module_default as default, textArea };
7
+
8
+ //# sourceMappingURL=TextArea.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextArea.module.js","names":[],"sources":["../../src/text-area/TextArea.module.css"],"sourcesContent":["/* Doubled class: overrides the shared control, whatever the CSS order. */\n.textArea.textArea {\n display: block;\n min-height: calc(var(--panneau-control-height) * 2);\n padding: var(--panneau-space-2) var(--panneau-space-3);\n line-height: var(--panneau-line-height);\n resize: vertical;\n}\n"],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type TextFieldProps as AriaTextFieldProps } from 'react-aria-components';
3
+ import { type FieldChromeProps } from '../field/FieldParts';
4
+ export interface TextInputProps extends Omit<AriaTextFieldProps, 'className' | 'style' | 'children' | 'isInvalid' | 'validate' | 'type'>, FieldChromeProps {
5
+ type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';
6
+ placeholder?: string;
7
+ /** Content before the text, inside the control: a unit, a URL prefix, an icon. */
8
+ prefix?: ReactNode;
9
+ /** Content after the text, inside the control. */
10
+ suffix?: ReactNode;
11
+ /** Class name of the control (the box around the text). */
12
+ controlClassName?: string;
13
+ inputClassName?: string;
14
+ }
15
+ /** A single-line text input with its label, description and errors. */
16
+ export declare function TextInput({ label, description, errors, placeholder, prefix, suffix, className, labelClassName, descriptionClassName, errorsClassName, controlClassName, inputClassName, isRequired, isReadOnly, ...props }: TextInputProps): import("react").JSX.Element;
17
+ //# sourceMappingURL=TextInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../src/text-input/TextInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EACH,KAAK,cAAc,IAAI,kBAAkB,EAI5C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,cACb,SACI,IAAI,CACA,kBAAkB,EAClB,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CACzE,EACD,gBAAgB;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,WAAW,EACX,MAAW,EACX,WAAW,EACX,MAAM,EACN,MAAM,EACN,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,UAAU,EACV,GAAG,KAAK,EACX,EAAE,cAAc,+BAwChB"}
@@ -0,0 +1,61 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import Field_module_default from "../field/Field.module.js";
3
+ import { FieldDescription, FieldErrors, FieldLabel } from "../field/FieldParts.js";
4
+ import { Group, Input, TextField } from "react-aria-components";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/text-input/TextInput.tsx
7
+ /** A single-line text input with its label, description and errors. */
8
+ function TextInput({ label, description, errors = [], placeholder, prefix, suffix, className, labelClassName, descriptionClassName, errorsClassName, controlClassName, inputClassName, isRequired, isReadOnly, ...props }) {
9
+ const invalid = errors.length > 0;
10
+ const adorned = prefix !== void 0 || suffix !== void 0;
11
+ return /* @__PURE__ */ jsxs(TextField, {
12
+ ...props,
13
+ isRequired,
14
+ isReadOnly,
15
+ isInvalid: invalid,
16
+ validationBehavior: "aria",
17
+ className: cx(Field_module_default.field, className),
18
+ children: [
19
+ /* @__PURE__ */ jsx(FieldLabel, {
20
+ isRequired,
21
+ className: labelClassName,
22
+ children: label
23
+ }),
24
+ adorned ? /* @__PURE__ */ jsxs(Group, {
25
+ className: cx(Field_module_default.control, controlClassName),
26
+ "data-invalid": invalid || void 0,
27
+ "data-readonly": isReadOnly || void 0,
28
+ isDisabled: props.isDisabled,
29
+ children: [
30
+ prefix !== void 0 ? /* @__PURE__ */ jsx("span", {
31
+ className: Field_module_default.adornment,
32
+ children: prefix
33
+ }) : null,
34
+ /* @__PURE__ */ jsx(Input, {
35
+ placeholder,
36
+ className: cx(Field_module_default.bare, inputClassName)
37
+ }),
38
+ suffix !== void 0 ? /* @__PURE__ */ jsx("span", {
39
+ className: Field_module_default.adornment,
40
+ children: suffix
41
+ }) : null
42
+ ]
43
+ }) : /* @__PURE__ */ jsx(Input, {
44
+ placeholder,
45
+ className: cx(Field_module_default.control, controlClassName, inputClassName)
46
+ }),
47
+ /* @__PURE__ */ jsx(FieldDescription, {
48
+ className: descriptionClassName,
49
+ children: description
50
+ }),
51
+ /* @__PURE__ */ jsx(FieldErrors, {
52
+ errors,
53
+ className: errorsClassName
54
+ })
55
+ ]
56
+ });
57
+ }
58
+ //#endregion
59
+ export { TextInput };
60
+
61
+ //# sourceMappingURL=TextInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInput.js","names":["styles"],"sources":["../../src/text-input/TextInput.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport {\n type TextFieldProps as AriaTextFieldProps,\n Group,\n Input,\n TextField,\n} from 'react-aria-components';\n\nimport {\n type FieldChromeProps,\n FieldDescription,\n FieldErrors,\n FieldLabel,\n fieldStyles as styles,\n} from '../field/FieldParts';\nimport { cx } from '../utils/cx';\n\nexport interface TextInputProps\n extends\n Omit<\n AriaTextFieldProps,\n 'className' | 'style' | 'children' | 'isInvalid' | 'validate' | 'type'\n >,\n FieldChromeProps {\n type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';\n placeholder?: string;\n /** Content before the text, inside the control: a unit, a URL prefix, an icon. */\n prefix?: ReactNode;\n /** Content after the text, inside the control. */\n suffix?: ReactNode;\n /** Class name of the control (the box around the text). */\n controlClassName?: string;\n inputClassName?: string;\n}\n\n/** A single-line text input with its label, description and errors. */\nexport function TextInput({\n label,\n description,\n errors = [],\n placeholder,\n prefix,\n suffix,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n inputClassName,\n isRequired,\n isReadOnly,\n ...props\n}: TextInputProps) {\n const invalid = errors.length > 0;\n const adorned = prefix !== undefined || suffix !== undefined;\n return (\n <TextField\n {...props}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isInvalid={invalid}\n validationBehavior=\"aria\"\n className={cx(styles.field, className)}\n >\n <FieldLabel isRequired={isRequired} className={labelClassName}>\n {label}\n </FieldLabel>\n {adorned ? (\n <Group\n className={cx(styles.control, controlClassName)}\n data-invalid={invalid || undefined}\n data-readonly={isReadOnly || undefined}\n isDisabled={props.isDisabled}\n >\n {prefix !== undefined ? (\n <span className={styles.adornment}>{prefix}</span>\n ) : null}\n <Input placeholder={placeholder} className={cx(styles.bare, inputClassName)} />\n {suffix !== undefined ? (\n <span className={styles.adornment}>{suffix}</span>\n ) : null}\n </Group>\n ) : (\n <Input\n placeholder={placeholder}\n className={cx(styles.control, controlClassName, inputClassName)}\n />\n )}\n <FieldDescription className={descriptionClassName}>{description}</FieldDescription>\n <FieldErrors errors={errors} className={errorsClassName} />\n </TextField>\n );\n}\n"],"mappings":";;;;;;;AAoCA,SAAgB,UAAU,EACtB,OACA,aACA,SAAS,CAAA,GACT,aACA,QACA,QACA,WACA,gBACA,sBACA,iBACA,kBACA,gBACA,YACA,YACA,GAAG,SACY;CACf,MAAM,UAAU,OAAO,SAAS;CAChC,MAAM,UAAU,WAAW,KAAA,KAAa,WAAW,KAAA;CACnD,OACI,qBAAC,WAAD;EACI,GAAI;EACQ;EACA;EACZ,WAAW;EACX,oBAAmB;EACnB,WAAW,GAAGA,qBAAO,OAAO,SAAS;EANzC,UAAA;GAQI,oBAAC,YAAD;IAAwB;IAAY,WAAW;IAC1C,UAAA;GACO,CAAA;GACX,UACG,qBAAC,OAAD;IACI,WAAW,GAAGA,qBAAO,SAAS,gBAAgB;IAC9C,gBAAc,WAAW,KAAA;IACzB,iBAAe,cAAc,KAAA;IAC7B,YAAY,MAAM;IAJtB,UAAA;KAMK,WAAW,KAAA,IACR,oBAAC,QAAD;MAAM,WAAWA,qBAAO;MAAY,UAAA;KAAa,CAAA,IACjD;KACJ,oBAAC,OAAD;MAAoB;MAAa,WAAW,GAAGA,qBAAO,MAAM,cAAc;KAAE,CAAA;KAC3E,WAAW,KAAA,IACR,oBAAC,QAAD;MAAM,WAAWA,qBAAO;MAAY,UAAA;KAAa,CAAA,IACjD;IACD;GAEP,CAAA,IAAA,oBAAC,OAAD;IACiB;IACb,WAAW,GAAGA,qBAAO,SAAS,kBAAkB,cAAc;GAAE,CAAA;GAGxE,oBAAC,kBAAD;IAAkB,WAAW;IAAuB,UAAA;GAA8B,CAAA;GAClF,oBAAC,aAAD;IAAqB;IAAQ,WAAW;GAAgB,CAAA;EACjD;;AAEnB"}
@@ -0,0 +1,8 @@
1
+ import type { Theme } from './theme';
2
+ /**
3
+ * Maps Panneau's tokens to the CSS variables of Bootstrap 5.3, for sites that use Bootstrap: Panneau
4
+ * then follows the site's colors, fonts and radii, and its color mode (`data-bs-theme`), without
5
+ * using any Bootstrap class. Bootstrap's CSS must be loaded by the site.
6
+ */
7
+ export declare const bootstrapTheme: Theme;
8
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/theme/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,KAkD5B,CAAC"}
@@ -0,0 +1,61 @@
1
+ //#region src/theme/bootstrap.ts
2
+ /**
3
+ * Maps Panneau's tokens to the CSS variables of Bootstrap 5.3, for sites that use Bootstrap: Panneau
4
+ * then follows the site's colors, fonts and radii, and its color mode (`data-bs-theme`), without
5
+ * using any Bootstrap class. Bootstrap's CSS must be loaded by the site.
6
+ */
7
+ var bootstrapTheme = {
8
+ label: "Bootstrap",
9
+ tokens: {
10
+ "panneau-color-bg": "var(--bs-body-bg)",
11
+ "panneau-color-surface": "var(--bs-body-bg)",
12
+ "panneau-color-surface-sunken": "var(--bs-tertiary-bg)",
13
+ "panneau-color-surface-raised": "var(--bs-body-bg)",
14
+ "panneau-color-hover": "rgba(var(--bs-emphasis-color-rgb), 0.06)",
15
+ "panneau-color-pressed": "rgba(var(--bs-emphasis-color-rgb), 0.1)",
16
+ "panneau-color-text": "var(--bs-body-color)",
17
+ "panneau-color-text-muted": "var(--bs-secondary-color)",
18
+ "panneau-color-link": "var(--bs-link-color)",
19
+ "panneau-color-border": "var(--bs-border-color)",
20
+ "panneau-color-border-control": "var(--bs-border-color)",
21
+ "panneau-color-accent": "var(--bs-primary)",
22
+ "panneau-color-accent-hover": "color-mix(in srgb, var(--bs-primary), #000 15%)",
23
+ "panneau-color-accent-text": "var(--bs-white)",
24
+ "panneau-color-accent-subtle": "var(--bs-primary-bg-subtle)",
25
+ "panneau-color-focus": "rgba(var(--bs-primary-rgb), 0.5)",
26
+ "panneau-color-danger": "var(--bs-danger-text-emphasis)",
27
+ "panneau-color-danger-subtle": "var(--bs-danger-bg-subtle)",
28
+ "panneau-color-danger-border": "var(--bs-danger-border-subtle)",
29
+ "panneau-color-danger-solid": "var(--bs-danger)",
30
+ "panneau-color-danger-solid-hover": "color-mix(in srgb, var(--bs-danger), #000 15%)",
31
+ "panneau-color-danger-solid-text": "var(--bs-white)",
32
+ "panneau-color-success": "var(--bs-success-text-emphasis)",
33
+ "panneau-color-success-subtle": "var(--bs-success-bg-subtle)",
34
+ "panneau-color-success-border": "var(--bs-success-border-subtle)",
35
+ "panneau-color-warning": "var(--bs-warning-text-emphasis)",
36
+ "panneau-color-warning-subtle": "var(--bs-warning-bg-subtle)",
37
+ "panneau-color-warning-border": "var(--bs-warning-border-subtle)",
38
+ "panneau-color-info": "var(--bs-info-text-emphasis)",
39
+ "panneau-color-info-subtle": "var(--bs-info-bg-subtle)",
40
+ "panneau-color-info-border": "var(--bs-info-border-subtle)",
41
+ "panneau-font-family": "var(--bs-body-font-family)",
42
+ "panneau-font-family-mono": "var(--bs-font-monospace)",
43
+ "panneau-font-size-md": "var(--bs-body-font-size)",
44
+ "panneau-font-size-control": "var(--bs-body-font-size)",
45
+ "panneau-line-height": "var(--bs-body-line-height)",
46
+ "panneau-radius-sm": "var(--bs-border-radius-sm)",
47
+ "panneau-radius-md": "var(--bs-border-radius)",
48
+ "panneau-radius-lg": "var(--bs-border-radius-lg)",
49
+ "panneau-radius-full": "var(--bs-border-radius-pill)",
50
+ "panneau-border-width": "var(--bs-border-width)",
51
+ "panneau-shadow-sm": "var(--bs-box-shadow-sm)",
52
+ "panneau-shadow-md": "var(--bs-box-shadow)",
53
+ "panneau-shadow-lg": "var(--bs-box-shadow-lg)",
54
+ "panneau-control-height": "calc(1.5em + 0.75rem + 2 * var(--bs-border-width))",
55
+ "panneau-control-height-sm": "calc(1.5em + 0.5rem + 2 * var(--bs-border-width))"
56
+ }
57
+ };
58
+ //#endregion
59
+ export { bootstrapTheme };
60
+
61
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","names":[],"sources":["../../src/theme/bootstrap.ts"],"sourcesContent":["import type { Theme } from './theme';\n\n/**\n * Maps Panneau's tokens to the CSS variables of Bootstrap 5.3, for sites that use Bootstrap: Panneau\n * then follows the site's colors, fonts and radii, and its color mode (`data-bs-theme`), without\n * using any Bootstrap class. Bootstrap's CSS must be loaded by the site.\n */\nexport const bootstrapTheme: Theme = {\n label: 'Bootstrap',\n tokens: {\n 'panneau-color-bg': 'var(--bs-body-bg)',\n 'panneau-color-surface': 'var(--bs-body-bg)',\n 'panneau-color-surface-sunken': 'var(--bs-tertiary-bg)',\n 'panneau-color-surface-raised': 'var(--bs-body-bg)',\n 'panneau-color-hover': 'rgba(var(--bs-emphasis-color-rgb), 0.06)',\n 'panneau-color-pressed': 'rgba(var(--bs-emphasis-color-rgb), 0.1)',\n 'panneau-color-text': 'var(--bs-body-color)',\n 'panneau-color-text-muted': 'var(--bs-secondary-color)',\n 'panneau-color-link': 'var(--bs-link-color)',\n 'panneau-color-border': 'var(--bs-border-color)',\n 'panneau-color-border-control': 'var(--bs-border-color)',\n 'panneau-color-accent': 'var(--bs-primary)',\n 'panneau-color-accent-hover': 'color-mix(in srgb, var(--bs-primary), #000 15%)',\n 'panneau-color-accent-text': 'var(--bs-white)',\n 'panneau-color-accent-subtle': 'var(--bs-primary-bg-subtle)',\n 'panneau-color-focus': 'rgba(var(--bs-primary-rgb), 0.5)',\n 'panneau-color-danger': 'var(--bs-danger-text-emphasis)',\n 'panneau-color-danger-subtle': 'var(--bs-danger-bg-subtle)',\n 'panneau-color-danger-border': 'var(--bs-danger-border-subtle)',\n 'panneau-color-danger-solid': 'var(--bs-danger)',\n 'panneau-color-danger-solid-hover': 'color-mix(in srgb, var(--bs-danger), #000 15%)',\n 'panneau-color-danger-solid-text': 'var(--bs-white)',\n 'panneau-color-success': 'var(--bs-success-text-emphasis)',\n 'panneau-color-success-subtle': 'var(--bs-success-bg-subtle)',\n 'panneau-color-success-border': 'var(--bs-success-border-subtle)',\n 'panneau-color-warning': 'var(--bs-warning-text-emphasis)',\n 'panneau-color-warning-subtle': 'var(--bs-warning-bg-subtle)',\n 'panneau-color-warning-border': 'var(--bs-warning-border-subtle)',\n 'panneau-color-info': 'var(--bs-info-text-emphasis)',\n 'panneau-color-info-subtle': 'var(--bs-info-bg-subtle)',\n 'panneau-color-info-border': 'var(--bs-info-border-subtle)',\n 'panneau-font-family': 'var(--bs-body-font-family)',\n 'panneau-font-family-mono': 'var(--bs-font-monospace)',\n 'panneau-font-size-md': 'var(--bs-body-font-size)',\n 'panneau-font-size-control': 'var(--bs-body-font-size)',\n 'panneau-line-height': 'var(--bs-body-line-height)',\n 'panneau-radius-sm': 'var(--bs-border-radius-sm)',\n 'panneau-radius-md': 'var(--bs-border-radius)',\n 'panneau-radius-lg': 'var(--bs-border-radius-lg)',\n 'panneau-radius-full': 'var(--bs-border-radius-pill)',\n 'panneau-border-width': 'var(--bs-border-width)',\n 'panneau-shadow-sm': 'var(--bs-box-shadow-sm)',\n 'panneau-shadow-md': 'var(--bs-box-shadow)',\n 'panneau-shadow-lg': 'var(--bs-box-shadow-lg)',\n 'panneau-control-height': 'calc(1.5em + 0.75rem + 2 * var(--bs-border-width))',\n 'panneau-control-height-sm': 'calc(1.5em + 0.5rem + 2 * var(--bs-border-width))',\n },\n};\n"],"mappings":";;;;;;AAOA,IAAa,iBAAwB;CACjC,OAAO;CACP,QAAQ;EACJ,oBAAoB;EACpB,yBAAyB;EACzB,gCAAgC;EAChC,gCAAgC;EAChC,uBAAuB;EACvB,yBAAyB;EACzB,sBAAsB;EACtB,4BAA4B;EAC5B,sBAAsB;EACtB,wBAAwB;EACxB,gCAAgC;EAChC,wBAAwB;EACxB,8BAA8B;EAC9B,6BAA6B;EAC7B,+BAA+B;EAC/B,uBAAuB;EACvB,wBAAwB;EACxB,+BAA+B;EAC/B,+BAA+B;EAC/B,8BAA8B;EAC9B,oCAAoC;EACpC,mCAAmC;EACnC,yBAAyB;EACzB,gCAAgC;EAChC,gCAAgC;EAChC,yBAAyB;EACzB,gCAAgC;EAChC,gCAAgC;EAChC,sBAAsB;EACtB,6BAA6B;EAC7B,6BAA6B;EAC7B,uBAAuB;EACvB,4BAA4B;EAC5B,wBAAwB;EACxB,6BAA6B;EAC7B,uBAAuB;EACvB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,uBAAuB;EACvB,wBAAwB;EACxB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,0BAA0B;EAC1B,6BAA6B;CACjC;AACJ"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * A theme: design tokens, as CSS variables without the leading `--`, with optional overrides for
3
+ * the dark scheme. It has the same shape as the `Theme` of `@panneau/core` plugins.
4
+ */
5
+ export interface Theme {
6
+ label?: string;
7
+ /** Tokens of the light scheme, or of both schemes without `dark`: `{ 'panneau-color-accent': '#05f' }`. */
8
+ tokens: Record<string, string>;
9
+ /** Tokens that change in the dark scheme. */
10
+ dark?: Record<string, string>;
11
+ }
12
+ /** `auto` follows the system setting (`prefers-color-scheme`). */
13
+ export type ColorScheme = 'light' | 'dark' | 'auto';
14
+ /** A short, stable hash of a string, to scope the CSS of a theme. */
15
+ export declare function hashString(value: string): string;
16
+ /**
17
+ * The CSS of a theme, scoped to the roots that carry `data-panneau-theme="<scope>"`. Its rules are
18
+ * more specific than the default tokens, and dark overrides more specific than light ones. Token
19
+ * names must be plain identifiers, and values can't contain `{`, `}`, `;` or `<`: other entries are
20
+ * ignored.
21
+ */
22
+ export declare function getThemeCss(theme: Theme, scope: string): string;
23
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/theme/theme.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,KAAK;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2GAA2G;IAC3G,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,kEAAkE;AAClE,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AASpD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW/D"}
@@ -0,0 +1,30 @@
1
+ //#region src/theme/theme.ts
2
+ function declarations(tokens) {
3
+ return Object.entries(tokens).filter(([name, value]) => /^[a-zA-Z0-9-_]+$/.test(name) && !/[{};<]/.test(value)).map(([name, value]) => `--${name}:${value};`).join("");
4
+ }
5
+ /** A short, stable hash of a string, to scope the CSS of a theme. */
6
+ function hashString(value) {
7
+ let hash = 5381;
8
+ for (let index = 0; index < value.length; index += 1) hash = hash * 33 ^ value.charCodeAt(index);
9
+ return (hash >>> 0).toString(36);
10
+ }
11
+ /**
12
+ * The CSS of a theme, scoped to the roots that carry `data-panneau-theme="<scope>"`. Its rules are
13
+ * more specific than the default tokens, and dark overrides more specific than light ones. Token
14
+ * names must be plain identifiers, and values can't contain `{`, `}`, `;` or `<`: other entries are
15
+ * ignored.
16
+ */
17
+ function getThemeCss(theme, scope) {
18
+ const root = `[data-panneau-theme="${scope}"]`;
19
+ const light = declarations(theme.tokens);
20
+ const dark = theme.dark !== void 0 ? declarations(theme.dark) : "";
21
+ return [
22
+ light !== "" ? `${root}{${light}}` : "",
23
+ dark !== "" ? `${root}[data-color-scheme="dark"]{${dark}}` : "",
24
+ dark !== "" ? `@media (prefers-color-scheme: dark){${root}[data-color-scheme="auto"]{${dark}}}` : ""
25
+ ].join("");
26
+ }
27
+ //#endregion
28
+ export { getThemeCss, hashString };
29
+
30
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","names":[],"sources":["../../src/theme/theme.ts"],"sourcesContent":["/**\n * A theme: design tokens, as CSS variables without the leading `--`, with optional overrides for\n * the dark scheme. It has the same shape as the `Theme` of `@panneau/core` plugins.\n */\nexport interface Theme {\n label?: string;\n /** Tokens of the light scheme, or of both schemes without `dark`: `{ 'panneau-color-accent': '#05f' }`. */\n tokens: Record<string, string>;\n /** Tokens that change in the dark scheme. */\n dark?: Record<string, string>;\n}\n\n/** `auto` follows the system setting (`prefers-color-scheme`). */\nexport type ColorScheme = 'light' | 'dark' | 'auto';\n\nfunction declarations(tokens: Record<string, string>): string {\n return Object.entries(tokens)\n .filter(([name, value]) => /^[a-zA-Z0-9-_]+$/.test(name) && !/[{};<]/.test(value))\n .map(([name, value]) => `--${name}:${value};`)\n .join('');\n}\n\n/** A short, stable hash of a string, to scope the CSS of a theme. */\nexport function hashString(value: string): string {\n let hash = 5381;\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash * 33) ^ value.charCodeAt(index);\n }\n return (hash >>> 0).toString(36);\n}\n\n/**\n * The CSS of a theme, scoped to the roots that carry `data-panneau-theme=\"<scope>\"`. Its rules are\n * more specific than the default tokens, and dark overrides more specific than light ones. Token\n * names must be plain identifiers, and values can't contain `{`, `}`, `;` or `<`: other entries are\n * ignored.\n */\nexport function getThemeCss(theme: Theme, scope: string): string {\n const root = `[data-panneau-theme=\"${scope}\"]`;\n const light = declarations(theme.tokens);\n const dark = theme.dark !== undefined ? declarations(theme.dark) : '';\n return [\n light !== '' ? `${root}{${light}}` : '',\n dark !== '' ? `${root}[data-color-scheme=\"dark\"]{${dark}}` : '',\n dark !== ''\n ? `@media (prefers-color-scheme: dark){${root}[data-color-scheme=\"auto\"]{${dark}}}`\n : '',\n ].join('');\n}\n"],"mappings":";AAeA,SAAS,aAAa,QAAwC;CAC1D,OAAO,OAAO,QAAQ,MAAM,CAAC,CACxB,QAAQ,CAAC,MAAM,WAAW,mBAAmB,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CACjF,KAAK,CAAC,MAAM,WAAW,KAAK,KAAI,GAAI,MAAK,EAAG,CAAC,CAC7C,KAAK,EAAE;AAChB;;AAGA,SAAgB,WAAW,OAAuB;CAC9C,IAAI,OAAO;CACX,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAC/C,OAAQ,OAAO,KAAM,MAAM,WAAW,KAAK;CAE/C,QAAQ,SAAS,EAAA,CAAG,SAAS,EAAE;AACnC;;;;;;;AAQA,SAAgB,YAAY,OAAc,OAAuB;CAC7D,MAAM,OAAO,wBAAwB,MAAK;CAC1C,MAAM,QAAQ,aAAa,MAAM,MAAM;CACvC,MAAM,OAAO,MAAM,SAAS,KAAA,IAAY,aAAa,MAAM,IAAI,IAAI;CACnE,OAAO;EACH,UAAU,KAAK,GAAG,KAAI,GAAI,MAAK,KAAM;EACrC,SAAS,KAAK,GAAG,KAAI,6BAA8B,KAAI,KAAM;EAC7D,SAAS,KACH,uCAAuC,KAAI,6BAA8B,KAAI,MAC7E;CAAE,CACX,CAAC,KAAK,EAAE;AACb"}