@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,43 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import { Icon } from "../icon/Icon.js";
3
+ import Disclosure_module_default from "./Disclosure.module.js";
4
+ import { ChevronRight } from "lucide-react";
5
+ import { Button, Disclosure, DisclosurePanel, Heading } from "react-aria-components";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/disclosure/Disclosure.tsx
8
+ /** A section whose content can be collapsed under its title. */
9
+ function Disclosure$1({ title, titleEnd, headingLevel = 3, children, className, triggerClassName, panelClassName, ...props }) {
10
+ return /* @__PURE__ */ jsxs(Disclosure, {
11
+ ...props,
12
+ className: cx(Disclosure_module_default.disclosure, className),
13
+ children: [/* @__PURE__ */ jsx(Heading, {
14
+ level: headingLevel,
15
+ className: Disclosure_module_default.heading,
16
+ children: /* @__PURE__ */ jsxs(Button, {
17
+ slot: "trigger",
18
+ className: cx(Disclosure_module_default.trigger, triggerClassName),
19
+ children: [
20
+ /* @__PURE__ */ jsx(Icon, {
21
+ icon: ChevronRight,
22
+ className: Disclosure_module_default.chevron
23
+ }),
24
+ /* @__PURE__ */ jsx("span", {
25
+ className: Disclosure_module_default.title,
26
+ children: title
27
+ }),
28
+ titleEnd !== void 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [" ", titleEnd] }) : null
29
+ ]
30
+ })
31
+ }), /* @__PURE__ */ jsx(DisclosurePanel, {
32
+ className: cx(Disclosure_module_default.panel, panelClassName),
33
+ children: /* @__PURE__ */ jsx("div", {
34
+ className: Disclosure_module_default.panelContent,
35
+ children
36
+ })
37
+ })]
38
+ });
39
+ }
40
+ //#endregion
41
+ export { Disclosure$1 as Disclosure };
42
+
43
+ //# sourceMappingURL=Disclosure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Disclosure.js","names":["Disclosure","AriaDisclosure","styles","_Fragment"],"sources":["../../src/disclosure/Disclosure.tsx"],"sourcesContent":["import { ChevronRight } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport {\n Disclosure as AriaDisclosure,\n Button,\n DisclosurePanel,\n Heading,\n} from 'react-aria-components';\n\nimport { Icon } from '../icon/Icon';\nimport { cx } from '../utils/cx';\nimport styles from './Disclosure.module.css';\n\nexport interface DisclosureProps {\n /** Title of the button that expands and collapses the content. */\n title: ReactNode;\n /** Content after the title, in the button: a count of errors. */\n titleEnd?: ReactNode;\n /** Heading level of the title. Defaults to 3. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n children?: ReactNode;\n isExpanded?: boolean;\n defaultExpanded?: boolean;\n onExpandedChange?: (isExpanded: boolean) => void;\n id?: string;\n className?: string;\n triggerClassName?: string;\n panelClassName?: string;\n}\n\n/** A section whose content can be collapsed under its title. */\nexport function Disclosure({\n title,\n titleEnd,\n headingLevel = 3,\n children,\n className,\n triggerClassName,\n panelClassName,\n ...props\n}: DisclosureProps) {\n return (\n <AriaDisclosure {...props} className={cx(styles.disclosure, className)}>\n <Heading level={headingLevel} className={styles.heading}>\n <Button slot=\"trigger\" className={cx(styles.trigger, triggerClassName)}>\n <Icon icon={ChevronRight} className={styles.chevron} />\n <span className={styles.title}>{title}</span>\n {titleEnd !== undefined ? <> {titleEnd}</> : null}\n </Button>\n </Heading>\n <DisclosurePanel className={cx(styles.panel, panelClassName)}>\n <div className={styles.panelContent}>{children}</div>\n </DisclosurePanel>\n </AriaDisclosure>\n );\n}\n"],"mappings":";;;;;;;;AA+BA,SAAgBA,aAAW,EACvB,OACA,UACA,eAAe,GACf,UACA,WACA,kBACA,gBACA,GAAG,SACa;CAChB,OACI,qBAACC,YAAD;EAAgB,GAAI;EAAO,WAAW,GAAGC,0BAAO,YAAY,SAAS;EAArE,UAAA,CACI,oBAAC,SAAD;GAAS,OAAO;GAAc,WAAWA,0BAAO;GAC5C,UAAA,qBAAC,QAAD;IAAQ,MAAK;IAAU,WAAW,GAAGA,0BAAO,SAAS,gBAAgB;IAArE,UAAA;KACI,oBAAC,MAAD;MAAM,MAAM;MAAc,WAAWA,0BAAO;KAAQ,CAAA;KACpD,oBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAQ,UAAA;KAAY,CAAA;KAC3C,aAAa,KAAA,IAAY,qBAAAC,UAAA,EAAA,UAAA,CAAE,KAAE,QAAS,EAAA,CAAA,IAAM;IACzC;;EACH,CAAA,GACT,oBAAC,iBAAD;GAAiB,WAAW,GAAGD,0BAAO,OAAO,cAAc;GACvD,UAAA,oBAAC,OAAD;IAAK,WAAWA,0BAAO;IAAe;GAAc,CAAA;EACvC,CAAA,CACL;;AAExB"}
@@ -0,0 +1,22 @@
1
+ import "./Disclosure.css";
2
+ //#region src/disclosure/Disclosure.module.css
3
+ var disclosure = "panneau-disclosure-WME8SS";
4
+ var trigger = "panneau-trigger-0Jo--Y";
5
+ var chevron = "panneau-chevron-1tYsh0";
6
+ var title = "panneau-title-DSKeDu";
7
+ var panel = "panneau-panel-heR-bQ";
8
+ var panelContent = "panneau-panelContent-FQV3Na";
9
+ var heading = "panneau-heading-pnG2s2";
10
+ var Disclosure_module_default = {
11
+ disclosure,
12
+ trigger,
13
+ chevron,
14
+ title,
15
+ panel,
16
+ panelContent,
17
+ heading
18
+ };
19
+ //#endregion
20
+ export { chevron, Disclosure_module_default as default, disclosure, heading, panel, panelContent, title, trigger };
21
+
22
+ //# sourceMappingURL=Disclosure.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Disclosure.module.js","names":[],"sources":["../../src/disclosure/Disclosure.module.css"],"sourcesContent":[".disclosure {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.trigger {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n width: 100%;\n min-height: var(--panneau-control-height);\n padding: 0;\n font-size: var(--panneau-font-size-lg);\n font-weight: var(--panneau-font-weight-bold);\n text-align: start;\n color: var(--panneau-color-text);\n cursor: pointer;\n background: transparent;\n border: 0;\n border-radius: var(--panneau-radius-sm);\n}\n\n.trigger[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.chevron {\n color: var(--panneau-color-text-muted);\n transition: transform var(--panneau-duration);\n}\n\n.disclosure[data-expanded] .chevron {\n transform: rotate(90deg);\n}\n\n.title {\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.panel {\n min-width: 0;\n}\n\n.panelContent {\n padding-top: var(--panneau-space-3);\n}\n\n.heading {\n margin: 0;\n font: inherit;\n}\n"],"mappings":""}
@@ -0,0 +1,145 @@
1
+ /* Shared look of labelled controls: label, description, errors and the control itself. */
2
+
3
+ .panneau-field-llXva6 {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--panneau-space-1);
7
+ min-width: 0;
8
+ }
9
+
10
+ .panneau-label-Q70cID {
11
+ font-size: var(--panneau-font-size-md);
12
+ font-weight: var(--panneau-font-weight-medium);
13
+ line-height: var(--panneau-line-height-tight);
14
+ color: var(--panneau-color-text);
15
+ overflow-wrap: anywhere;
16
+ }
17
+
18
+ .panneau-required-qGQQMa {
19
+ margin-inline-start: 0.2em;
20
+ color: var(--panneau-color-danger);
21
+ }
22
+
23
+ .panneau-description-6IPisp {
24
+ font-size: var(--panneau-font-size-sm);
25
+ color: var(--panneau-color-text-muted);
26
+ }
27
+
28
+ .panneau-errors-YFI9As {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: var(--panneau-space-1);
32
+ font-size: var(--panneau-font-size-sm);
33
+ color: var(--panneau-color-danger);
34
+ }
35
+
36
+ .panneau-error-UWz-28 {
37
+ display: block;
38
+ }
39
+
40
+ .panneau-control-eHvm-h {
41
+ display: flex;
42
+ align-items: center;
43
+ width: 100%;
44
+ min-width: 0;
45
+ min-height: var(--panneau-control-height);
46
+ padding: 0 var(--panneau-space-3);
47
+ font-size: var(--panneau-font-size-control);
48
+ line-height: var(--panneau-line-height-tight);
49
+ color: var(--panneau-color-text);
50
+ background-color: var(--panneau-color-surface);
51
+ border: var(--panneau-border-width) solid var(--panneau-color-border-control);
52
+ border-radius: var(--panneau-radius-md);
53
+ transition:
54
+ border-color var(--panneau-duration),
55
+ box-shadow var(--panneau-duration);
56
+ }
57
+
58
+ .panneau-control-eHvm-h::placeholder {
59
+ color: var(--panneau-color-text-muted);
60
+ opacity: 1;
61
+ }
62
+
63
+ .panneau-control-eHvm-h[data-hovered],
64
+ .panneau-control-eHvm-h:hover {
65
+ border-color: var(--panneau-color-text-muted);
66
+ }
67
+
68
+ .panneau-control-eHvm-h[data-focused],
69
+ .panneau-control-eHvm-h[data-focus-within],
70
+ .panneau-control-eHvm-h[data-focus-visible],
71
+ .panneau-control-eHvm-h:focus-within {
72
+ border-color: var(--panneau-color-focus);
73
+ outline: none;
74
+ box-shadow: 0 0 0 1px var(--panneau-color-focus);
75
+ }
76
+
77
+ .panneau-control-eHvm-h[data-invalid] {
78
+ border-color: var(--panneau-color-danger);
79
+ }
80
+
81
+ .panneau-control-eHvm-h[data-invalid][data-focused],
82
+ .panneau-control-eHvm-h[data-invalid][data-focus-within],
83
+ .panneau-control-eHvm-h[data-invalid]:focus-within {
84
+ box-shadow: 0 0 0 1px var(--panneau-color-danger);
85
+ }
86
+
87
+ .panneau-control-eHvm-h[data-disabled] {
88
+ cursor: not-allowed;
89
+ opacity: 0.6;
90
+ background-color: var(--panneau-color-surface-sunken);
91
+ }
92
+
93
+ .panneau-control-eHvm-h[data-readonly],
94
+ .panneau-control-eHvm-h[readonly] {
95
+ background-color: var(--panneau-color-surface-sunken);
96
+ }
97
+
98
+ /* An input inside a control (with adornments, segments or buttons): the control draws the box. */
99
+ .panneau-bare-V21ZoZ {
100
+ flex: 1 1 auto;
101
+ min-width: 0;
102
+ height: 100%;
103
+ min-height: calc(var(--panneau-control-height) - 2 * var(--panneau-border-width));
104
+ padding: 0;
105
+ font: inherit;
106
+ color: inherit;
107
+ background: transparent;
108
+ border: 0;
109
+ outline: none;
110
+ }
111
+
112
+ .panneau-bare-V21ZoZ::placeholder {
113
+ color: var(--panneau-color-text-muted);
114
+ opacity: 1;
115
+ }
116
+
117
+ .panneau-adornment-A3klaS {
118
+ display: inline-flex;
119
+ flex: 0 0 auto;
120
+ align-items: center;
121
+ gap: var(--panneau-space-1);
122
+ color: var(--panneau-color-text-muted);
123
+ white-space: nowrap;
124
+ }
125
+
126
+ .panneau-adornment-A3klaS:first-child {
127
+ margin-inline-end: var(--panneau-space-2);
128
+ }
129
+
130
+ .panneau-adornment-A3klaS:last-child {
131
+ margin-inline-start: var(--panneau-space-2);
132
+ }
133
+
134
+ .panneau-fieldset-g-kI7H {
135
+ display: flex;
136
+ flex-direction: column;
137
+ gap: var(--panneau-space-2);
138
+ min-width: 0;
139
+ }
140
+
141
+ .panneau-legend-vlWMl- {
142
+ display: block;
143
+ width: 100%;
144
+ margin-bottom: var(--panneau-space-1);
145
+ }
@@ -0,0 +1,30 @@
1
+ import "./Field.css";
2
+ //#region src/field/Field.module.css
3
+ var field = "panneau-field-llXva6";
4
+ var label = "panneau-label-Q70cID";
5
+ var required = "panneau-required-qGQQMa";
6
+ var description = "panneau-description-6IPisp";
7
+ var errors = "panneau-errors-YFI9As";
8
+ var error = "panneau-error-UWz-28";
9
+ var control = "panneau-control-eHvm-h";
10
+ var bare = "panneau-bare-V21ZoZ";
11
+ var adornment = "panneau-adornment-A3klaS";
12
+ var fieldset = "panneau-fieldset-g-kI7H";
13
+ var legend = "panneau-legend-vlWMl-";
14
+ var Field_module_default = {
15
+ field,
16
+ label,
17
+ required,
18
+ description,
19
+ errors,
20
+ error,
21
+ control,
22
+ bare,
23
+ adornment,
24
+ fieldset,
25
+ legend
26
+ };
27
+ //#endregion
28
+ export { adornment, bare, control, Field_module_default as default, description, error, errors, field, fieldset, label, legend, required };
29
+
30
+ //# sourceMappingURL=Field.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Field.module.js","names":[],"sources":["../../src/field/Field.module.css"],"sourcesContent":["/* Shared look of labelled controls: label, description, errors and the control itself. */\n\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-1);\n min-width: 0;\n}\n\n.label {\n font-size: var(--panneau-font-size-md);\n font-weight: var(--panneau-font-weight-medium);\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text);\n overflow-wrap: anywhere;\n}\n\n.required {\n margin-inline-start: 0.2em;\n color: var(--panneau-color-danger);\n}\n\n.description {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.errors {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-1);\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-danger);\n}\n\n.error {\n display: block;\n}\n\n.control {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n min-height: var(--panneau-control-height);\n padding: 0 var(--panneau-space-3);\n font-size: var(--panneau-font-size-control);\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-surface);\n border: var(--panneau-border-width) solid var(--panneau-color-border-control);\n border-radius: var(--panneau-radius-md);\n transition:\n border-color var(--panneau-duration),\n box-shadow var(--panneau-duration);\n}\n\n.control::placeholder {\n color: var(--panneau-color-text-muted);\n opacity: 1;\n}\n\n.control[data-hovered],\n.control:hover {\n border-color: var(--panneau-color-text-muted);\n}\n\n.control[data-focused],\n.control[data-focus-within],\n.control[data-focus-visible],\n.control:focus-within {\n border-color: var(--panneau-color-focus);\n outline: none;\n box-shadow: 0 0 0 1px var(--panneau-color-focus);\n}\n\n.control[data-invalid] {\n border-color: var(--panneau-color-danger);\n}\n\n.control[data-invalid][data-focused],\n.control[data-invalid][data-focus-within],\n.control[data-invalid]:focus-within {\n box-shadow: 0 0 0 1px var(--panneau-color-danger);\n}\n\n.control[data-disabled] {\n cursor: not-allowed;\n opacity: 0.6;\n background-color: var(--panneau-color-surface-sunken);\n}\n\n.control[data-readonly],\n.control[readonly] {\n background-color: var(--panneau-color-surface-sunken);\n}\n\n/* An input inside a control (with adornments, segments or buttons): the control draws the box. */\n.bare {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n min-height: calc(var(--panneau-control-height) - 2 * var(--panneau-border-width));\n padding: 0;\n font: inherit;\n color: inherit;\n background: transparent;\n border: 0;\n outline: none;\n}\n\n.bare::placeholder {\n color: var(--panneau-color-text-muted);\n opacity: 1;\n}\n\n.adornment {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n gap: var(--panneau-space-1);\n color: var(--panneau-color-text-muted);\n white-space: nowrap;\n}\n\n.adornment:first-child {\n margin-inline-end: var(--panneau-space-2);\n}\n\n.adornment:last-child {\n margin-inline-start: var(--panneau-space-2);\n}\n\n.fieldset {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n min-width: 0;\n}\n\n.legend {\n display: block;\n width: 100%;\n margin-bottom: var(--panneau-space-1);\n}\n"],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { type ReactNode } from 'react';
2
+ import styles from './Field.module.css';
3
+ /** Props that every labelled control of `@panneau/ui` accepts. */
4
+ export interface FieldChromeProps {
5
+ /** Visible label. Without one, pass `aria-label`. */
6
+ label?: ReactNode;
7
+ /** Help text under the control. */
8
+ description?: ReactNode;
9
+ /** Error messages. Any message makes the control invalid. */
10
+ errors?: readonly string[];
11
+ /** Class name of the outer element. */
12
+ className?: string;
13
+ labelClassName?: string;
14
+ descriptionClassName?: string;
15
+ errorsClassName?: string;
16
+ }
17
+ export declare function FieldLabel({ children, isRequired, className, }: {
18
+ children?: ReactNode;
19
+ isRequired?: boolean;
20
+ className?: string | undefined;
21
+ }): import("react").JSX.Element | null;
22
+ export declare function FieldDescription({ children, className, }: {
23
+ children?: ReactNode;
24
+ className?: string | undefined;
25
+ }): import("react").JSX.Element | null;
26
+ /** Error messages of a React Aria field. They show when the field is invalid. */
27
+ export declare function FieldErrors({ errors, className, }: {
28
+ errors?: readonly string[] | undefined;
29
+ className?: string | undefined;
30
+ }): import("react").JSX.Element | null;
31
+ export { styles as fieldStyles };
32
+ //# sourceMappingURL=FieldParts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldParts.d.ts","sourceRoot":"","sources":["../../src/field/FieldParts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIjD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC7B,qDAAqD;IACrD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,mCAAmC;IACnC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,UAAU,CAAC,EACvB,QAAQ,EACR,UAAkB,EAClB,SAAS,GACZ,EAAE;IACC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,sCAcA;AAED,wBAAgB,gBAAgB,CAAC,EAC7B,QAAQ,EACR,SAAS,GACZ,EAAE;IACC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,sCASA;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,EACxB,MAAW,EACX,SAAS,GACZ,EAAE;IACC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,sCAeA;AAED,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import Field_module_default from "./Field.module.js";
3
+ import { FieldError, Label, Text } from "react-aria-components";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Fragment as Fragment$1 } from "react";
6
+ import { c } from "react/compiler-runtime";
7
+ //#region src/field/FieldParts.tsx
8
+ function FieldLabel({ children, isRequired = false, className }) {
9
+ if (children === void 0 || children === null) return null;
10
+ return /* @__PURE__ */ jsxs(Label, {
11
+ className: cx(Field_module_default.label, className),
12
+ children: [children, isRequired ? /* @__PURE__ */ jsx("span", {
13
+ className: Field_module_default.required,
14
+ "aria-hidden": "true",
15
+ children: "*"
16
+ }) : null]
17
+ });
18
+ }
19
+ function FieldDescription(t0) {
20
+ const $ = c(5);
21
+ const { children, className } = t0;
22
+ if (children === void 0 || children === null) return null;
23
+ let t1;
24
+ if ($[0] !== className) {
25
+ t1 = cx(Field_module_default.description, className);
26
+ $[0] = className;
27
+ $[1] = t1;
28
+ } else t1 = $[1];
29
+ let t2;
30
+ if ($[2] !== children || $[3] !== t1) {
31
+ t2 = /* @__PURE__ */ jsx(Text, {
32
+ slot: "description",
33
+ className: t1,
34
+ children
35
+ });
36
+ $[2] = children;
37
+ $[3] = t1;
38
+ $[4] = t2;
39
+ } else t2 = $[4];
40
+ return t2;
41
+ }
42
+ /** Error messages of a React Aria field. They show when the field is invalid. */
43
+ function FieldErrors({ errors = [], className }) {
44
+ if (errors.length === 0) return null;
45
+ return /* @__PURE__ */ jsx(FieldError, {
46
+ className: cx(Field_module_default.errors, className),
47
+ children: errors.map((error, index) => /* @__PURE__ */ jsxs(Fragment$1, { children: [index > 0 ? " " : null, /* @__PURE__ */ jsx("span", {
48
+ className: Field_module_default.error,
49
+ children: error
50
+ })] }, index))
51
+ });
52
+ }
53
+ //#endregion
54
+ export { FieldDescription, FieldErrors, FieldLabel, Field_module_default as fieldStyles };
55
+
56
+ //# sourceMappingURL=FieldParts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldParts.js","names":["children","styles","_c","Fragment"],"sources":["../../src/field/FieldParts.tsx"],"sourcesContent":["import { Fragment, type ReactNode } from 'react';\nimport { FieldError, Label, Text } from 'react-aria-components';\n\nimport { cx } from '../utils/cx';\nimport styles from './Field.module.css';\n\n/** Props that every labelled control of `@panneau/ui` accepts. */\nexport interface FieldChromeProps {\n /** Visible label. Without one, pass `aria-label`. */\n label?: ReactNode;\n /** Help text under the control. */\n description?: ReactNode;\n /** Error messages. Any message makes the control invalid. */\n errors?: readonly string[];\n /** Class name of the outer element. */\n className?: string;\n labelClassName?: string;\n descriptionClassName?: string;\n errorsClassName?: string;\n}\n\nexport function FieldLabel({\n children,\n isRequired = false,\n className,\n}: {\n children?: ReactNode;\n isRequired?: boolean;\n className?: string | undefined;\n}) {\n if (children === undefined || children === null) {\n return null;\n }\n return (\n <Label className={cx(styles.label, className)}>\n {children}\n {isRequired ? (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </Label>\n );\n}\n\nexport function FieldDescription({\n children,\n className,\n}: {\n children?: ReactNode;\n className?: string | undefined;\n}) {\n if (children === undefined || children === null) {\n return null;\n }\n return (\n <Text slot=\"description\" className={cx(styles.description, className)}>\n {children}\n </Text>\n );\n}\n\n/** Error messages of a React Aria field. They show when the field is invalid. */\nexport function FieldErrors({\n errors = [],\n className,\n}: {\n errors?: readonly string[] | undefined;\n className?: string | undefined;\n}) {\n if (errors.length === 0) {\n return null;\n }\n return (\n <FieldError className={cx(styles.errors, className)}>\n {errors.map((error, index) => (\n <Fragment key={index}>\n {/* A space between messages, for assistive technologies. */}\n {index > 0 ? ' ' : null}\n <span className={styles.error}>{error}</span>\n </Fragment>\n ))}\n </FieldError>\n );\n}\n\nexport { styles as fieldStyles };\n"],"mappings":";;;;;;;AAqBA,SAAgB,WAAW,EACvB,UACA,aAAa,OACb,aAKD;CACC,IAAI,aAAa,KAAA,KAAa,aAAa,MACvC,OAAO;CAEX,OACI,qBAAC,OAAD;EAAO,WAAW,GAAGC,qBAAO,OAAO,SAAS;EAA5C,UAAA,CACK,UACA,aACG,oBAAC,QAAD;GAAM,WAAWA,qBAAO;GAAU,eAAY;GAAM,UAAA;EAE9C,CAAA,IACN,IACD;;AAEf;AAEA,SAAO,iBAAA,IAAA;CAAA,MAAA,IAAAC,EAAA,CAAA;CAA0B,MAAA,EAAA,UAAA,cAAA;CAO7B,IAAI,aAAa,KAAA,KAAa,aAAa,MAAI,OACpC;CACV,IAAA;CAAA,IAAA,EAAA,OAAA,WAAA;EAEuC,KAAA,GAAGD,qBAAM,aAAc,SAAS;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,YAAA,EAAA,OAAA,IAAA;EAArE,KAAA,oBAAC,MAAD;GAAW,MAAA;GAAyB,WAAA;GAC/B;EADA,CAAA;EAEE,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAFP;AAEO;;AAKf,SAAgB,YAAY,EACxB,SAAS,CAAA,GACT,aAID;CACC,IAAI,OAAO,WAAW,GAClB,OAAO;CAEX,OACI,oBAAC,YAAD;EAAY,WAAW,GAAGA,qBAAO,QAAQ,SAAS;EAC7C,UAAA,OAAO,KAAK,OAAO,UAChB,qBAACE,YAAD,EAAA,UAAA,CAEK,QAAQ,IAAI,MAAM,MACnB,oBAAC,QAAD;GAAM,WAAWF,qBAAO;GAAQ,UAAA;EAAY,CAAA,CACtC,EAAA,GAJK,KAIL,CACb;CACO,CAAA;AAEpB"}
@@ -0,0 +1,22 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface FieldsetProps {
3
+ /** Title of the group of controls. */
4
+ legend?: ReactNode;
5
+ description?: ReactNode;
6
+ /** Errors of the group as a whole. */
7
+ errors?: readonly string[];
8
+ isRequired?: boolean;
9
+ isDisabled?: boolean;
10
+ children?: ReactNode;
11
+ className?: string;
12
+ legendClassName?: string;
13
+ descriptionClassName?: string;
14
+ errorsClassName?: string;
15
+ }
16
+ /**
17
+ * Groups related controls under a legend, with a description and errors: for composite values
18
+ * (a group of fields, a list of blocks, a value per locale). The description and the errors
19
+ * describe the group for assistive technologies.
20
+ */
21
+ export declare function Fieldset({ legend, description, errors, isRequired, isDisabled, children, className, legendClassName, descriptionClassName, errorsClassName, }: FieldsetProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=Fieldset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fieldset.d.ts","sourceRoot":"","sources":["../../src/field/Fieldset.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AAKxD,MAAM,WAAW,aAAa;IAC1B,sCAAsC;IACtC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,sCAAsC;IACtC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EACrB,MAAM,EACN,WAAW,EACX,MAAW,EACX,UAAkB,EAClB,UAAkB,EAClB,QAAQ,EACR,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,eAAe,GAClB,EAAE,aAAa,+BAyCf"}
@@ -0,0 +1,50 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import Field_module_default from "./Field.module.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Fragment as Fragment$1, useId } from "react";
5
+ //#region src/field/Fieldset.tsx
6
+ /**
7
+ * Groups related controls under a legend, with a description and errors: for composite values
8
+ * (a group of fields, a list of blocks, a value per locale). The description and the errors
9
+ * describe the group for assistive technologies.
10
+ */
11
+ function Fieldset({ legend, description, errors = [], isRequired = false, isDisabled = false, children, className, legendClassName, descriptionClassName, errorsClassName }) {
12
+ const id = useId();
13
+ const descriptionId = description !== void 0 ? `${id}-description` : null;
14
+ const errorsId = errors.length > 0 ? `${id}-errors` : null;
15
+ const describedBy = [descriptionId, errorsId].filter(Boolean).join(" ");
16
+ return /* @__PURE__ */ jsxs("fieldset", {
17
+ className: cx(Field_module_default.fieldset, className),
18
+ "aria-describedby": describedBy !== "" ? describedBy : void 0,
19
+ "aria-invalid": errors.length > 0 ? true : void 0,
20
+ disabled: isDisabled,
21
+ children: [
22
+ legend !== void 0 && legend !== null ? /* @__PURE__ */ jsxs("legend", {
23
+ className: cx(Field_module_default.legend, Field_module_default.label, legendClassName),
24
+ children: [legend, isRequired ? /* @__PURE__ */ jsx("span", {
25
+ className: Field_module_default.required,
26
+ "aria-hidden": "true",
27
+ children: "*"
28
+ }) : null]
29
+ }) : null,
30
+ descriptionId !== null ? /* @__PURE__ */ jsx("div", {
31
+ id: descriptionId,
32
+ className: cx(Field_module_default.description, descriptionClassName),
33
+ children: description
34
+ }) : null,
35
+ children,
36
+ errorsId !== null ? /* @__PURE__ */ jsx("div", {
37
+ id: errorsId,
38
+ className: cx(Field_module_default.errors, errorsClassName),
39
+ children: errors.map((error, index) => /* @__PURE__ */ jsxs(Fragment$1, { children: [index > 0 ? " " : null, /* @__PURE__ */ jsx("span", {
40
+ className: Field_module_default.error,
41
+ children: error
42
+ })] }, index))
43
+ }) : null
44
+ ]
45
+ });
46
+ }
47
+ //#endregion
48
+ export { Fieldset };
49
+
50
+ //# sourceMappingURL=Fieldset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fieldset.js","names":["styles","Fragment"],"sources":["../../src/field/Fieldset.tsx"],"sourcesContent":["import { Fragment, type ReactNode, useId } from 'react';\n\nimport { cx } from '../utils/cx';\nimport styles from './Field.module.css';\n\nexport interface FieldsetProps {\n /** Title of the group of controls. */\n legend?: ReactNode;\n description?: ReactNode;\n /** Errors of the group as a whole. */\n errors?: readonly string[];\n isRequired?: boolean;\n isDisabled?: boolean;\n children?: ReactNode;\n className?: string;\n legendClassName?: string;\n descriptionClassName?: string;\n errorsClassName?: string;\n}\n\n/**\n * Groups related controls under a legend, with a description and errors: for composite values\n * (a group of fields, a list of blocks, a value per locale). The description and the errors\n * describe the group for assistive technologies.\n */\nexport function Fieldset({\n legend,\n description,\n errors = [],\n isRequired = false,\n isDisabled = false,\n children,\n className,\n legendClassName,\n descriptionClassName,\n errorsClassName,\n}: FieldsetProps) {\n const id = useId();\n const descriptionId = description !== undefined ? `${id}-description` : null;\n const errorsId = errors.length > 0 ? `${id}-errors` : null;\n const describedBy = [descriptionId, errorsId].filter(Boolean).join(' ');\n return (\n <fieldset\n className={cx(styles.fieldset, className)}\n aria-describedby={describedBy !== '' ? describedBy : undefined}\n aria-invalid={errors.length > 0 ? true : undefined}\n disabled={isDisabled}\n >\n {legend !== undefined && legend !== null ? (\n <legend className={cx(styles.legend, styles.label, legendClassName)}>\n {legend}\n {isRequired ? (\n <span className={styles.required} aria-hidden=\"true\">\n *\n </span>\n ) : null}\n </legend>\n ) : null}\n {descriptionId !== null ? (\n <div id={descriptionId} className={cx(styles.description, descriptionClassName)}>\n {description}\n </div>\n ) : null}\n {children}\n {errorsId !== null ? (\n <div id={errorsId} className={cx(styles.errors, errorsClassName)}>\n {errors.map((error, index) => (\n <Fragment key={index}>\n {/* A space between messages, for assistive technologies. */}\n {index > 0 ? ' ' : null}\n <span className={styles.error}>{error}</span>\n </Fragment>\n ))}\n </div>\n ) : null}\n </fieldset>\n );\n}\n"],"mappings":";;;;;;;;;;AAyBA,SAAgB,SAAS,EACrB,QACA,aACA,SAAS,CAAA,GACT,aAAa,OACb,aAAa,OACb,UACA,WACA,iBACA,sBACA,mBACc;CACd,MAAM,KAAK,MAAM;CACjB,MAAM,gBAAgB,gBAAgB,KAAA,IAAY,GAAG,GAAE,gBAAiB;CACxE,MAAM,WAAW,OAAO,SAAS,IAAI,GAAG,GAAE,WAAY;CACtD,MAAM,cAAc,CAAC,eAAe,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CACtE,OACI,qBAAC,YAAD;EACI,WAAW,GAAGA,qBAAO,UAAU,SAAS;EACxC,oBAAkB,gBAAgB,KAAK,cAAc,KAAA;EACrD,gBAAc,OAAO,SAAS,IAAI,OAAO,KAAA;EACzC,UAAU;EAJd,UAAA;GAMK,WAAW,KAAA,KAAa,WAAW,OAChC,qBAAC,UAAD;IAAQ,WAAW,GAAGA,qBAAO,QAAQA,qBAAO,OAAO,eAAe;IAAlE,UAAA,CACK,QACA,aACG,oBAAC,QAAD;KAAM,WAAWA,qBAAO;KAAU,eAAY;KAAM,UAAA;IAE9C,CAAA,IACN,IACA;GACR,CAAA,IAAA;GACH,kBAAkB,OACf,oBAAC,OAAD;IAAK,IAAI;IAAe,WAAW,GAAGA,qBAAO,aAAa,oBAAoB;IACzE,UAAA;GACA,CAAA,IACL;GACH;GACA,aAAa,OACV,oBAAC,OAAD;IAAK,IAAI;IAAU,WAAW,GAAGA,qBAAO,QAAQ,eAAe;IAC1D,UAAA,OAAO,KAAK,OAAO,UAChB,qBAACC,YAAD,EAAA,UAAA,CAEK,QAAQ,IAAI,MAAM,MACnB,oBAAC,QAAD;KAAM,WAAWD,qBAAO;KAAQ,UAAA;IAAY,CAAA,CACtC,EAAA,GAJK,KAIL,CACb;GACA,CAAA,IACL;EACE;;AAElB"}
@@ -0,0 +1,5 @@
1
+ .panneau-icon-Y4DzXz {
2
+ display: inline-block;
3
+ flex: 0 0 auto;
4
+ vertical-align: middle;
5
+ }
@@ -0,0 +1,31 @@
1
+ import type { ComponentType } from 'react';
2
+ /**
3
+ * An icon component: any Lucide icon (`import { Pencil } from 'lucide-react'`), or a component
4
+ * with the same props.
5
+ */
6
+ export type IconComponent = ComponentType<{
7
+ size?: number | string;
8
+ strokeWidth?: number | string;
9
+ absoluteStrokeWidth?: boolean;
10
+ className?: string;
11
+ 'aria-hidden'?: boolean | 'true' | 'false';
12
+ 'aria-label'?: string;
13
+ role?: string;
14
+ focusable?: boolean | 'true' | 'false';
15
+ }>;
16
+ export type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
17
+ export interface IconProps {
18
+ /** The icon: a Lucide icon component. */
19
+ icon: IconComponent;
20
+ /** Defaults to `md` (16px). A number is in pixels. */
21
+ size?: IconSize | number;
22
+ /**
23
+ * Accessible label. Icons without a label are decorative and hidden from assistive
24
+ * technologies, which is right next to a text that says the same.
25
+ */
26
+ label?: string;
27
+ className?: string;
28
+ }
29
+ /** Renders an icon of the icon set (Lucide) at a size of the scale, decorative by default. */
30
+ export declare function Icon({ icon: Component, size, label, className }: IconProps): import("react").JSX.Element;
31
+ //# sourceMappingURL=Icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.d.ts","sourceRoot":"","sources":["../../src/icon/Icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAIxD,MAAM,WAAW,SAAS;IACtB,yCAAyC;IACzC,IAAI,EAAE,aAAa,CAAC;IACpB,sDAAsD;IACtD,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,8FAA8F;AAC9F,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAW,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,+BAcjF"}
@@ -0,0 +1,29 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import Icon_module_default from "./Icon.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/icon/Icon.tsx
5
+ var SIZES = {
6
+ xs: 12,
7
+ sm: 14,
8
+ md: 16,
9
+ lg: 20,
10
+ xl: 24
11
+ };
12
+ /** Renders an icon of the icon set (Lucide) at a size of the scale, decorative by default. */
13
+ function Icon({ icon: Component, size = "md", label, className }) {
14
+ const pixels = typeof size === "number" ? size : SIZES[size];
15
+ return /* @__PURE__ */ jsx(Component, {
16
+ size: pixels,
17
+ strokeWidth: 2,
18
+ absoluteStrokeWidth: pixels < 16,
19
+ className: cx(Icon_module_default.icon, className),
20
+ "aria-hidden": label === void 0 ? "true" : void 0,
21
+ "aria-label": label,
22
+ role: label !== void 0 ? "img" : void 0,
23
+ focusable: "false"
24
+ });
25
+ }
26
+ //#endregion
27
+ export { Icon };
28
+
29
+ //# sourceMappingURL=Icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.js","names":["styles"],"sources":["../../src/icon/Icon.tsx"],"sourcesContent":["import type { ComponentType } from 'react';\n\nimport { cx } from '../utils/cx';\nimport styles from './Icon.module.css';\n\n/**\n * An icon component: any Lucide icon (`import { Pencil } from 'lucide-react'`), or a component\n * with the same props.\n */\nexport type IconComponent = ComponentType<{\n size?: number | string;\n strokeWidth?: number | string;\n absoluteStrokeWidth?: boolean;\n className?: string;\n 'aria-hidden'?: boolean | 'true' | 'false';\n 'aria-label'?: string;\n role?: string;\n focusable?: boolean | 'true' | 'false';\n}>;\n\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nconst SIZES: Record<IconSize, number> = { xs: 12, sm: 14, md: 16, lg: 20, xl: 24 };\n\nexport interface IconProps {\n /** The icon: a Lucide icon component. */\n icon: IconComponent;\n /** Defaults to `md` (16px). A number is in pixels. */\n size?: IconSize | number;\n /**\n * Accessible label. Icons without a label are decorative and hidden from assistive\n * technologies, which is right next to a text that says the same.\n */\n label?: string;\n className?: string;\n}\n\n/** Renders an icon of the icon set (Lucide) at a size of the scale, decorative by default. */\nexport function Icon({ icon: Component, size = 'md', label, className }: IconProps) {\n const pixels = typeof size === 'number' ? size : SIZES[size];\n return (\n <Component\n size={pixels}\n strokeWidth={2}\n absoluteStrokeWidth={pixels < 16}\n className={cx(styles.icon, className)}\n aria-hidden={label === undefined ? 'true' : undefined}\n aria-label={label}\n role={label !== undefined ? 'img' : undefined}\n focusable=\"false\"\n />\n );\n}\n"],"mappings":";;;;AAsBA,IAAM,QAAkC;CAAE,IAAI;CAAI,IAAI;CAAI,IAAI;CAAI,IAAI;CAAI,IAAI;AAAG;;AAgBjF,SAAgB,KAAK,EAAE,MAAM,WAAW,OAAO,MAAM,OAAO,aAAwB;CAChF,MAAM,SAAS,OAAO,SAAS,WAAW,OAAO,MAAM;CACvD,OACI,oBAAC,WAAD;EACI,MAAM;EACN,aAAa;EACb,qBAAqB,SAAS;EAC9B,WAAW,GAAGA,oBAAO,MAAM,SAAS;EACpC,eAAa,UAAU,KAAA,IAAY,SAAS,KAAA;EAC5C,cAAY;EACZ,MAAM,UAAU,KAAA,IAAY,QAAQ,KAAA;EACpC,WAAU;CAAO,CAAA;AAG7B"}
@@ -0,0 +1,8 @@
1
+ import "./Icon.css";
2
+ //#region src/icon/Icon.module.css
3
+ var icon = "panneau-icon-Y4DzXz";
4
+ var Icon_module_default = { icon };
5
+ //#endregion
6
+ export { Icon_module_default as default, icon };
7
+
8
+ //# sourceMappingURL=Icon.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.module.js","names":[],"sources":["../../src/icon/Icon.module.css"],"sourcesContent":[".icon {\n display: inline-block;\n flex: 0 0 auto;\n vertical-align: middle;\n}\n"],"mappings":""}
@@ -0,0 +1,9 @@
1
+ /* Doubled classes: more specific than the button's own padding, whatever the CSS order. */
2
+ .panneau-iconButton-eXWLoz.panneau-iconButton-eXWLoz {
3
+ width: var(--panneau-control-height);
4
+ padding: 0;
5
+ }
6
+
7
+ .panneau-iconButton-eXWLoz.panneau-sm-i6-bGf {
8
+ width: var(--panneau-control-height-sm);
9
+ }
@@ -0,0 +1,15 @@
1
+ import type { CSSProperties } from 'react';
2
+ import { type ButtonProps } from '../button/Button';
3
+ import type { IconComponent } from '../icon/Icon';
4
+ export interface IconButtonProps extends Omit<ButtonProps, 'icon' | 'iconEnd' | 'children' | 'fullWidth' | 'aria-label'> {
5
+ icon: IconComponent;
6
+ /** Accessible label, also shown as a tooltip. */
7
+ label: string;
8
+ /** Shows the label in a tooltip on hover and focus. Defaults to true. */
9
+ showTooltip?: boolean;
10
+ className?: string;
11
+ style?: CSSProperties;
12
+ }
13
+ /** A square button with only an icon. Its label is announced and shown as a tooltip. */
14
+ export declare function IconButton({ icon, label, variant, size, showTooltip, className, ...props }: IconButtonProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=IconButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.d.ts","sourceRoot":"","sources":["../../src/icon-button/IconButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,MAAM,WAAW,eAAgB,SAAQ,IAAI,CACzC,WAAW,EACX,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,CAC/D;IACG,IAAI,EAAE,aAAa,CAAC;IACpB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,OAAiB,EACjB,IAAW,EACX,WAAkB,EAClB,SAAS,EACT,GAAG,KAAK,EACX,EAAE,eAAe,+BAejB"}
@@ -0,0 +1,26 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import { Button } from "../button/Button.js";
3
+ import { Tooltip } from "../tooltip/Tooltip.js";
4
+ import IconButton_module_default from "./IconButton.module.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/icon-button/IconButton.tsx
7
+ /** A square button with only an icon. Its label is announced and shown as a tooltip. */
8
+ function IconButton({ icon, label, variant = "ghost", size = "md", showTooltip = true, className, ...props }) {
9
+ const button = /* @__PURE__ */ jsx(Button, {
10
+ ...props,
11
+ variant,
12
+ size,
13
+ icon,
14
+ "aria-label": label,
15
+ className: cx(IconButton_module_default.iconButton, size === "sm" && IconButton_module_default.sm, className)
16
+ });
17
+ if (!showTooltip) return button;
18
+ return /* @__PURE__ */ jsx(Tooltip, {
19
+ content: label,
20
+ children: button
21
+ });
22
+ }
23
+ //#endregion
24
+ export { IconButton };
25
+
26
+ //# sourceMappingURL=IconButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.js","names":["styles"],"sources":["../../src/icon-button/IconButton.tsx"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nimport { Button, type ButtonProps } from '../button/Button';\nimport type { IconComponent } from '../icon/Icon';\nimport { Tooltip } from '../tooltip/Tooltip';\nimport { cx } from '../utils/cx';\nimport styles from './IconButton.module.css';\n\nexport interface IconButtonProps extends Omit<\n ButtonProps,\n 'icon' | 'iconEnd' | 'children' | 'fullWidth' | 'aria-label'\n> {\n icon: IconComponent;\n /** Accessible label, also shown as a tooltip. */\n label: string;\n /** Shows the label in a tooltip on hover and focus. Defaults to true. */\n showTooltip?: boolean;\n className?: string;\n style?: CSSProperties;\n}\n\n/** A square button with only an icon. Its label is announced and shown as a tooltip. */\nexport function IconButton({\n icon,\n label,\n variant = 'ghost',\n size = 'md',\n showTooltip = true,\n className,\n ...props\n}: IconButtonProps) {\n const button = (\n <Button\n {...props}\n variant={variant}\n size={size}\n icon={icon}\n aria-label={label}\n className={cx(styles.iconButton, size === 'sm' && styles.sm, className)}\n />\n );\n if (!showTooltip) {\n return button;\n }\n return <Tooltip content={label}>{button}</Tooltip>;\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,WAAW,EACvB,MACA,OACA,UAAU,SACV,OAAO,MACP,cAAc,MACd,WACA,GAAG,SACa;CAChB,MAAM,SACF,oBAAC,QAAD;EACI,GAAI;EACK;EACH;EACA;EACN,cAAY;EACZ,WAAW,GAAGA,0BAAO,YAAY,SAAS,QAAQA,0BAAO,IAAI,SAAS;CAAE,CAAA;CAGhF,IAAI,CAAC,aACD,OAAO;CAEX,OAAO,oBAAC,SAAD;EAAS,SAAS;EAAQ,UAAA;CAAgB,CAAA;AACrD"}
@@ -0,0 +1,12 @@
1
+ import "./IconButton.css";
2
+ //#region src/icon-button/IconButton.module.css
3
+ var iconButton = "panneau-iconButton-eXWLoz";
4
+ var sm = "panneau-sm-i6-bGf";
5
+ var IconButton_module_default = {
6
+ iconButton,
7
+ sm
8
+ };
9
+ //#endregion
10
+ export { IconButton_module_default as default, iconButton, sm };
11
+
12
+ //# sourceMappingURL=IconButton.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconButton.module.js","names":[],"sources":["../../src/icon-button/IconButton.module.css"],"sourcesContent":["/* Doubled classes: more specific than the button's own padding, whatever the CSS order. */\n.iconButton.iconButton {\n width: var(--panneau-control-height);\n padding: 0;\n}\n\n.iconButton.sm {\n width: var(--panneau-control-height-sm);\n}\n"],"mappings":""}