@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
package/README.md CHANGED
@@ -1,3 +1,58 @@
1
- # Temporary Holding Version
1
+ # @panneau/ui
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Design tokens, themes and accessible primitives of Panneau, built on [React Aria Components](https://react-spectrum.adobe.com/react-aria/). Icons come from [Lucide](https://lucide.dev).
4
+
5
+ ```bash
6
+ npm install @panneau/ui@^5.0.0-alpha.0 react-aria-components react-intl
7
+ ```
8
+
9
+ ```tsx
10
+ import { Button, PanneauRoot, TextInput, bootstrapTheme } from '@panneau/ui';
11
+
12
+ <PanneauRoot theme={bootstrapTheme} colorScheme="auto">
13
+ <TextInput label="Title" isRequired />
14
+ <Button variant="primary">Save</Button>
15
+ </PanneauRoot>;
16
+ ```
17
+
18
+ | Export | Content |
19
+ | --------------------- | ------------------------------------------------------------------------------- |
20
+ | `@panneau/ui` | `PanneauRoot`, themes, the primitives, `Icon`, `useToast()`, `usePanneauIntl()` |
21
+ | `@panneau/ui/locales` | Deprecated: the UI messages by locale, `en` and `fr`. Use `@panneau/intl` |
22
+
23
+ ## Root, tokens and themes
24
+
25
+ Every Panneau interface renders inside a `PanneauRoot`. It scopes the base stylesheet and the design tokens (`--panneau-*` CSS variables) to its element: Panneau adds no global CSS to the page. Overlays (dialogs, popovers, menus, tooltips) and toasts render inside it too.
26
+
27
+ - `colorScheme`: `light` (default), `dark`, or `auto`, which follows the system.
28
+ - `theme`: tokens that override the default theme. `bootstrapTheme` follows a site's Bootstrap 5.3 variables and color mode.
29
+ - A project can also override any token with its own class on the root: `.my-panneau { --panneau-color-accent: #0a58ca; }`.
30
+
31
+ The default theme and the icon set are explained in [decision 0020](../../docs/decisions/0020-default-theme-and-icons.md).
32
+
33
+ ## Primitives
34
+
35
+ `Button`, `IconButton`, `TextInput`, `TextArea`, `NumberInput`, `Select` (single or multiple), `ComboBox`, `Checkbox`, `Switch`, `RadioGroup`, `DatePicker`, `TimeInput`, `Fieldset`, `Dialog`, `Popover`, `Menu`, `Tabs`, `Tooltip`, toasts (`useToast()`), `Alert`, `Badge`, `Spinner`, `Card`, `Disclosure` and `Icon`.
36
+
37
+ - Every component accepts `className`, and `xxxClassName` props for its inner elements (`labelClassName`, `inputClassName`…).
38
+ - Labelled controls take `label`, `description` and `errors` (a list of messages: any message makes the control invalid and describes it).
39
+ - They work on phones: larger touch targets on touch screens, dialogs as bottom sheets, scrolling tabs.
40
+
41
+ ## Messages
42
+
43
+ Strings go through react-intl, with English defaults.
44
+
45
+ - **Without an `IntlProvider`**, `PanneauRoot` provides one, with the messages of every Panneau package in its `locale`: `<PanneauRoot locale="fr">` renders in French. Without a `locale`, or with one that Panneau doesn't translate, it renders in English.
46
+ - **With an `IntlProvider`** (an app that uses react-intl for its own strings), the root keeps it and adds nothing. Add the messages of every Panneau package to the app's with [`@panneau/intl`](../intl):
47
+
48
+ ```tsx
49
+ import { withPanneauMessages } from '@panneau/intl';
50
+
51
+ <IntlProvider locale="fr" messages={withPanneauMessages('fr', appMessages)}>
52
+ ```
53
+
54
+ ## Peer dependencies
55
+
56
+ `react` and `react-dom` 19.2+, `react-aria-components` 1.22+ and `react-intl` 12+.
57
+
58
+ The package layout, scripts and API reports are explained in [`docs/packages.md`](../../docs/packages.md). Stories: `npm run storybook` at the root of the repository.
@@ -0,0 +1,78 @@
1
+ .panneau-alert-YltdMY {
2
+ display: flex;
3
+ align-items: flex-start;
4
+ gap: var(--panneau-space-3);
5
+ padding: var(--panneau-space-3) var(--panneau-space-4);
6
+ color: var(--panneau-color-text);
7
+ background-color: var(--panneau-color-surface-sunken);
8
+ border: var(--panneau-border-width) solid var(--panneau-color-border);
9
+ border-radius: var(--panneau-radius-md);
10
+ }
11
+
12
+ .panneau-success-Z7VQdb {
13
+ background-color: var(--panneau-color-success-subtle);
14
+ border-color: var(--panneau-color-success-border);
15
+ }
16
+
17
+ .panneau-danger-7fFkRR {
18
+ background-color: var(--panneau-color-danger-subtle);
19
+ border-color: var(--panneau-color-danger-border);
20
+ }
21
+
22
+ .panneau-warning-xvkEcQ {
23
+ background-color: var(--panneau-color-warning-subtle);
24
+ border-color: var(--panneau-color-warning-border);
25
+ }
26
+
27
+ .panneau-info-beWi9v {
28
+ background-color: var(--panneau-color-info-subtle);
29
+ border-color: var(--panneau-color-info-border);
30
+ }
31
+
32
+ .panneau-icon-blRAxm {
33
+ margin-top: 0.125rem;
34
+ color: var(--panneau-color-text-muted);
35
+ }
36
+
37
+ .panneau-success-Z7VQdb .panneau-icon-blRAxm {
38
+ color: var(--panneau-color-success);
39
+ }
40
+
41
+ .panneau-danger-7fFkRR .panneau-icon-blRAxm {
42
+ color: var(--panneau-color-danger);
43
+ }
44
+
45
+ .panneau-warning-xvkEcQ .panneau-icon-blRAxm {
46
+ color: var(--panneau-color-warning);
47
+ }
48
+
49
+ .panneau-info-beWi9v .panneau-icon-blRAxm {
50
+ color: var(--panneau-color-info);
51
+ }
52
+
53
+ .panneau-content-dNGM-n {
54
+ display: flex;
55
+ flex: 1 1 auto;
56
+ flex-direction: column;
57
+ gap: var(--panneau-space-1);
58
+ min-width: 0;
59
+ }
60
+
61
+ .panneau-title-uRgCXb {
62
+ font-weight: var(--panneau-font-weight-bold);
63
+ }
64
+
65
+ .panneau-body-2meig0 {
66
+ overflow-wrap: anywhere;
67
+ }
68
+
69
+ .panneau-actions-MXSoKc {
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ gap: var(--panneau-space-2);
73
+ margin-top: var(--panneau-space-2);
74
+ }
75
+
76
+ .panneau-dismiss-LWaGfl {
77
+ margin: calc(-1 * var(--panneau-space-1)) calc(-1 * var(--panneau-space-2)) 0 0;
78
+ }
@@ -0,0 +1,30 @@
1
+ import type { ReactNode, Ref } from 'react';
2
+ import { type IconComponent } from '../icon/Icon';
3
+ export type AlertTone = 'neutral' | 'success' | 'danger' | 'warning' | 'info';
4
+ export interface AlertProps {
5
+ /** Defaults to `neutral`. */
6
+ tone?: AlertTone;
7
+ title?: ReactNode;
8
+ children?: ReactNode;
9
+ /** Replaces the icon of the tone. `null` hides it. */
10
+ icon?: IconComponent | null;
11
+ /** Buttons under the message. */
12
+ actions?: ReactNode;
13
+ /** Shows a close button. */
14
+ onDismiss?: () => void;
15
+ /**
16
+ * `alert` announces the message as soon as it appears, for errors that need attention.
17
+ * `status` announces it politely. Without a role, it is only read in place.
18
+ */
19
+ role?: 'alert' | 'status';
20
+ id?: string;
21
+ /** Makes the alert focusable, to move focus to it (an error summary). */
22
+ tabIndex?: number;
23
+ ref?: Ref<HTMLDivElement>;
24
+ className?: string;
25
+ titleClassName?: string;
26
+ bodyClassName?: string;
27
+ }
28
+ /** A message inside the page: an error summary, a warning, a confirmation. */
29
+ export declare function Alert({ tone, title, children, icon, actions, onDismiss, role, id, tabIndex, ref, className, titleClassName, bodyClassName, }: AlertProps): import("react").JSX.Element;
30
+ //# sourceMappingURL=Alert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alert.d.ts","sourceRoot":"","sources":["../../src/alert/Alert.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAMxD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAU9E,MAAM,WAAW,UAAU;IACvB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,sDAAsD;IACtD,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,iCAAiC;IACjC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,8EAA8E;AAC9E,wBAAgB,KAAK,CAAC,EAClB,IAAgB,EAChB,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,SAAS,EACT,IAAI,EACJ,EAAE,EACF,QAAQ,EACR,GAAG,EACH,SAAS,EACT,cAAc,EACd,aAAa,GAChB,EAAE,UAAU,+BAmCZ"}
@@ -0,0 +1,64 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import { Icon } from "../icon/Icon.js";
3
+ import { messages } from "../intl/messages.js";
4
+ import { usePanneauIntl } from "../intl/usePanneauIntl.js";
5
+ import { IconButton } from "../icon-button/IconButton.js";
6
+ import Alert_module_default from "./Alert.module.js";
7
+ import { CircleAlert, CircleCheck, Info, TriangleAlert, X } from "lucide-react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ //#region src/alert/Alert.tsx
10
+ var TONE_ICONS = {
11
+ neutral: Info,
12
+ success: CircleCheck,
13
+ danger: CircleAlert,
14
+ warning: TriangleAlert,
15
+ info: Info
16
+ };
17
+ /** A message inside the page: an error summary, a warning, a confirmation. */
18
+ function Alert({ tone = "neutral", title, children, icon, actions, onDismiss, role, id, tabIndex, ref, className, titleClassName, bodyClassName }) {
19
+ const intl = usePanneauIntl();
20
+ const shown = icon === void 0 ? TONE_ICONS[tone] : icon;
21
+ return /* @__PURE__ */ jsxs("div", {
22
+ ref,
23
+ id,
24
+ role,
25
+ tabIndex,
26
+ className: cx(Alert_module_default.alert, Alert_module_default[tone], className),
27
+ children: [
28
+ shown !== null ? /* @__PURE__ */ jsx(Icon, {
29
+ icon: shown,
30
+ size: "lg",
31
+ className: Alert_module_default.icon
32
+ }) : null,
33
+ /* @__PURE__ */ jsxs("div", {
34
+ className: Alert_module_default.content,
35
+ children: [
36
+ title !== void 0 && title !== null ? /* @__PURE__ */ jsx("div", {
37
+ className: cx(Alert_module_default.title, titleClassName),
38
+ children: title
39
+ }) : null,
40
+ children !== void 0 && children !== null ? /* @__PURE__ */ jsx("div", {
41
+ className: cx(Alert_module_default.body, bodyClassName),
42
+ children
43
+ }) : null,
44
+ actions !== void 0 && actions !== null ? /* @__PURE__ */ jsx("div", {
45
+ className: Alert_module_default.actions,
46
+ children: actions
47
+ }) : null
48
+ ]
49
+ }),
50
+ onDismiss !== void 0 ? /* @__PURE__ */ jsx(IconButton, {
51
+ icon: X,
52
+ size: "sm",
53
+ label: intl.formatMessage(messages.close),
54
+ showTooltip: false,
55
+ onPress: onDismiss,
56
+ className: Alert_module_default.dismiss
57
+ }) : null
58
+ ]
59
+ });
60
+ }
61
+ //#endregion
62
+ export { Alert };
63
+
64
+ //# sourceMappingURL=Alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alert.js","names":["styles"],"sources":["../../src/alert/Alert.tsx"],"sourcesContent":["import { CircleAlert, CircleCheck, Info, TriangleAlert, X } from 'lucide-react';\nimport type { ReactNode, Ref } from 'react';\n\nimport { IconButton } from '../icon-button/IconButton';\nimport { Icon, type IconComponent } from '../icon/Icon';\nimport { messages } from '../intl/messages';\nimport { usePanneauIntl } from '../intl/usePanneauIntl';\nimport { cx } from '../utils/cx';\nimport styles from './Alert.module.css';\n\nexport type AlertTone = 'neutral' | 'success' | 'danger' | 'warning' | 'info';\n\nconst TONE_ICONS: Record<AlertTone, IconComponent> = {\n neutral: Info,\n success: CircleCheck,\n danger: CircleAlert,\n warning: TriangleAlert,\n info: Info,\n};\n\nexport interface AlertProps {\n /** Defaults to `neutral`. */\n tone?: AlertTone;\n title?: ReactNode;\n children?: ReactNode;\n /** Replaces the icon of the tone. `null` hides it. */\n icon?: IconComponent | null;\n /** Buttons under the message. */\n actions?: ReactNode;\n /** Shows a close button. */\n onDismiss?: () => void;\n /**\n * `alert` announces the message as soon as it appears, for errors that need attention.\n * `status` announces it politely. Without a role, it is only read in place.\n */\n role?: 'alert' | 'status';\n id?: string;\n /** Makes the alert focusable, to move focus to it (an error summary). */\n tabIndex?: number;\n ref?: Ref<HTMLDivElement>;\n className?: string;\n titleClassName?: string;\n bodyClassName?: string;\n}\n\n/** A message inside the page: an error summary, a warning, a confirmation. */\nexport function Alert({\n tone = 'neutral',\n title,\n children,\n icon,\n actions,\n onDismiss,\n role,\n id,\n tabIndex,\n ref,\n className,\n titleClassName,\n bodyClassName,\n}: AlertProps) {\n const intl = usePanneauIntl();\n const shown = icon === undefined ? TONE_ICONS[tone] : icon;\n return (\n <div\n ref={ref}\n id={id}\n role={role}\n tabIndex={tabIndex}\n className={cx(styles.alert, styles[tone], className)}\n >\n {shown !== null ? <Icon icon={shown} size=\"lg\" className={styles.icon} /> : null}\n <div className={styles.content}>\n {title !== undefined && title !== null ? (\n <div className={cx(styles.title, titleClassName)}>{title}</div>\n ) : null}\n {children !== undefined && children !== null ? (\n <div className={cx(styles.body, bodyClassName)}>{children}</div>\n ) : null}\n {actions !== undefined && actions !== null ? (\n <div className={styles.actions}>{actions}</div>\n ) : null}\n </div>\n {onDismiss !== undefined ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.close)}\n showTooltip={false}\n onPress={onDismiss}\n className={styles.dismiss}\n />\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAYA,IAAM,aAA+C;CACjD,SAAS;CACT,SAAS;CACT,QAAQ;CACR,SAAS;CACT,MAAM;AACV;;AA4BA,SAAgB,MAAM,EAClB,OAAO,WACP,OACA,UACA,MACA,SACA,WACA,MACA,IACA,UACA,KACA,WACA,gBACA,iBACW;CACX,MAAM,OAAO,eAAe;CAC5B,MAAM,QAAQ,SAAS,KAAA,IAAY,WAAW,QAAQ;CACtD,OACI,qBAAC,OAAD;EACS;EACD;EACE;EACI;EACV,WAAW,GAAGA,qBAAO,OAAOA,qBAAO,OAAO,SAAS;EALvD,UAAA;GAOK,UAAU,OAAO,oBAAC,MAAD;IAAM,MAAM;IAAO,MAAK;IAAK,WAAWA,qBAAO;GAAK,CAAA,IAAM;GAC5E,qBAAC,OAAD;IAAK,WAAWA,qBAAO;IAAvB,UAAA;KACK,UAAU,KAAA,KAAa,UAAU,OAC9B,oBAAC,OAAD;MAAK,WAAW,GAAGA,qBAAO,OAAO,cAAc;MAAI,UAAA;KAAW,CAAA,IAC9D;KACH,aAAa,KAAA,KAAa,aAAa,OACpC,oBAAC,OAAD;MAAK,WAAW,GAAGA,qBAAO,MAAM,aAAa;MAAI;KAAc,CAAA,IAC/D;KACH,YAAY,KAAA,KAAa,YAAY,OAClC,oBAAC,OAAD;MAAK,WAAWA,qBAAO;MAAU,UAAA;KAAa,CAAA,IAC9C;IACH;;GACJ,cAAc,KAAA,IACX,oBAAC,YAAD;IACI,MAAM;IACN,MAAK;IACL,OAAO,KAAK,cAAc,SAAS,KAAK;IACxC,aAAa;IACb,SAAS;IACT,WAAWA,qBAAO;GAAQ,CAAA,IAE9B;EACH;;AAEb"}
@@ -0,0 +1,30 @@
1
+ import "./Alert.css";
2
+ //#region src/alert/Alert.module.css
3
+ var alert = "panneau-alert-YltdMY";
4
+ var success = "panneau-success-Z7VQdb";
5
+ var danger = "panneau-danger-7fFkRR";
6
+ var warning = "panneau-warning-xvkEcQ";
7
+ var info = "panneau-info-beWi9v";
8
+ var icon = "panneau-icon-blRAxm";
9
+ var content = "panneau-content-dNGM-n";
10
+ var title = "panneau-title-uRgCXb";
11
+ var body = "panneau-body-2meig0";
12
+ var actions = "panneau-actions-MXSoKc";
13
+ var dismiss = "panneau-dismiss-LWaGfl";
14
+ var Alert_module_default = {
15
+ alert,
16
+ success,
17
+ danger,
18
+ warning,
19
+ info,
20
+ icon,
21
+ content,
22
+ title,
23
+ body,
24
+ actions,
25
+ dismiss
26
+ };
27
+ //#endregion
28
+ export { actions, alert, body, content, danger, Alert_module_default as default, dismiss, icon, info, success, title, warning };
29
+
30
+ //# sourceMappingURL=Alert.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alert.module.js","names":[],"sources":["../../src/alert/Alert.module.css"],"sourcesContent":[".alert {\n display: flex;\n align-items: flex-start;\n gap: var(--panneau-space-3);\n padding: var(--panneau-space-3) var(--panneau-space-4);\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-surface-sunken);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-md);\n}\n\n.success {\n background-color: var(--panneau-color-success-subtle);\n border-color: var(--panneau-color-success-border);\n}\n\n.danger {\n background-color: var(--panneau-color-danger-subtle);\n border-color: var(--panneau-color-danger-border);\n}\n\n.warning {\n background-color: var(--panneau-color-warning-subtle);\n border-color: var(--panneau-color-warning-border);\n}\n\n.info {\n background-color: var(--panneau-color-info-subtle);\n border-color: var(--panneau-color-info-border);\n}\n\n.icon {\n margin-top: 0.125rem;\n color: var(--panneau-color-text-muted);\n}\n\n.success .icon {\n color: var(--panneau-color-success);\n}\n\n.danger .icon {\n color: var(--panneau-color-danger);\n}\n\n.warning .icon {\n color: var(--panneau-color-warning);\n}\n\n.info .icon {\n color: var(--panneau-color-info);\n}\n\n.content {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--panneau-space-1);\n min-width: 0;\n}\n\n.title {\n font-weight: var(--panneau-font-weight-bold);\n}\n\n.body {\n overflow-wrap: anywhere;\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--panneau-space-2);\n margin-top: var(--panneau-space-2);\n}\n\n.dismiss {\n margin: calc(-1 * var(--panneau-space-1)) calc(-1 * var(--panneau-space-2)) 0 0;\n}\n"],"mappings":""}
@@ -0,0 +1,60 @@
1
+ .panneau-badge-ikDSa7 {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ gap: var(--panneau-space-1);
6
+ min-width: 1.25rem;
7
+ height: 1.25rem;
8
+ padding: 0 var(--panneau-space-2);
9
+ font-size: var(--panneau-font-size-xs);
10
+ font-weight: var(--panneau-font-weight-medium);
11
+ font-variant-numeric: tabular-nums;
12
+ line-height: 1;
13
+ white-space: nowrap;
14
+ color: var(--panneau-color-text);
15
+ background-color: var(--panneau-color-surface-sunken);
16
+ border: var(--panneau-border-width) solid var(--panneau-color-border);
17
+ border-radius: var(--panneau-radius-full);
18
+ }
19
+
20
+ .panneau-success-2NDSCG {
21
+ color: var(--panneau-color-success);
22
+ background-color: var(--panneau-color-success-subtle);
23
+ border-color: var(--panneau-color-success-border);
24
+ }
25
+
26
+ .panneau-danger-NLo-wP {
27
+ color: var(--panneau-color-danger);
28
+ background-color: var(--panneau-color-danger-subtle);
29
+ border-color: var(--panneau-color-danger-border);
30
+ }
31
+
32
+ .panneau-warning-3mFhiV {
33
+ color: var(--panneau-color-warning);
34
+ background-color: var(--panneau-color-warning-subtle);
35
+ border-color: var(--panneau-color-warning-border);
36
+ }
37
+
38
+ .panneau-info-5vE5vu {
39
+ color: var(--panneau-color-info);
40
+ background-color: var(--panneau-color-info-subtle);
41
+ border-color: var(--panneau-color-info-border);
42
+ }
43
+
44
+ .panneau-accent-cGs8f8 {
45
+ color: var(--panneau-color-accent-text);
46
+ background-color: var(--panneau-color-accent);
47
+ border-color: var(--panneau-color-accent);
48
+ }
49
+
50
+ .panneau-visuallyHidden-YMPDBq {
51
+ position: absolute;
52
+ width: 1px;
53
+ height: 1px;
54
+ padding: 0;
55
+ margin: -1px;
56
+ overflow: hidden;
57
+ clip-path: inset(50%);
58
+ white-space: nowrap;
59
+ border: 0;
60
+ }
@@ -0,0 +1,15 @@
1
+ import type { ReactNode } from 'react';
2
+ export type BadgeTone = 'neutral' | 'accent' | 'success' | 'danger' | 'warning' | 'info';
3
+ export interface BadgeProps {
4
+ tone?: BadgeTone;
5
+ children?: ReactNode;
6
+ /**
7
+ * Accessible text, when the visible content isn't enough on its own (a count of errors: "2
8
+ * errors"). The visible content is then hidden from assistive technologies.
9
+ */
10
+ label?: string;
11
+ className?: string;
12
+ }
13
+ /** A short status or a count. */
14
+ export declare function Badge({ tone, children, label, className }: BadgeProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=Badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.d.ts","sourceRoot":"","sources":["../../src/badge/Badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzF,MAAM,WAAW,UAAU;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,iCAAiC;AACjC,wBAAgB,KAAK,CAAC,EAAE,IAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,UAAU,+BAajF"}
@@ -0,0 +1,21 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import Badge_module_default from "./Badge.module.js";
3
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/badge/Badge.tsx
5
+ /** A short status or a count. */
6
+ function Badge({ tone = "neutral", children, label, className }) {
7
+ return /* @__PURE__ */ jsx("span", {
8
+ className: cx(Badge_module_default.badge, Badge_module_default[tone], className),
9
+ children: label !== void 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
10
+ "aria-hidden": "true",
11
+ children
12
+ }), /* @__PURE__ */ jsx("span", {
13
+ className: Badge_module_default.visuallyHidden,
14
+ children: label
15
+ })] }) : children
16
+ });
17
+ }
18
+ //#endregion
19
+ export { Badge };
20
+
21
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","names":["styles","_Fragment"],"sources":["../../src/badge/Badge.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cx } from '../utils/cx';\nimport styles from './Badge.module.css';\n\nexport type BadgeTone = 'neutral' | 'accent' | 'success' | 'danger' | 'warning' | 'info';\n\nexport interface BadgeProps {\n tone?: BadgeTone;\n children?: ReactNode;\n /**\n * Accessible text, when the visible content isn't enough on its own (a count of errors: \"2\n * errors\"). The visible content is then hidden from assistive technologies.\n */\n label?: string;\n className?: string;\n}\n\n/** A short status or a count. */\nexport function Badge({ tone = 'neutral', children, label, className }: BadgeProps) {\n return (\n <span className={cx(styles.badge, styles[tone], className)}>\n {label !== undefined ? (\n <>\n <span aria-hidden=\"true\">{children}</span>\n <span className={styles.visuallyHidden}>{label}</span>\n </>\n ) : (\n children\n )}\n </span>\n );\n}\n"],"mappings":";;;;;AAmBA,SAAgB,MAAM,EAAE,OAAO,WAAW,UAAU,OAAO,aAAyB;CAChF,OACI,oBAAC,QAAD;EAAM,WAAW,GAAGA,qBAAO,OAAOA,qBAAO,OAAO,SAAS;EACpD,UAAA,UAAU,KAAA,IACP,qBAAAC,UAAA,EAAA,UAAA,CACI,oBAAC,QAAD;GAAM,eAAY;GAAQ;EAAe,CAAA,GACzC,oBAAC,QAAD;GAAM,WAAWD,qBAAO;GAAiB,UAAA;EAAY,CAAA,CACzD,EAAA,CAAA,IAEA;CAEF,CAAA;AAEd"}
@@ -0,0 +1,22 @@
1
+ import "./Badge.css";
2
+ //#region src/badge/Badge.module.css
3
+ var badge = "panneau-badge-ikDSa7";
4
+ var success = "panneau-success-2NDSCG";
5
+ var danger = "panneau-danger-NLo-wP";
6
+ var warning = "panneau-warning-3mFhiV";
7
+ var info = "panneau-info-5vE5vu";
8
+ var accent = "panneau-accent-cGs8f8";
9
+ var visuallyHidden = "panneau-visuallyHidden-YMPDBq";
10
+ var Badge_module_default = {
11
+ badge,
12
+ success,
13
+ danger,
14
+ warning,
15
+ info,
16
+ accent,
17
+ visuallyHidden
18
+ };
19
+ //#endregion
20
+ export { accent, badge, danger, Badge_module_default as default, info, success, visuallyHidden, warning };
21
+
22
+ //# sourceMappingURL=Badge.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.module.js","names":[],"sources":["../../src/badge/Badge.module.css"],"sourcesContent":[".badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--panneau-space-1);\n min-width: 1.25rem;\n height: 1.25rem;\n padding: 0 var(--panneau-space-2);\n font-size: var(--panneau-font-size-xs);\n font-weight: var(--panneau-font-weight-medium);\n font-variant-numeric: tabular-nums;\n line-height: 1;\n white-space: nowrap;\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-surface-sunken);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-full);\n}\n\n.success {\n color: var(--panneau-color-success);\n background-color: var(--panneau-color-success-subtle);\n border-color: var(--panneau-color-success-border);\n}\n\n.danger {\n color: var(--panneau-color-danger);\n background-color: var(--panneau-color-danger-subtle);\n border-color: var(--panneau-color-danger-border);\n}\n\n.warning {\n color: var(--panneau-color-warning);\n background-color: var(--panneau-color-warning-subtle);\n border-color: var(--panneau-color-warning-border);\n}\n\n.info {\n color: var(--panneau-color-info);\n background-color: var(--panneau-color-info-subtle);\n border-color: var(--panneau-color-info-border);\n}\n\n.accent {\n color: var(--panneau-color-accent-text);\n background-color: var(--panneau-color-accent);\n border-color: var(--panneau-color-accent);\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n"],"mappings":""}
@@ -0,0 +1,112 @@
1
+ .panneau-button-eiKKZV {
2
+ position: relative;
3
+ display: inline-flex;
4
+ flex: 0 0 auto;
5
+ align-items: center;
6
+ justify-content: center;
7
+ gap: var(--panneau-space-2);
8
+ min-height: var(--panneau-control-height);
9
+ padding: 0 var(--panneau-space-4);
10
+ font-size: var(--panneau-font-size-md);
11
+ font-weight: var(--panneau-font-weight-medium);
12
+ line-height: var(--panneau-line-height-tight);
13
+ text-decoration: none;
14
+ white-space: nowrap;
15
+ cursor: pointer;
16
+ user-select: none;
17
+ border: var(--panneau-border-width) solid transparent;
18
+ border-radius: var(--panneau-radius-md);
19
+ transition:
20
+ background-color var(--panneau-duration),
21
+ border-color var(--panneau-duration),
22
+ color var(--panneau-duration);
23
+ -webkit-tap-highlight-color: transparent;
24
+ }
25
+
26
+ .panneau-button-eiKKZV[data-focus-visible] {
27
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
28
+ outline-offset: 2px;
29
+ }
30
+
31
+ .panneau-button-eiKKZV[data-disabled] {
32
+ cursor: not-allowed;
33
+ opacity: 0.55;
34
+ }
35
+
36
+ .panneau-sm-Y4qjxi {
37
+ min-height: var(--panneau-control-height-sm);
38
+ padding: 0 var(--panneau-space-3);
39
+ font-size: var(--panneau-font-size-sm);
40
+ }
41
+
42
+ .panneau-fullWidth-TLKFBq {
43
+ display: flex;
44
+ width: 100%;
45
+ }
46
+
47
+ .panneau-primary-EU45ZN {
48
+ color: var(--panneau-color-accent-text);
49
+ background-color: var(--panneau-color-accent);
50
+ }
51
+
52
+ .panneau-primary-EU45ZN[data-hovered],
53
+ .panneau-primary-EU45ZN[data-pressed] {
54
+ background-color: var(--panneau-color-accent-hover);
55
+ }
56
+
57
+ .panneau-secondary-5BZ2i9 {
58
+ color: var(--panneau-color-text);
59
+ background-color: var(--panneau-color-surface);
60
+ border-color: var(--panneau-color-border-control);
61
+ }
62
+
63
+ .panneau-secondary-5BZ2i9[data-hovered] {
64
+ background-color: var(--panneau-color-hover);
65
+ }
66
+
67
+ .panneau-secondary-5BZ2i9[data-pressed] {
68
+ background-color: var(--panneau-color-pressed);
69
+ }
70
+
71
+ .panneau-ghost-OX4KsD {
72
+ color: var(--panneau-color-text);
73
+ background-color: transparent;
74
+ }
75
+
76
+ .panneau-ghost-OX4KsD[data-hovered] {
77
+ background-color: var(--panneau-color-hover);
78
+ }
79
+
80
+ .panneau-ghost-OX4KsD[data-pressed] {
81
+ background-color: var(--panneau-color-pressed);
82
+ }
83
+
84
+ .panneau-danger-57n-Hg {
85
+ color: var(--panneau-color-danger-solid-text);
86
+ background-color: var(--panneau-color-danger-solid);
87
+ }
88
+
89
+ .panneau-danger-57n-Hg[data-hovered],
90
+ .panneau-danger-57n-Hg[data-pressed] {
91
+ background-color: var(--panneau-color-danger-solid-hover);
92
+ }
93
+
94
+ .panneau-content-SVjwiQ {
95
+ display: inline-flex;
96
+ align-items: center;
97
+ gap: inherit;
98
+ min-width: 0;
99
+ }
100
+
101
+ .panneau-pending-j5UroX .panneau-content-SVjwiQ {
102
+ visibility: hidden;
103
+ }
104
+
105
+ .panneau-spinner-QToZmM {
106
+ position: absolute;
107
+ inset: 0;
108
+ display: flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+ color: inherit;
112
+ }
@@ -0,0 +1,26 @@
1
+ import type { CSSProperties, ReactNode } from 'react';
2
+ import { type ButtonProps as AriaButtonProps } from 'react-aria-components';
3
+ import { type IconComponent } from '../icon/Icon';
4
+ import styles from './Button.module.css';
5
+ export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';
6
+ export interface ButtonProps extends Omit<AriaButtonProps, 'className' | 'style' | 'children'> {
7
+ /** Defaults to `secondary`. */
8
+ variant?: ButtonVariant;
9
+ size?: 'sm' | 'md';
10
+ /** Icon before the label. */
11
+ icon?: IconComponent;
12
+ /** Icon after the label. */
13
+ iconEnd?: IconComponent;
14
+ /** Takes the full width of its container. */
15
+ fullWidth?: boolean;
16
+ children?: ReactNode;
17
+ className?: string;
18
+ style?: CSSProperties;
19
+ }
20
+ /**
21
+ * A button. With `isPending`, it shows a spinner, keeps its size and focus, and ignores presses
22
+ * while assistive technologies announce the pending state.
23
+ */
24
+ export declare function Button({ variant, size, icon, iconEnd, fullWidth, isPending, children, className, ...props }: ButtonProps): import("react").JSX.Element;
25
+ export { styles as buttonStyles };
26
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAwB,KAAK,WAAW,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAElG,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,MAAM,MAAM,qBAAqB,CAAC;AAEzC,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEzE,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;IAC1F,+BAA+B;IAC/B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,EACnB,OAAqB,EACrB,IAAW,EACX,IAAI,EACJ,OAAO,EACP,SAAiB,EACjB,SAAiB,EACjB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACX,EAAE,WAAW,+BA8Bb;AAED,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import { Icon } from "../icon/Icon.js";
3
+ import { Spinner } from "../spinner/Spinner.js";
4
+ import Button_module_default from "./Button.module.js";
5
+ import { Button } from "react-aria-components";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/button/Button.tsx
8
+ /**
9
+ * A button. With `isPending`, it shows a spinner, keeps its size and focus, and ignores presses
10
+ * while assistive technologies announce the pending state.
11
+ */
12
+ function Button$1({ variant = "secondary", size = "md", icon, iconEnd, fullWidth = false, isPending = false, children, className, ...props }) {
13
+ return /* @__PURE__ */ jsxs(Button, {
14
+ ...props,
15
+ isPending,
16
+ className: cx(Button_module_default.button, Button_module_default[variant], size === "sm" && Button_module_default.sm, fullWidth && Button_module_default.fullWidth, isPending && Button_module_default.pending, className),
17
+ children: [/* @__PURE__ */ jsxs("span", {
18
+ className: Button_module_default.content,
19
+ children: [
20
+ icon !== void 0 ? /* @__PURE__ */ jsx(Icon, {
21
+ icon,
22
+ size: size === "sm" ? "sm" : "md"
23
+ }) : null,
24
+ children,
25
+ iconEnd !== void 0 ? /* @__PURE__ */ jsx(Icon, {
26
+ icon: iconEnd,
27
+ size: size === "sm" ? "sm" : "md"
28
+ }) : null
29
+ ]
30
+ }), isPending ? /* @__PURE__ */ jsx("span", {
31
+ className: Button_module_default.spinner,
32
+ children: /* @__PURE__ */ jsx(Spinner, { size: "sm" })
33
+ }) : null]
34
+ });
35
+ }
36
+ //#endregion
37
+ export { Button$1 as Button, Button_module_default as buttonStyles };
38
+
39
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","names":["Button","AriaButton","styles"],"sources":["../../src/button/Button.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport { Button as AriaButton, type ButtonProps as AriaButtonProps } from 'react-aria-components';\n\nimport { Icon, type IconComponent } from '../icon/Icon';\nimport { Spinner } from '../spinner/Spinner';\nimport { cx } from '../utils/cx';\nimport styles from './Button.module.css';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger';\n\nexport interface ButtonProps extends Omit<AriaButtonProps, 'className' | 'style' | 'children'> {\n /** Defaults to `secondary`. */\n variant?: ButtonVariant;\n size?: 'sm' | 'md';\n /** Icon before the label. */\n icon?: IconComponent;\n /** Icon after the label. */\n iconEnd?: IconComponent;\n /** Takes the full width of its container. */\n fullWidth?: boolean;\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * A button. With `isPending`, it shows a spinner, keeps its size and focus, and ignores presses\n * while assistive technologies announce the pending state.\n */\nexport function Button({\n variant = 'secondary',\n size = 'md',\n icon,\n iconEnd,\n fullWidth = false,\n isPending = false,\n children,\n className,\n ...props\n}: ButtonProps) {\n return (\n <AriaButton\n {...props}\n isPending={isPending}\n className={cx(\n styles.button,\n styles[variant],\n size === 'sm' && styles.sm,\n fullWidth && styles.fullWidth,\n isPending && styles.pending,\n className,\n )}\n >\n <span className={styles.content}>\n {icon !== undefined ? (\n <Icon icon={icon} size={size === 'sm' ? 'sm' : 'md'} />\n ) : null}\n {children}\n {iconEnd !== undefined ? (\n <Icon icon={iconEnd} size={size === 'sm' ? 'sm' : 'md'} />\n ) : null}\n </span>\n {isPending ? (\n <span className={styles.spinner}>\n <Spinner size=\"sm\" />\n </span>\n ) : null}\n </AriaButton>\n );\n}\n\nexport { styles as buttonStyles };\n"],"mappings":";;;;;;;;;;;AA6BA,SAAgBA,SAAO,EACnB,UAAU,aACV,OAAO,MACP,MACA,SACA,YAAY,OACZ,YAAY,OACZ,UACA,WACA,GAAG,SACS;CACZ,OACI,qBAACC,QAAD;EACI,GAAI;EACO;EACX,WAAW,GACPC,sBAAO,QACPA,sBAAO,UACP,SAAS,QAAQA,sBAAO,IACxB,aAAaA,sBAAO,WACpB,aAAaA,sBAAO,SACpB,SACJ;EAVJ,UAAA,CAYI,qBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAxB,UAAA;IACK,SAAS,KAAA,IACN,oBAAC,MAAD;KAAY;KAAM,MAAM,SAAS,OAAO,OAAO;IAAK,CAAA,IACpD;IACH;IACA,YAAY,KAAA,IACT,oBAAC,MAAD;KAAM,MAAM;KAAS,MAAM,SAAS,OAAO,OAAO;IAAK,CAAA,IACvD;GACF;EACL,CAAA,GAAA,YACG,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GACpB,UAAA,oBAAC,SAAD,EAAS,MAAK,KAAI,CAAA;EAChB,CAAA,IACN,IACI;;AAEpB"}
@@ -0,0 +1,28 @@
1
+ import "./Button.css";
2
+ //#region src/button/Button.module.css
3
+ var button = "panneau-button-eiKKZV";
4
+ var sm = "panneau-sm-Y4qjxi";
5
+ var fullWidth = "panneau-fullWidth-TLKFBq";
6
+ var primary = "panneau-primary-EU45ZN";
7
+ var secondary = "panneau-secondary-5BZ2i9";
8
+ var ghost = "panneau-ghost-OX4KsD";
9
+ var danger = "panneau-danger-57n-Hg";
10
+ var content = "panneau-content-SVjwiQ";
11
+ var pending = "panneau-pending-j5UroX";
12
+ var spinner = "panneau-spinner-QToZmM";
13
+ var Button_module_default = {
14
+ button,
15
+ sm,
16
+ fullWidth,
17
+ primary,
18
+ secondary,
19
+ ghost,
20
+ danger,
21
+ content,
22
+ pending,
23
+ spinner
24
+ };
25
+ //#endregion
26
+ export { button, content, danger, Button_module_default as default, fullWidth, ghost, pending, primary, secondary, sm, spinner };
27
+
28
+ //# sourceMappingURL=Button.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.module.js","names":[],"sources":["../../src/button/Button.module.css"],"sourcesContent":[".button {\n position: relative;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n gap: var(--panneau-space-2);\n min-height: var(--panneau-control-height);\n padding: 0 var(--panneau-space-4);\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 text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n border: var(--panneau-border-width) solid transparent;\n border-radius: var(--panneau-radius-md);\n transition:\n background-color var(--panneau-duration),\n border-color var(--panneau-duration),\n color var(--panneau-duration);\n -webkit-tap-highlight-color: transparent;\n}\n\n.button[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.button[data-disabled] {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n.sm {\n min-height: var(--panneau-control-height-sm);\n padding: 0 var(--panneau-space-3);\n font-size: var(--panneau-font-size-sm);\n}\n\n.fullWidth {\n display: flex;\n width: 100%;\n}\n\n.primary {\n color: var(--panneau-color-accent-text);\n background-color: var(--panneau-color-accent);\n}\n\n.primary[data-hovered],\n.primary[data-pressed] {\n background-color: var(--panneau-color-accent-hover);\n}\n\n.secondary {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-surface);\n border-color: var(--panneau-color-border-control);\n}\n\n.secondary[data-hovered] {\n background-color: var(--panneau-color-hover);\n}\n\n.secondary[data-pressed] {\n background-color: var(--panneau-color-pressed);\n}\n\n.ghost {\n color: var(--panneau-color-text);\n background-color: transparent;\n}\n\n.ghost[data-hovered] {\n background-color: var(--panneau-color-hover);\n}\n\n.ghost[data-pressed] {\n background-color: var(--panneau-color-pressed);\n}\n\n.danger {\n color: var(--panneau-color-danger-solid-text);\n background-color: var(--panneau-color-danger-solid);\n}\n\n.danger[data-hovered],\n.danger[data-pressed] {\n background-color: var(--panneau-color-danger-solid-hover);\n}\n\n.content {\n display: inline-flex;\n align-items: center;\n gap: inherit;\n min-width: 0;\n}\n\n.pending .content {\n visibility: hidden;\n}\n\n.spinner {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: inherit;\n}\n"],"mappings":""}