@panneau/ui 0.0.0-stage → 5.0.0-alpha.1

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 (213) hide show
  1. package/README.md +74 -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/namedIcons.d.ts +16 -0
  88. package/dist/icon/namedIcons.d.ts.map +1 -0
  89. package/dist/icon/namedIcons.js +90 -0
  90. package/dist/icon/namedIcons.js.map +1 -0
  91. package/dist/icon-button/IconButton.css +9 -0
  92. package/dist/icon-button/IconButton.d.ts +15 -0
  93. package/dist/icon-button/IconButton.d.ts.map +1 -0
  94. package/dist/icon-button/IconButton.js +26 -0
  95. package/dist/icon-button/IconButton.js.map +1 -0
  96. package/dist/icon-button/IconButton.module.js +12 -0
  97. package/dist/icon-button/IconButton.module.js.map +1 -0
  98. package/dist/index.d.ts +33 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +30 -0
  101. package/dist/intl/messages.d.ts +2 -0
  102. package/dist/intl/messages.d.ts.map +1 -0
  103. package/dist/intl/messages.js +1 -0
  104. package/dist/intl/usePanneauIntl.d.ts +7 -0
  105. package/dist/intl/usePanneauIntl.d.ts.map +1 -0
  106. package/dist/intl/usePanneauIntl.js +22 -0
  107. package/dist/intl/usePanneauIntl.js.map +1 -0
  108. package/dist/locales/index.d.ts +15 -0
  109. package/dist/locales/index.d.ts.map +1 -0
  110. package/dist/locales/index.js +21 -0
  111. package/dist/locales/index.js.map +1 -0
  112. package/dist/menu/Menu.d.ts +27 -0
  113. package/dist/menu/Menu.d.ts.map +1 -0
  114. package/dist/menu/Menu.js +57 -0
  115. package/dist/menu/Menu.js.map +1 -0
  116. package/dist/number-input/NumberInput.css +57 -0
  117. package/dist/number-input/NumberInput.d.ts +21 -0
  118. package/dist/number-input/NumberInput.d.ts.map +1 -0
  119. package/dist/number-input/NumberInput.js +82 -0
  120. package/dist/number-input/NumberInput.js.map +1 -0
  121. package/dist/number-input/NumberInput.module.js +16 -0
  122. package/dist/number-input/NumberInput.module.js.map +1 -0
  123. package/dist/popover/Popover.css +32 -0
  124. package/dist/popover/Popover.d.ts +18 -0
  125. package/dist/popover/Popover.d.ts.map +1 -0
  126. package/dist/popover/Popover.js +41 -0
  127. package/dist/popover/Popover.js.map +1 -0
  128. package/dist/popover/Popover.module.js +14 -0
  129. package/dist/popover/Popover.module.js.map +1 -0
  130. package/dist/radio-group/RadioGroup.css +83 -0
  131. package/dist/radio-group/RadioGroup.d.ts +12 -0
  132. package/dist/radio-group/RadioGroup.d.ts.map +1 -0
  133. package/dist/radio-group/RadioGroup.js +61 -0
  134. package/dist/radio-group/RadioGroup.js.map +1 -0
  135. package/dist/radio-group/RadioGroup.module.js +20 -0
  136. package/dist/radio-group/RadioGroup.module.js.map +1 -0
  137. package/dist/root/PanneauRoot.css +251 -0
  138. package/dist/root/PanneauRoot.d.ts +34 -0
  139. package/dist/root/PanneauRoot.d.ts.map +1 -0
  140. package/dist/root/PanneauRoot.js +84 -0
  141. package/dist/root/PanneauRoot.js.map +1 -0
  142. package/dist/root/PanneauRoot.module.js +12 -0
  143. package/dist/root/PanneauRoot.module.js.map +1 -0
  144. package/dist/select/ListBox.css +104 -0
  145. package/dist/select/ListBox.module.js +32 -0
  146. package/dist/select/ListBox.module.js.map +1 -0
  147. package/dist/select/Select.d.ts +45 -0
  148. package/dist/select/Select.d.ts.map +1 -0
  149. package/dist/select/Select.js +136 -0
  150. package/dist/select/Select.js.map +1 -0
  151. package/dist/spinner/Spinner.css +40 -0
  152. package/dist/spinner/Spinner.d.ts +11 -0
  153. package/dist/spinner/Spinner.d.ts.map +1 -0
  154. package/dist/spinner/Spinner.js +25 -0
  155. package/dist/spinner/Spinner.js.map +1 -0
  156. package/dist/spinner/Spinner.module.js +18 -0
  157. package/dist/spinner/Spinner.module.js.map +1 -0
  158. package/dist/switch/Switch.css +69 -0
  159. package/dist/switch/Switch.d.ts +11 -0
  160. package/dist/switch/Switch.d.ts.map +1 -0
  161. package/dist/switch/Switch.js +33 -0
  162. package/dist/switch/Switch.js.map +1 -0
  163. package/dist/switch/Switch.module.js +15 -0
  164. package/dist/switch/Switch.module.js.map +1 -0
  165. package/dist/tabs/Tabs.css +83 -0
  166. package/dist/tabs/Tabs.d.ts +27 -0
  167. package/dist/tabs/Tabs.d.ts.map +1 -0
  168. package/dist/tabs/Tabs.js +141 -0
  169. package/dist/tabs/Tabs.js.map +1 -0
  170. package/dist/tabs/Tabs.module.js +16 -0
  171. package/dist/tabs/Tabs.module.js.map +1 -0
  172. package/dist/text-area/TextArea.css +8 -0
  173. package/dist/text-area/TextArea.d.ts +11 -0
  174. package/dist/text-area/TextArea.d.ts.map +1 -0
  175. package/dist/text-area/TextArea.js +41 -0
  176. package/dist/text-area/TextArea.js.map +1 -0
  177. package/dist/text-area/TextArea.module.js +8 -0
  178. package/dist/text-area/TextArea.module.js.map +1 -0
  179. package/dist/text-input/TextInput.d.ts +17 -0
  180. package/dist/text-input/TextInput.d.ts.map +1 -0
  181. package/dist/text-input/TextInput.js +61 -0
  182. package/dist/text-input/TextInput.js.map +1 -0
  183. package/dist/theme/bootstrap.d.ts +8 -0
  184. package/dist/theme/bootstrap.d.ts.map +1 -0
  185. package/dist/theme/bootstrap.js +61 -0
  186. package/dist/theme/bootstrap.js.map +1 -0
  187. package/dist/theme/theme.d.ts +23 -0
  188. package/dist/theme/theme.d.ts.map +1 -0
  189. package/dist/theme/theme.js +30 -0
  190. package/dist/theme/theme.js.map +1 -0
  191. package/dist/time-input/TimeInput.d.ts +8 -0
  192. package/dist/time-input/TimeInput.d.ts.map +1 -0
  193. package/dist/time-input/TimeInput.js +45 -0
  194. package/dist/time-input/TimeInput.js.map +1 -0
  195. package/dist/toast/Toast.css +109 -0
  196. package/dist/toast/Toast.d.ts +39 -0
  197. package/dist/toast/Toast.d.ts.map +1 -0
  198. package/dist/toast/Toast.js +152 -0
  199. package/dist/toast/Toast.js.map +1 -0
  200. package/dist/toast/Toast.module.js +30 -0
  201. package/dist/toast/Toast.module.js.map +1 -0
  202. package/dist/tooltip/Tooltip.css +25 -0
  203. package/dist/tooltip/Tooltip.d.ts +19 -0
  204. package/dist/tooltip/Tooltip.d.ts.map +1 -0
  205. package/dist/tooltip/Tooltip.js +29 -0
  206. package/dist/tooltip/Tooltip.js.map +1 -0
  207. package/dist/tooltip/Tooltip.module.js +12 -0
  208. package/dist/tooltip/Tooltip.module.js.map +1 -0
  209. package/dist/utils/cx.d.ts +3 -0
  210. package/dist/utils/cx.d.ts.map +1 -0
  211. package/dist/utils/cx.js +9 -0
  212. package/dist/utils/cx.js.map +1 -0
  213. package/package.json +48 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberInput.js","names":["fieldStyles","styles"],"sources":["../../src/number-input/NumberInput.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport {\n type NumberFieldProps as AriaNumberFieldProps,\n Button,\n Group,\n Input,\n NumberField,\n} from 'react-aria-components';\n\nimport {\n type FieldChromeProps,\n FieldDescription,\n FieldErrors,\n FieldLabel,\n fieldStyles,\n} from '../field/FieldParts';\nimport { Icon } from '../icon/Icon';\nimport { cx } from '../utils/cx';\nimport styles from './NumberInput.module.css';\n\nexport interface NumberInputProps\n extends\n Omit<\n AriaNumberFieldProps,\n | 'className'\n | 'style'\n | 'children'\n | 'isInvalid'\n | 'validate'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n >,\n FieldChromeProps {\n /** The number, or `null` when empty. */\n value?: number | null;\n defaultValue?: number | null;\n /** Called with the number, or `null` when the input is cleared. */\n onChange?: (value: number | null) => void;\n placeholder?: string;\n /** Content after the number, inside the control: a unit. */\n suffix?: ReactNode;\n controlClassName?: string;\n inputClassName?: string;\n}\n\nfunction toAria(value: number | null | undefined): number | undefined {\n return value === null ? Number.NaN : value;\n}\n\n/**\n * A number input, formatted for the locale, with steppers and arrow keys. An empty input is\n * `null`, not `NaN`.\n */\nexport function NumberInput({\n label,\n description,\n errors = [],\n value,\n defaultValue,\n onChange,\n placeholder,\n suffix,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n inputClassName,\n isRequired,\n isReadOnly,\n ...props\n}: NumberInputProps) {\n const invalid = errors.length > 0;\n return (\n <NumberField\n {...props}\n value={toAria(value)}\n defaultValue={toAria(defaultValue)}\n onChange={(next) => onChange?.(Number.isNaN(next) ? null : next)}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isInvalid={invalid}\n validationBehavior=\"aria\"\n className={cx(fieldStyles.field, className)}\n >\n <FieldLabel isRequired={isRequired} className={labelClassName}>\n {label}\n </FieldLabel>\n <Group\n className={cx(fieldStyles.control, styles.control, controlClassName)}\n data-invalid={invalid || undefined}\n data-readonly={isReadOnly || undefined}\n >\n <Input\n placeholder={placeholder}\n className={cx(fieldStyles.bare, styles.input, inputClassName)}\n />\n {suffix !== undefined ? (\n <span className={fieldStyles.adornment}>{suffix}</span>\n ) : null}\n {isReadOnly !== true ? (\n <span className={styles.steppers}>\n <Button slot=\"increment\" className={styles.stepper}>\n <Icon icon={ChevronUp} size=\"xs\" />\n </Button>\n <Button slot=\"decrement\" className={styles.stepper}>\n <Icon icon={ChevronDown} size=\"xs\" />\n </Button>\n </span>\n ) : null}\n </Group>\n <FieldDescription className={descriptionClassName}>{description}</FieldDescription>\n <FieldErrors errors={errors} className={errorsClassName} />\n </NumberField>\n );\n}\n"],"mappings":";;;;;;;;;AA+CA,SAAS,OAAO,OAAsD;CAClE,OAAO,UAAU,OAAO,MAAa;AACzC;;;;;AAMA,SAAgB,YAAY,EACxB,OACA,aACA,SAAS,CAAA,GACT,OACA,cACA,UACA,aACA,QACA,WACA,gBACA,sBACA,iBACA,kBACA,gBACA,YACA,YACA,GAAG,SACc;CACjB,MAAM,UAAU,OAAO,SAAS;CAChC,OACI,qBAAC,aAAD;EACI,GAAI;EACJ,OAAO,OAAO,KAAK;EACnB,cAAc,OAAO,YAAY;EACjC,WAAW,SAAS,WAAW,OAAO,MAAM,IAAI,IAAI,OAAO,IAAI;EACnD;EACA;EACZ,WAAW;EACX,oBAAmB;EACnB,WAAW,GAAGA,qBAAY,OAAO,SAAS;EAT9C,UAAA;GAWI,oBAAC,YAAD;IAAwB;IAAY,WAAW;IAC1C,UAAA;GACO,CAAA;GACZ,qBAAC,OAAD;IACI,WAAW,GAAGA,qBAAY,SAASC,2BAAO,SAAS,gBAAgB;IACnE,gBAAc,WAAW,KAAA;IACzB,iBAAe,cAAc,KAAA;IAHjC,UAAA;KAKI,oBAAC,OAAD;MACiB;MACb,WAAW,GAAGD,qBAAY,MAAMC,2BAAO,OAAO,cAAc;KAAE,CAAA;KAEjE,WAAW,KAAA,IACR,oBAAC,QAAD;MAAM,WAAWD,qBAAY;MAAY,UAAA;KAAa,CAAA,IACtD;KACH,eAAe,OACZ,qBAAC,QAAD;MAAM,WAAWC,2BAAO;MAAxB,UAAA,CACI,oBAAC,QAAD;OAAQ,MAAK;OAAY,WAAWA,2BAAO;OACvC,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAW,MAAK;OAAI,CAAA;MAC5B,CAAA,GACR,oBAAC,QAAD;OAAQ,MAAK;OAAY,WAAWA,2BAAO;OACvC,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAa,MAAK;OAAI,CAAA;MAC9B,CAAA,CACN;KACN,CAAA,IAAA;IACD;;GACP,oBAAC,kBAAD;IAAkB,WAAW;IAAuB,UAAA;GAA8B,CAAA;GAClF,oBAAC,aAAD;IAAqB;IAAQ,WAAW;GAAgB,CAAA;EAC/C;;AAErB"}
@@ -0,0 +1,16 @@
1
+ import "./NumberInput.css";
2
+ //#region src/number-input/NumberInput.module.css
3
+ var control = "panneau-control-4aptNi";
4
+ var input = "panneau-input-qqs-MV";
5
+ var steppers = "panneau-steppers-JoTs6w";
6
+ var stepper = "panneau-stepper-sAGR2f";
7
+ var NumberInput_module_default = {
8
+ control,
9
+ input,
10
+ steppers,
11
+ stepper
12
+ };
13
+ //#endregion
14
+ export { control, NumberInput_module_default as default, input, stepper, steppers };
15
+
16
+ //# sourceMappingURL=NumberInput.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberInput.module.js","names":[],"sources":["../../src/number-input/NumberInput.module.css"],"sourcesContent":[".control.control {\n padding-inline-end: 0;\n overflow: hidden;\n}\n\n.input {\n font-variant-numeric: tabular-nums;\n}\n\n.steppers {\n display: flex;\n flex-direction: column;\n align-self: stretch;\n border-inline-start: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.stepper {\n display: flex;\n flex: 1 1 0;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n padding: 0;\n color: var(--panneau-color-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.stepper + .stepper {\n border-top: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.stepper[data-hovered] {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-hover);\n}\n\n.stepper[data-pressed] {\n background-color: var(--panneau-color-pressed);\n}\n\n.stepper[data-disabled] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Touch screens have their own keyboard for numbers: the steppers would be too small. */\n@media (pointer: coarse) {\n .steppers {\n display: none;\n }\n\n .control.control {\n padding-inline-end: var(--panneau-space-3);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,32 @@
1
+ .panneau-popover-KacUIM {
2
+ min-width: var(--trigger-width, 10rem);
3
+ max-width: calc(100vw - 2 * var(--panneau-space-4));
4
+ color: var(--panneau-color-text);
5
+ background-color: var(--panneau-color-surface-raised);
6
+ border: var(--panneau-border-width) solid var(--panneau-color-border);
7
+ border-radius: var(--panneau-radius-lg);
8
+ box-shadow: var(--panneau-shadow-lg);
9
+ outline: none;
10
+ overflow: auto;
11
+ z-index: var(--panneau-z-overlay);
12
+ }
13
+
14
+ .panneau-popover-KacUIM[data-entering] {
15
+ animation: panneau-pop-fB47s- var(--panneau-duration) ease-out;
16
+ }
17
+
18
+ .panneau-popover-KacUIM[data-exiting] {
19
+ animation: panneau-pop-fB47s- var(--panneau-duration) ease-in reverse;
20
+ }
21
+
22
+ .panneau-dialog-2cVt0D {
23
+ padding: var(--panneau-space-3);
24
+ outline: none;
25
+ }
26
+
27
+ @keyframes panneau-pop-fB47s- {
28
+ from {
29
+ opacity: 0;
30
+ transform: scale(0.97);
31
+ }
32
+ }
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type PopoverProps as AriaPopoverProps } from 'react-aria-components';
3
+ export interface PopoverProps extends Omit<AriaPopoverProps, 'className' | 'style' | 'children' | 'UNSTABLE_portalContainer'> {
4
+ children?: ReactNode;
5
+ /** Accessible label of the popover's dialog, when it has no heading. */
6
+ 'aria-label'?: string;
7
+ className?: string;
8
+ dialogClassName?: string;
9
+ }
10
+ /**
11
+ * A popover with free content, inside a `PopoverTrigger` with its button as the first child. Its
12
+ * content is a non-modal dialog: focus moves into it and comes back to the button when it closes.
13
+ */
14
+ export declare function Popover({ children, 'aria-label': ariaLabel, className, dialogClassName, offset, ...props }: PopoverProps): import("react").JSX.Element | null;
15
+ /** The popover surface without a dialog, for listboxes and menus. */
16
+ export declare function PopoverSurface({ children, className, offset, ...props }: Omit<PopoverProps, 'aria-label' | 'dialogClassName'>): import("react").JSX.Element | null;
17
+ export { DialogTrigger as PopoverTrigger } from 'react-aria-components';
18
+ //# sourceMappingURL=Popover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/popover/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAEH,KAAK,YAAY,IAAI,gBAAgB,EAExC,MAAM,uBAAuB,CAAC;AAM/B,MAAM,WAAW,YAAa,SAAQ,IAAI,CACtC,gBAAgB,EAChB,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,0BAA0B,CAClE;IACG,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EACpB,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,SAAS,EACT,eAAe,EACf,MAAU,EACV,GAAG,KAAK,EACX,EAAE,YAAY,sCAiBd;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,MAAU,EACV,GAAG,KAAK,EACX,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,iBAAiB,CAAC,sCAetD;AAED,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import { usePortalContainer } from "../root/PanneauRoot.js";
3
+ import Popover_module_default from "./Popover.module.js";
4
+ import { Dialog, DialogTrigger as PopoverTrigger, Popover } from "react-aria-components";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/popover/Popover.tsx
7
+ /**
8
+ * A popover with free content, inside a `PopoverTrigger` with its button as the first child. Its
9
+ * content is a non-modal dialog: focus moves into it and comes back to the button when it closes.
10
+ */
11
+ function Popover$1({ children, "aria-label": ariaLabel, className, dialogClassName, offset = 6, ...props }) {
12
+ const container = usePortalContainer();
13
+ if (container === null) return null;
14
+ return /* @__PURE__ */ jsx(Popover, {
15
+ ...props,
16
+ offset,
17
+ className: cx(Popover_module_default.popover, className),
18
+ UNSTABLE_portalContainer: container,
19
+ children: /* @__PURE__ */ jsx(Dialog, {
20
+ "aria-label": ariaLabel,
21
+ className: cx(Popover_module_default.dialog, dialogClassName),
22
+ children
23
+ })
24
+ });
25
+ }
26
+ /** The popover surface without a dialog, for listboxes and menus. */
27
+ function PopoverSurface({ children, className, offset = 6, ...props }) {
28
+ const container = usePortalContainer();
29
+ if (container === null) return null;
30
+ return /* @__PURE__ */ jsx(Popover, {
31
+ ...props,
32
+ offset,
33
+ className: cx(Popover_module_default.popover, className),
34
+ UNSTABLE_portalContainer: container,
35
+ children
36
+ });
37
+ }
38
+ //#endregion
39
+ export { Popover$1 as Popover, PopoverSurface, PopoverTrigger };
40
+
41
+ //# sourceMappingURL=Popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.js","names":["Popover","AriaPopover","styles"],"sources":["../../src/popover/Popover.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport {\n Popover as AriaPopover,\n type PopoverProps as AriaPopoverProps,\n Dialog,\n} from 'react-aria-components';\n\nimport { usePortalContainer } from '../root/PanneauRoot';\nimport { cx } from '../utils/cx';\nimport styles from './Popover.module.css';\n\nexport interface PopoverProps extends Omit<\n AriaPopoverProps,\n 'className' | 'style' | 'children' | 'UNSTABLE_portalContainer'\n> {\n children?: ReactNode;\n /** Accessible label of the popover's dialog, when it has no heading. */\n 'aria-label'?: string;\n className?: string;\n dialogClassName?: string;\n}\n\n/**\n * A popover with free content, inside a `PopoverTrigger` with its button as the first child. Its\n * content is a non-modal dialog: focus moves into it and comes back to the button when it closes.\n */\nexport function Popover({\n children,\n 'aria-label': ariaLabel,\n className,\n dialogClassName,\n offset = 6,\n ...props\n}: PopoverProps) {\n const container = usePortalContainer();\n if (container === null) {\n return null;\n }\n return (\n <AriaPopover\n {...props}\n offset={offset}\n className={cx(styles.popover, className)}\n UNSTABLE_portalContainer={container}\n >\n <Dialog aria-label={ariaLabel} className={cx(styles.dialog, dialogClassName)}>\n {children}\n </Dialog>\n </AriaPopover>\n );\n}\n\n/** The popover surface without a dialog, for listboxes and menus. */\nexport function PopoverSurface({\n children,\n className,\n offset = 6,\n ...props\n}: Omit<PopoverProps, 'aria-label' | 'dialogClassName'>) {\n const container = usePortalContainer();\n if (container === null) {\n return null;\n }\n return (\n <AriaPopover\n {...props}\n offset={offset}\n className={cx(styles.popover, className)}\n UNSTABLE_portalContainer={container}\n >\n {children}\n </AriaPopover>\n );\n}\n\nexport { DialogTrigger as PopoverTrigger } from 'react-aria-components';\n"],"mappings":";;;;;;;;;;AA0BA,SAAgBA,UAAQ,EACpB,UACA,cAAc,WACd,WACA,iBACA,SAAS,GACT,GAAG,SACU;CACb,MAAM,YAAY,mBAAmB;CACrC,IAAI,cAAc,MACd,OAAO;CAEX,OACI,oBAACC,SAAD;EACI,GAAI;EACI;EACR,WAAW,GAAGC,uBAAO,SAAS,SAAS;EACvC,0BAA0B;EAE1B,UAAA,oBAAC,QAAD;GAAQ,cAAY;GAAW,WAAW,GAAGA,uBAAO,QAAQ,eAAe;GACtE;EACG,CAAA;CACC,CAAA;AAErB;;AAGA,SAAgB,eAAe,EAC3B,UACA,WACA,SAAS,GACT,GAAG,SACkD;CACrD,MAAM,YAAY,mBAAmB;CACrC,IAAI,cAAc,MACd,OAAO;CAEX,OACI,oBAACD,SAAD;EACI,GAAI;EACI;EACR,WAAW,GAAGC,uBAAO,SAAS,SAAS;EACvC,0BAA0B;EAEzB;CACQ,CAAA;AAErB"}
@@ -0,0 +1,14 @@
1
+ import "./Popover.css";
2
+ //#region src/popover/Popover.module.css
3
+ var popover = "panneau-popover-KacUIM";
4
+ var pop = "panneau-pop-fB47s-";
5
+ var dialog = "panneau-dialog-2cVt0D";
6
+ var Popover_module_default = {
7
+ popover,
8
+ pop,
9
+ dialog
10
+ };
11
+ //#endregion
12
+ export { Popover_module_default as default, dialog, pop, popover };
13
+
14
+ //# sourceMappingURL=Popover.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Popover.module.js","names":[],"sources":["../../src/popover/Popover.module.css"],"sourcesContent":[".popover {\n min-width: var(--trigger-width, 10rem);\n max-width: calc(100vw - 2 * var(--panneau-space-4));\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-surface-raised);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-lg);\n box-shadow: var(--panneau-shadow-lg);\n outline: none;\n overflow: auto;\n z-index: var(--panneau-z-overlay);\n}\n\n.popover[data-entering] {\n animation: pop var(--panneau-duration) ease-out;\n}\n\n.popover[data-exiting] {\n animation: pop var(--panneau-duration) ease-in reverse;\n}\n\n.dialog {\n padding: var(--panneau-space-3);\n outline: none;\n}\n\n@keyframes pop {\n from {\n opacity: 0;\n transform: scale(0.97);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,83 @@
1
+ .panneau-options-QPuFOV {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--panneau-space-1);
5
+ }
6
+
7
+ .panneau-horizontal-KgXsCy .panneau-options-QPuFOV {
8
+ flex-flow: row wrap;
9
+ gap: var(--panneau-space-1) var(--panneau-space-4);
10
+ }
11
+
12
+ .panneau-radio-zz4Tx- {
13
+ display: inline-flex;
14
+ align-items: flex-start;
15
+ gap: var(--panneau-space-2);
16
+ min-height: 1.5rem;
17
+ font-size: var(--panneau-font-size-md);
18
+ color: var(--panneau-color-text);
19
+ cursor: pointer;
20
+ -webkit-tap-highlight-color: transparent;
21
+ }
22
+
23
+ .panneau-radio-zz4Tx-[data-disabled] {
24
+ cursor: not-allowed;
25
+ opacity: 0.55;
26
+ }
27
+
28
+ .panneau-radio-zz4Tx-[data-readonly] {
29
+ cursor: default;
30
+ }
31
+
32
+ .panneau-circle-IySLxv {
33
+ flex: 0 0 auto;
34
+ width: 1.125rem;
35
+ height: 1.125rem;
36
+ margin-top: 0.125rem;
37
+ background-color: var(--panneau-color-surface);
38
+ border: var(--panneau-border-width) solid var(--panneau-color-border-control);
39
+ border-radius: var(--panneau-radius-full);
40
+ transition:
41
+ border-color var(--panneau-duration),
42
+ border-width var(--panneau-duration);
43
+ }
44
+
45
+ .panneau-radio-zz4Tx-[data-hovered] .panneau-circle-IySLxv {
46
+ border-color: var(--panneau-color-text-muted);
47
+ }
48
+
49
+ .panneau-radio-zz4Tx-[data-selected] .panneau-circle-IySLxv {
50
+ border-color: var(--panneau-color-accent);
51
+ border-width: 0.3125rem;
52
+ }
53
+
54
+ .panneau-radio-zz4Tx-[data-invalid] .panneau-circle-IySLxv {
55
+ border-color: var(--panneau-color-danger);
56
+ }
57
+
58
+ .panneau-radio-zz4Tx-[data-focus-visible] .panneau-circle-IySLxv {
59
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
60
+ outline-offset: 2px;
61
+ }
62
+
63
+ .panneau-text-W98R9k {
64
+ display: flex;
65
+ flex-direction: column;
66
+ min-width: 0;
67
+ }
68
+
69
+ .panneau-description-SPgnUk {
70
+ font-size: var(--panneau-font-size-sm);
71
+ color: var(--panneau-color-text-muted);
72
+ }
73
+
74
+ @media (pointer: coarse) {
75
+ .panneau-radio-zz4Tx- {
76
+ min-height: 2.75rem;
77
+ align-items: center;
78
+ }
79
+
80
+ .panneau-circle-IySLxv {
81
+ margin-top: 0;
82
+ }
83
+ }
@@ -0,0 +1,12 @@
1
+ import { type RadioGroupProps as AriaRadioGroupProps } from 'react-aria-components';
2
+ import { type FieldChromeProps } from '../field/FieldParts';
3
+ import type { OptionValue, SelectOption } from '../select/Select';
4
+ export interface RadioGroupProps extends Omit<AriaRadioGroupProps, 'className' | 'style' | 'children' | 'isInvalid' | 'validate' | 'value' | 'defaultValue' | 'onChange'>, FieldChromeProps {
5
+ options: readonly SelectOption[];
6
+ value?: OptionValue | null;
7
+ onChange?: (value: OptionValue) => void;
8
+ radioClassName?: string;
9
+ }
10
+ /** A set of options where one can be picked, all visible at once. */
11
+ export declare function RadioGroup({ options, value, onChange, label, description, errors, orientation, isRequired, className, labelClassName, descriptionClassName, errorsClassName, radioClassName, ...props }: RadioGroupProps): import("react").JSX.Element;
12
+ //# sourceMappingURL=RadioGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.d.ts","sourceRoot":"","sources":["../../src/radio-group/RadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,eAAe,IAAI,mBAAmB,EAE9C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIlE,MAAM,WAAW,eACb,SACI,IAAI,CACA,mBAAmB,EACjB,WAAW,GACX,OAAO,GACP,UAAU,GACV,WAAW,GACX,UAAU,GACV,OAAO,GACP,cAAc,GACd,UAAU,CACf,EACD,gBAAgB;IACpB,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,EACvB,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAAW,EACX,MAAW,EACX,WAAwB,EACxB,UAAU,EACV,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,GAAG,KAAK,EACX,EAAE,eAAe,+BA+CjB"}
@@ -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 RadioGroup_module_default from "./RadioGroup.module.js";
5
+ import { Radio, RadioGroup } from "react-aria-components";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/radio-group/RadioGroup.tsx
8
+ /** A set of options where one can be picked, all visible at once. */
9
+ function RadioGroup$1({ options, value, onChange, label, description, errors = [], orientation = "vertical", isRequired, className, labelClassName, descriptionClassName, errorsClassName, radioClassName, ...props }) {
10
+ const index = value === void 0 ? void 0 : options.findIndex((o) => o.value === value);
11
+ return /* @__PURE__ */ jsxs(RadioGroup, {
12
+ ...props,
13
+ orientation,
14
+ isRequired,
15
+ value: index === void 0 ? void 0 : index === -1 ? null : String(index),
16
+ onChange: (key) => {
17
+ const option = options[Number(key)];
18
+ if (option !== void 0) onChange?.(option.value);
19
+ },
20
+ isInvalid: errors.length > 0,
21
+ validationBehavior: "aria",
22
+ className: cx(Field_module_default.field, orientation === "horizontal" && RadioGroup_module_default.horizontal, className),
23
+ children: [
24
+ /* @__PURE__ */ jsx(FieldLabel, {
25
+ isRequired,
26
+ className: labelClassName,
27
+ children: label
28
+ }),
29
+ /* @__PURE__ */ jsx("div", {
30
+ className: RadioGroup_module_default.options,
31
+ children: options.map((option_0, position) => /* @__PURE__ */ jsxs(Radio, {
32
+ value: String(position),
33
+ isDisabled: option_0.disabled,
34
+ className: cx(RadioGroup_module_default.radio, radioClassName),
35
+ children: [/* @__PURE__ */ jsx("span", {
36
+ className: RadioGroup_module_default.circle,
37
+ "aria-hidden": "true"
38
+ }), /* @__PURE__ */ jsxs("span", {
39
+ className: RadioGroup_module_default.text,
40
+ children: [/* @__PURE__ */ jsx("span", { children: option_0.label }), option_0.description !== void 0 ? /* @__PURE__ */ jsx("span", {
41
+ className: RadioGroup_module_default.description,
42
+ children: option_0.description
43
+ }) : null]
44
+ })]
45
+ }, position))
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 { RadioGroup$1 as RadioGroup };
60
+
61
+ //# sourceMappingURL=RadioGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.js","names":["option","RadioGroup","AriaRadioGroup","fieldStyles","styles"],"sources":["../../src/radio-group/RadioGroup.tsx"],"sourcesContent":["import {\n RadioGroup as AriaRadioGroup,\n type RadioGroupProps as AriaRadioGroupProps,\n Radio,\n} from 'react-aria-components';\n\nimport {\n type FieldChromeProps,\n FieldDescription,\n FieldErrors,\n FieldLabel,\n fieldStyles,\n} from '../field/FieldParts';\nimport type { OptionValue, SelectOption } from '../select/Select';\nimport { cx } from '../utils/cx';\nimport styles from './RadioGroup.module.css';\n\nexport interface RadioGroupProps\n extends\n Omit<\n AriaRadioGroupProps,\n | 'className'\n | 'style'\n | 'children'\n | 'isInvalid'\n | 'validate'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n >,\n FieldChromeProps {\n options: readonly SelectOption[];\n value?: OptionValue | null;\n onChange?: (value: OptionValue) => void;\n radioClassName?: string;\n}\n\n/** A set of options where one can be picked, all visible at once. */\nexport function RadioGroup({\n options,\n value,\n onChange,\n label,\n description,\n errors = [],\n orientation = 'vertical',\n isRequired,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n radioClassName,\n ...props\n}: RadioGroupProps) {\n const index = value === undefined ? undefined : options.findIndex((o) => o.value === value);\n return (\n <AriaRadioGroup\n {...props}\n orientation={orientation}\n isRequired={isRequired}\n value={index === undefined ? undefined : index === -1 ? null : String(index)}\n onChange={(key) => {\n const option = options[Number(key)];\n if (option !== undefined) {\n onChange?.(option.value);\n }\n }}\n isInvalid={errors.length > 0}\n validationBehavior=\"aria\"\n className={cx(\n fieldStyles.field,\n orientation === 'horizontal' && styles.horizontal,\n className,\n )}\n >\n <FieldLabel isRequired={isRequired} className={labelClassName}>\n {label}\n </FieldLabel>\n <div className={styles.options}>\n {options.map((option, position) => (\n <Radio\n key={position}\n value={String(position)}\n isDisabled={option.disabled}\n className={cx(styles.radio, radioClassName)}\n >\n <span className={styles.circle} aria-hidden=\"true\" />\n <span className={styles.text}>\n <span>{option.label}</span>\n {option.description !== undefined ? (\n <span className={styles.description}>{option.description}</span>\n ) : null}\n </span>\n </Radio>\n ))}\n </div>\n <FieldDescription className={descriptionClassName}>{description}</FieldDescription>\n <FieldErrors errors={errors} className={errorsClassName} />\n </AriaRadioGroup>\n );\n}\n"],"mappings":";;;;;;;;AAsCA,SAAgBC,aAAW,EACvB,SACA,OACA,UACA,OACA,aACA,SAAS,CAAA,GACT,cAAc,YACd,YACA,WACA,gBACA,sBACA,iBACA,gBACA,GAAG,SACa;CAChB,MAAM,QAAQ,UAAU,KAAA,IAAY,KAAA,IAAY,QAAQ,WAAW,MAAM,EAAE,UAAU,KAAK;CAC1F,OACI,qBAACC,YAAD;EACI,GAAI;EACS;EACD;EACZ,OAAO,UAAU,KAAA,IAAY,KAAA,IAAY,UAAU,KAAK,OAAO,OAAO,KAAK;EAC3E,WAAW,QAAQ;GACf,MAAM,SAAS,QAAQ,OAAO,GAAG;GACjC,IAAI,WAAW,KAAA,GACX,WAAW,OAAO,KAAK;EAE/B;EACA,WAAW,OAAO,SAAS;EAC3B,oBAAmB;EACnB,WAAW,GACPC,qBAAY,OACZ,gBAAgB,gBAAgBC,0BAAO,YACvC,SACJ;EAjBJ,UAAA;GAmBI,oBAAC,YAAD;IAAwB;IAAY,WAAW;IAC1C,UAAA;GACO,CAAA;GACZ,oBAAC,OAAD;IAAK,WAAWA,0BAAO;IAClB,UAAA,QAAQ,KAAKJ,UAAQ,aAClB,qBAAC,OAAD;KAEI,OAAO,OAAO,QAAQ;KACtB,YAAYA,SAAO;KACnB,WAAW,GAAGI,0BAAO,OAAO,cAAc;KAJ9C,UAAA,CAMI,oBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAQ,eAAY;KAAM,CAAA,GAClD,qBAAC,QAAD;MAAM,WAAWA,0BAAO;MAAxB,UAAA,CACI,oBAAC,QAAD,EAAA,UAAOJ,SAAO,MAAY,CAAA,GACzBA,SAAO,gBAAgB,KAAA,IACpB,oBAAC,QAAD;OAAM,WAAWI,0BAAO;OAAcJ,UAAAA,SAAO;MAAkB,CAAA,IAC/D,IACF;KACH,CAAA,CAAA;IAZE,GAAA,QAYF,CACV;GACA,CAAA;GACL,oBAAC,kBAAD;IAAkB,WAAW;IAAuB,UAAA;GAA8B,CAAA;GAClF,oBAAC,aAAD;IAAqB;IAAQ,WAAW;GAAgB,CAAA;EAC5C;;AAExB"}
@@ -0,0 +1,20 @@
1
+ import "./RadioGroup.css";
2
+ //#region src/radio-group/RadioGroup.module.css
3
+ var options = "panneau-options-QPuFOV";
4
+ var horizontal = "panneau-horizontal-KgXsCy";
5
+ var radio = "panneau-radio-zz4Tx-";
6
+ var circle = "panneau-circle-IySLxv";
7
+ var text = "panneau-text-W98R9k";
8
+ var description = "panneau-description-SPgnUk";
9
+ var RadioGroup_module_default = {
10
+ options,
11
+ horizontal,
12
+ radio,
13
+ circle,
14
+ text,
15
+ description
16
+ };
17
+ //#endregion
18
+ export { circle, RadioGroup_module_default as default, description, horizontal, options, radio, text };
19
+
20
+ //# sourceMappingURL=RadioGroup.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup.module.js","names":[],"sources":["../../src/radio-group/RadioGroup.module.css"],"sourcesContent":[".options {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-1);\n}\n\n.horizontal .options {\n flex-flow: row wrap;\n gap: var(--panneau-space-1) var(--panneau-space-4);\n}\n\n.radio {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--panneau-space-2);\n min-height: 1.5rem;\n font-size: var(--panneau-font-size-md);\n color: var(--panneau-color-text);\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n}\n\n.radio[data-disabled] {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.radio[data-readonly] {\n cursor: default;\n}\n\n.circle {\n flex: 0 0 auto;\n width: 1.125rem;\n height: 1.125rem;\n margin-top: 0.125rem;\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-full);\n transition:\n border-color var(--panneau-duration),\n border-width var(--panneau-duration);\n}\n\n.radio[data-hovered] .circle {\n border-color: var(--panneau-color-text-muted);\n}\n\n.radio[data-selected] .circle {\n border-color: var(--panneau-color-accent);\n border-width: 0.3125rem;\n}\n\n.radio[data-invalid] .circle {\n border-color: var(--panneau-color-danger);\n}\n\n.radio[data-focus-visible] .circle {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.text {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.description {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n@media (pointer: coarse) {\n .radio {\n min-height: 2.75rem;\n align-items: center;\n }\n\n .circle {\n margin-top: 0;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,251 @@
1
+ /*
2
+ * Design tokens of the default theme, and the base stylesheet of Panneau. Everything is scoped to
3
+ * the root element: nothing here applies outside of it (decision 0005).
4
+ *
5
+ * Defaults are wrapped in :where() so that they have no specificity: a theme, or a project's own
6
+ * class on the root, overrides any token without fighting the cascade.
7
+ */
8
+
9
+ :where(.panneau-root--wA35w) {
10
+ /* Surfaces */
11
+ --panneau-color-bg: #ffffff;
12
+ --panneau-color-surface: #ffffff;
13
+ --panneau-color-surface-sunken: #f4f4f5;
14
+ --panneau-color-surface-raised: #ffffff;
15
+ --panneau-color-hover: rgb(24 24 27 / 0.06);
16
+ --panneau-color-pressed: rgb(24 24 27 / 0.1);
17
+ --panneau-color-backdrop: rgb(9 9 11 / 0.45);
18
+
19
+ /* Text */
20
+ --panneau-color-text: #18181b;
21
+ --panneau-color-text-muted: #52525b;
22
+ --panneau-color-link: #1d4ed8;
23
+
24
+ /* Borders: separators, and the outline of controls (3:1 against the surface) */
25
+ --panneau-color-border: #e4e4e7;
26
+ --panneau-color-border-control: #8b8b94;
27
+
28
+ /* Accent: primary buttons, checked controls, selection */
29
+ --panneau-color-accent: #18181b;
30
+ --panneau-color-accent-hover: #3f3f46;
31
+ --panneau-color-accent-text: #ffffff;
32
+ --panneau-color-accent-subtle: #f4f4f5;
33
+ --panneau-color-focus: #2563eb;
34
+
35
+ /* Tones: text on surfaces, subtle backgrounds, borders */
36
+ --panneau-color-danger: #b91c1c;
37
+ --panneau-color-danger-subtle: #fef2f2;
38
+ --panneau-color-danger-border: #fca5a5;
39
+ --panneau-color-danger-solid: #b91c1c;
40
+ --panneau-color-danger-solid-hover: #991b1b;
41
+ --panneau-color-danger-solid-text: #ffffff;
42
+ --panneau-color-success: #15803d;
43
+ --panneau-color-success-subtle: #f0fdf4;
44
+ --panneau-color-success-border: #86efac;
45
+ --panneau-color-warning: #a16207;
46
+ --panneau-color-warning-subtle: #fefce8;
47
+ --panneau-color-warning-border: #fcd34d;
48
+ --panneau-color-info: #1d4ed8;
49
+ --panneau-color-info-subtle: #eff6ff;
50
+ --panneau-color-info-border: #93c5fd;
51
+
52
+ /* Typography */
53
+ --panneau-font-family:
54
+ system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
55
+ --panneau-font-family-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
56
+ --panneau-font-size-xs: 0.75rem;
57
+ --panneau-font-size-sm: 0.8125rem;
58
+ --panneau-font-size-md: 0.875rem;
59
+ --panneau-font-size-lg: 1rem;
60
+ --panneau-font-size-xl: 1.25rem;
61
+ --panneau-font-size-control: 0.875rem;
62
+ --panneau-line-height: 1.5;
63
+ --panneau-line-height-tight: 1.25;
64
+ --panneau-font-weight-normal: 400;
65
+ --panneau-font-weight-medium: 500;
66
+ --panneau-font-weight-bold: 600;
67
+
68
+ /* Spacing, on a 4px scale */
69
+ --panneau-space-1: 0.25rem;
70
+ --panneau-space-2: 0.5rem;
71
+ --panneau-space-3: 0.75rem;
72
+ --panneau-space-4: 1rem;
73
+ --panneau-space-5: 1.25rem;
74
+ --panneau-space-6: 1.5rem;
75
+ --panneau-space-8: 2rem;
76
+ --panneau-space-10: 2.5rem;
77
+
78
+ /* Shapes */
79
+ --panneau-radius-sm: 0.25rem;
80
+ --panneau-radius-md: 0.375rem;
81
+ --panneau-radius-lg: 0.5rem;
82
+ --panneau-radius-full: 9999px;
83
+ --panneau-border-width: 1px;
84
+ --panneau-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.06);
85
+ --panneau-shadow-md: 0 1px 3px rgb(0 0 0 / 0.08), 0 4px 12px rgb(0 0 0 / 0.08);
86
+ --panneau-shadow-lg: 0 4px 8px rgb(0 0 0 / 0.08), 0 16px 40px rgb(0 0 0 / 0.16);
87
+
88
+ /* Controls */
89
+ --panneau-control-height: 2.25rem;
90
+ --panneau-control-height-sm: 1.875rem;
91
+ --panneau-focus-width: 2px;
92
+
93
+ /* Motion and layers */
94
+ --panneau-duration: 150ms;
95
+ --panneau-z-overlay: 1000;
96
+ --panneau-z-toast: 1100;
97
+
98
+ color-scheme: light;
99
+ }
100
+
101
+ :where(.panneau-root--wA35w[data-color-scheme='dark']) {
102
+ --panneau-color-bg: #09090b;
103
+ --panneau-color-surface: #18181b;
104
+ --panneau-color-surface-sunken: #111113;
105
+ --panneau-color-surface-raised: #232326;
106
+ --panneau-color-hover: rgb(255 255 255 / 0.07);
107
+ --panneau-color-pressed: rgb(255 255 255 / 0.12);
108
+ --panneau-color-backdrop: rgb(0 0 0 / 0.6);
109
+ --panneau-color-text: #fafafa;
110
+ --panneau-color-text-muted: #a1a1aa;
111
+ --panneau-color-link: #93c5fd;
112
+ --panneau-color-border: #2e2e33;
113
+ --panneau-color-border-control: #71717a;
114
+ --panneau-color-accent: #fafafa;
115
+ --panneau-color-accent-hover: #d4d4d8;
116
+ --panneau-color-accent-text: #18181b;
117
+ --panneau-color-accent-subtle: #2e2e33;
118
+ --panneau-color-focus: #60a5fa;
119
+ --panneau-color-danger: #fca5a5;
120
+ --panneau-color-danger-subtle: rgb(127 29 29 / 0.35);
121
+ --panneau-color-danger-border: #b91c1c;
122
+ --panneau-color-danger-solid: #dc2626;
123
+ --panneau-color-danger-solid-hover: #b91c1c;
124
+ --panneau-color-danger-solid-text: #ffffff;
125
+ --panneau-color-success: #86efac;
126
+ --panneau-color-success-subtle: rgb(20 83 45 / 0.35);
127
+ --panneau-color-success-border: #15803d;
128
+ --panneau-color-warning: #fcd34d;
129
+ --panneau-color-warning-subtle: rgb(113 63 18 / 0.35);
130
+ --panneau-color-warning-border: #a16207;
131
+ --panneau-color-info: #93c5fd;
132
+ --panneau-color-info-subtle: rgb(30 58 138 / 0.35);
133
+ --panneau-color-info-border: #1d4ed8;
134
+ --panneau-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
135
+ --panneau-shadow-md: 0 1px 3px rgb(0 0 0 / 0.4), 0 4px 12px rgb(0 0 0 / 0.4);
136
+ --panneau-shadow-lg: 0 4px 8px rgb(0 0 0 / 0.4), 0 16px 40px rgb(0 0 0 / 0.5);
137
+
138
+ color-scheme: dark;
139
+ }
140
+
141
+ @media (prefers-color-scheme: dark) {
142
+ :where(.panneau-root--wA35w[data-color-scheme='auto']) {
143
+ --panneau-color-bg: #09090b;
144
+ --panneau-color-surface: #18181b;
145
+ --panneau-color-surface-sunken: #111113;
146
+ --panneau-color-surface-raised: #232326;
147
+ --panneau-color-hover: rgb(255 255 255 / 0.07);
148
+ --panneau-color-pressed: rgb(255 255 255 / 0.12);
149
+ --panneau-color-backdrop: rgb(0 0 0 / 0.6);
150
+ --panneau-color-text: #fafafa;
151
+ --panneau-color-text-muted: #a1a1aa;
152
+ --panneau-color-link: #93c5fd;
153
+ --panneau-color-border: #2e2e33;
154
+ --panneau-color-border-control: #71717a;
155
+ --panneau-color-accent: #fafafa;
156
+ --panneau-color-accent-hover: #d4d4d8;
157
+ --panneau-color-accent-text: #18181b;
158
+ --panneau-color-accent-subtle: #2e2e33;
159
+ --panneau-color-focus: #60a5fa;
160
+ --panneau-color-danger: #fca5a5;
161
+ --panneau-color-danger-subtle: rgb(127 29 29 / 0.35);
162
+ --panneau-color-danger-border: #b91c1c;
163
+ --panneau-color-danger-solid: #dc2626;
164
+ --panneau-color-danger-solid-hover: #b91c1c;
165
+ --panneau-color-danger-solid-text: #ffffff;
166
+ --panneau-color-success: #86efac;
167
+ --panneau-color-success-subtle: rgb(20 83 45 / 0.35);
168
+ --panneau-color-success-border: #15803d;
169
+ --panneau-color-warning: #fcd34d;
170
+ --panneau-color-warning-subtle: rgb(113 63 18 / 0.35);
171
+ --panneau-color-warning-border: #a16207;
172
+ --panneau-color-info: #93c5fd;
173
+ --panneau-color-info-subtle: rgb(30 58 138 / 0.35);
174
+ --panneau-color-info-border: #1d4ed8;
175
+ --panneau-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
176
+ --panneau-shadow-md: 0 1px 3px rgb(0 0 0 / 0.4), 0 4px 12px rgb(0 0 0 / 0.4);
177
+ --panneau-shadow-lg: 0 4px 8px rgb(0 0 0 / 0.4), 0 16px 40px rgb(0 0 0 / 0.5);
178
+
179
+ color-scheme: dark;
180
+ }
181
+ }
182
+
183
+ /* Touch screens: larger targets, and 16px text in inputs so that iOS doesn't zoom on focus. */
184
+ @media (pointer: coarse) {
185
+ :where(.panneau-root--wA35w) {
186
+ --panneau-control-height: 2.75rem;
187
+ --panneau-control-height-sm: 2.25rem;
188
+ --panneau-font-size-control: 1rem;
189
+ }
190
+ }
191
+
192
+ @media (prefers-reduced-motion: reduce) {
193
+ :where(.panneau-root--wA35w) {
194
+ --panneau-duration: 0ms;
195
+ }
196
+ }
197
+
198
+ /* Base stylesheet, scoped to the root, without specificity: components and projects override it. */
199
+
200
+ .panneau-root--wA35w {
201
+ /* The class is mostly a hook for the rules below, which use :where(). */
202
+ display: block;
203
+ }
204
+
205
+ :where(.panneau-root--wA35w) {
206
+ font-family: var(--panneau-font-family);
207
+ font-size: var(--panneau-font-size-md);
208
+ line-height: var(--panneau-line-height);
209
+ color: var(--panneau-color-text);
210
+ background-color: var(--panneau-color-bg);
211
+ -webkit-font-smoothing: antialiased;
212
+ -webkit-text-size-adjust: 100%;
213
+ text-size-adjust: 100%;
214
+ }
215
+
216
+ :where(.panneau-root--wA35w) :where(*, *::before, *::after) {
217
+ box-sizing: border-box;
218
+ }
219
+
220
+ :where(.panneau-root--wA35w) :where(h1, h2, h3, h4, h5, h6, p, ul, ol, dl, figure, fieldset, legend) {
221
+ margin: 0;
222
+ padding: 0;
223
+ }
224
+
225
+ :where(.panneau-root--wA35w) :where(fieldset) {
226
+ border: 0;
227
+ min-width: 0;
228
+ }
229
+
230
+ :where(.panneau-root--wA35w) :where(button, input, select, textarea) {
231
+ font: inherit;
232
+ color: inherit;
233
+ }
234
+
235
+ :where(.panneau-root--wA35w) :where(a) {
236
+ color: var(--panneau-color-link);
237
+ }
238
+
239
+ :where(.panneau-root--wA35w) :where(img, svg, video) {
240
+ max-width: 100%;
241
+ }
242
+
243
+ :where(.panneau-root--wA35w) :where(:focus-visible) {
244
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
245
+ outline-offset: 2px;
246
+ }
247
+
248
+ /* Overlays (dialogs, popovers, menus, tooltips) render here, so that they get the tokens. */
249
+ .panneau-portal-keLcJN {
250
+ display: contents;
251
+ }
@@ -0,0 +1,34 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import { type ColorScheme, type Theme } from '../theme/theme';
3
+ export interface PanneauRootProps extends HTMLAttributes<HTMLDivElement> {
4
+ /** Tokens that override the default theme: `bootstrapTheme`, or a project's own. */
5
+ theme?: Theme | null;
6
+ /** Defaults to `light`. `auto` follows the system setting. */
7
+ colorScheme?: ColorScheme;
8
+ /**
9
+ * Locale of dates and numbers in React Aria components. Defaults to the react-intl locale, or
10
+ * to the browser's without an `IntlProvider`.
11
+ *
12
+ * Without an `IntlProvider` above it, the root provides one, with the messages of every Panneau
13
+ * package in this locale (English without a locale, or for a locale Panneau doesn't translate).
14
+ * An app with its own `IntlProvider` adds them with `withPanneauMessages()` from
15
+ * `@panneau/intl`.
16
+ */
17
+ locale?: string;
18
+ children?: ReactNode;
19
+ }
20
+ /**
21
+ * The element overlays render into: the closest `PanneauRoot`'s, or `undefined` for the body
22
+ * without a root. It is `null` during the first render of a root: overlays wait for it, since
23
+ * React Aria hides everything outside of a modal from assistive technologies when it opens.
24
+ */
25
+ export declare function usePortalContainer(): Element | null | undefined;
26
+ /**
27
+ * The root of every Panneau interface. It scopes the base stylesheet and the design tokens to its
28
+ * element (no global CSS), applies a theme and a color scheme, and hosts overlays and toasts so
29
+ * that they get the tokens too. Panneau components must render inside one. A project can override
30
+ * any token with its own class on the root. Without an `IntlProvider` above it, it provides one
31
+ * with Panneau's messages in its `locale`.
32
+ */
33
+ export declare function PanneauRoot({ theme, colorScheme, locale, className, children, ...props }: PanneauRootProps): import("react").JSX.Element;
34
+ //# sourceMappingURL=PanneauRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanneauRoot.d.ts","sourceRoot":"","sources":["../../src/root/PanneauRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAgC,MAAM,OAAO,CAAC;AAM1F,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,KAAK,EAA2B,MAAM,gBAAgB,CAAC;AAKvF,MAAM,WAAW,gBAAiB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACpE,oFAAoF;IACpF,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB;AAKD;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,GAAG,IAAI,GAAG,SAAS,CAE/D;AA2BD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EACxB,KAAY,EACZ,WAAqB,EACrB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,gBAAgB,+BAqClB"}