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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +57 -2
  2. package/dist/alert/Alert.css +78 -0
  3. package/dist/alert/Alert.d.ts +30 -0
  4. package/dist/alert/Alert.d.ts.map +1 -0
  5. package/dist/alert/Alert.js +64 -0
  6. package/dist/alert/Alert.js.map +1 -0
  7. package/dist/alert/Alert.module.js +30 -0
  8. package/dist/alert/Alert.module.js.map +1 -0
  9. package/dist/badge/Badge.css +60 -0
  10. package/dist/badge/Badge.d.ts +15 -0
  11. package/dist/badge/Badge.d.ts.map +1 -0
  12. package/dist/badge/Badge.js +21 -0
  13. package/dist/badge/Badge.js.map +1 -0
  14. package/dist/badge/Badge.module.js +22 -0
  15. package/dist/badge/Badge.module.js.map +1 -0
  16. package/dist/button/Button.css +112 -0
  17. package/dist/button/Button.d.ts +26 -0
  18. package/dist/button/Button.d.ts.map +1 -0
  19. package/dist/button/Button.js +39 -0
  20. package/dist/button/Button.js.map +1 -0
  21. package/dist/button/Button.module.js +28 -0
  22. package/dist/button/Button.module.js.map +1 -0
  23. package/dist/card/Card.css +50 -0
  24. package/dist/card/Card.d.ts +20 -0
  25. package/dist/card/Card.d.ts.map +1 -0
  26. package/dist/card/Card.js +38 -0
  27. package/dist/card/Card.js.map +1 -0
  28. package/dist/card/Card.module.js +18 -0
  29. package/dist/card/Card.module.js.map +1 -0
  30. package/dist/checkbox/Checkbox.css +79 -0
  31. package/dist/checkbox/Checkbox.d.ts +11 -0
  32. package/dist/checkbox/Checkbox.d.ts.map +1 -0
  33. package/dist/checkbox/Checkbox.js +43 -0
  34. package/dist/checkbox/Checkbox.js.map +1 -0
  35. package/dist/checkbox/Checkbox.module.js +16 -0
  36. package/dist/checkbox/Checkbox.module.js.map +1 -0
  37. package/dist/checkbox/ChoiceChrome.d.ts +15 -0
  38. package/dist/checkbox/ChoiceChrome.d.ts.map +1 -0
  39. package/dist/checkbox/ChoiceChrome.js +36 -0
  40. package/dist/checkbox/ChoiceChrome.js.map +1 -0
  41. package/dist/combo-box/ComboBox.css +26 -0
  42. package/dist/combo-box/ComboBox.d.ts +30 -0
  43. package/dist/combo-box/ComboBox.d.ts.map +1 -0
  44. package/dist/combo-box/ComboBox.js +106 -0
  45. package/dist/combo-box/ComboBox.js.map +1 -0
  46. package/dist/combo-box/ComboBox.module.js +14 -0
  47. package/dist/combo-box/ComboBox.module.js.map +1 -0
  48. package/dist/date-picker/DatePicker.css +135 -0
  49. package/dist/date-picker/DatePicker.d.ts +12 -0
  50. package/dist/date-picker/DatePicker.d.ts.map +1 -0
  51. package/dist/date-picker/DatePicker.js +93 -0
  52. package/dist/date-picker/DatePicker.js.map +1 -0
  53. package/dist/date-picker/DatePicker.module.js +30 -0
  54. package/dist/date-picker/DatePicker.module.js.map +1 -0
  55. package/dist/dialog/Dialog.css +126 -0
  56. package/dist/dialog/Dialog.d.ts +31 -0
  57. package/dist/dialog/Dialog.d.ts.map +1 -0
  58. package/dist/dialog/Dialog.js +61 -0
  59. package/dist/dialog/Dialog.js.map +1 -0
  60. package/dist/dialog/Dialog.module.js +30 -0
  61. package/dist/dialog/Dialog.module.js.map +1 -0
  62. package/dist/disclosure/Disclosure.css +54 -0
  63. package/dist/disclosure/Disclosure.d.ts +20 -0
  64. package/dist/disclosure/Disclosure.d.ts.map +1 -0
  65. package/dist/disclosure/Disclosure.js +43 -0
  66. package/dist/disclosure/Disclosure.js.map +1 -0
  67. package/dist/disclosure/Disclosure.module.js +22 -0
  68. package/dist/disclosure/Disclosure.module.js.map +1 -0
  69. package/dist/field/Field.css +145 -0
  70. package/dist/field/Field.module.js +30 -0
  71. package/dist/field/Field.module.js.map +1 -0
  72. package/dist/field/FieldParts.d.ts +32 -0
  73. package/dist/field/FieldParts.d.ts.map +1 -0
  74. package/dist/field/FieldParts.js +56 -0
  75. package/dist/field/FieldParts.js.map +1 -0
  76. package/dist/field/Fieldset.d.ts +22 -0
  77. package/dist/field/Fieldset.d.ts.map +1 -0
  78. package/dist/field/Fieldset.js +50 -0
  79. package/dist/field/Fieldset.js.map +1 -0
  80. package/dist/icon/Icon.css +5 -0
  81. package/dist/icon/Icon.d.ts +31 -0
  82. package/dist/icon/Icon.d.ts.map +1 -0
  83. package/dist/icon/Icon.js +29 -0
  84. package/dist/icon/Icon.js.map +1 -0
  85. package/dist/icon/Icon.module.js +8 -0
  86. package/dist/icon/Icon.module.js.map +1 -0
  87. package/dist/icon-button/IconButton.css +9 -0
  88. package/dist/icon-button/IconButton.d.ts +15 -0
  89. package/dist/icon-button/IconButton.d.ts.map +1 -0
  90. package/dist/icon-button/IconButton.js +26 -0
  91. package/dist/icon-button/IconButton.js.map +1 -0
  92. package/dist/icon-button/IconButton.module.js +12 -0
  93. package/dist/icon-button/IconButton.module.js.map +1 -0
  94. package/dist/index.d.ts +32 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +29 -0
  97. package/dist/intl/messages.d.ts +2 -0
  98. package/dist/intl/messages.d.ts.map +1 -0
  99. package/dist/intl/messages.js +1 -0
  100. package/dist/intl/usePanneauIntl.d.ts +7 -0
  101. package/dist/intl/usePanneauIntl.d.ts.map +1 -0
  102. package/dist/intl/usePanneauIntl.js +22 -0
  103. package/dist/intl/usePanneauIntl.js.map +1 -0
  104. package/dist/locales/index.d.ts +15 -0
  105. package/dist/locales/index.d.ts.map +1 -0
  106. package/dist/locales/index.js +21 -0
  107. package/dist/locales/index.js.map +1 -0
  108. package/dist/menu/Menu.d.ts +27 -0
  109. package/dist/menu/Menu.d.ts.map +1 -0
  110. package/dist/menu/Menu.js +57 -0
  111. package/dist/menu/Menu.js.map +1 -0
  112. package/dist/number-input/NumberInput.css +57 -0
  113. package/dist/number-input/NumberInput.d.ts +21 -0
  114. package/dist/number-input/NumberInput.d.ts.map +1 -0
  115. package/dist/number-input/NumberInput.js +82 -0
  116. package/dist/number-input/NumberInput.js.map +1 -0
  117. package/dist/number-input/NumberInput.module.js +16 -0
  118. package/dist/number-input/NumberInput.module.js.map +1 -0
  119. package/dist/popover/Popover.css +32 -0
  120. package/dist/popover/Popover.d.ts +18 -0
  121. package/dist/popover/Popover.d.ts.map +1 -0
  122. package/dist/popover/Popover.js +41 -0
  123. package/dist/popover/Popover.js.map +1 -0
  124. package/dist/popover/Popover.module.js +14 -0
  125. package/dist/popover/Popover.module.js.map +1 -0
  126. package/dist/radio-group/RadioGroup.css +83 -0
  127. package/dist/radio-group/RadioGroup.d.ts +12 -0
  128. package/dist/radio-group/RadioGroup.d.ts.map +1 -0
  129. package/dist/radio-group/RadioGroup.js +61 -0
  130. package/dist/radio-group/RadioGroup.js.map +1 -0
  131. package/dist/radio-group/RadioGroup.module.js +20 -0
  132. package/dist/radio-group/RadioGroup.module.js.map +1 -0
  133. package/dist/root/PanneauRoot.css +251 -0
  134. package/dist/root/PanneauRoot.d.ts +34 -0
  135. package/dist/root/PanneauRoot.d.ts.map +1 -0
  136. package/dist/root/PanneauRoot.js +84 -0
  137. package/dist/root/PanneauRoot.js.map +1 -0
  138. package/dist/root/PanneauRoot.module.js +12 -0
  139. package/dist/root/PanneauRoot.module.js.map +1 -0
  140. package/dist/select/ListBox.css +104 -0
  141. package/dist/select/ListBox.module.js +32 -0
  142. package/dist/select/ListBox.module.js.map +1 -0
  143. package/dist/select/Select.d.ts +45 -0
  144. package/dist/select/Select.d.ts.map +1 -0
  145. package/dist/select/Select.js +136 -0
  146. package/dist/select/Select.js.map +1 -0
  147. package/dist/spinner/Spinner.css +40 -0
  148. package/dist/spinner/Spinner.d.ts +11 -0
  149. package/dist/spinner/Spinner.d.ts.map +1 -0
  150. package/dist/spinner/Spinner.js +25 -0
  151. package/dist/spinner/Spinner.js.map +1 -0
  152. package/dist/spinner/Spinner.module.js +18 -0
  153. package/dist/spinner/Spinner.module.js.map +1 -0
  154. package/dist/switch/Switch.css +69 -0
  155. package/dist/switch/Switch.d.ts +11 -0
  156. package/dist/switch/Switch.d.ts.map +1 -0
  157. package/dist/switch/Switch.js +33 -0
  158. package/dist/switch/Switch.js.map +1 -0
  159. package/dist/switch/Switch.module.js +15 -0
  160. package/dist/switch/Switch.module.js.map +1 -0
  161. package/dist/tabs/Tabs.css +83 -0
  162. package/dist/tabs/Tabs.d.ts +27 -0
  163. package/dist/tabs/Tabs.d.ts.map +1 -0
  164. package/dist/tabs/Tabs.js +141 -0
  165. package/dist/tabs/Tabs.js.map +1 -0
  166. package/dist/tabs/Tabs.module.js +16 -0
  167. package/dist/tabs/Tabs.module.js.map +1 -0
  168. package/dist/text-area/TextArea.css +8 -0
  169. package/dist/text-area/TextArea.d.ts +11 -0
  170. package/dist/text-area/TextArea.d.ts.map +1 -0
  171. package/dist/text-area/TextArea.js +41 -0
  172. package/dist/text-area/TextArea.js.map +1 -0
  173. package/dist/text-area/TextArea.module.js +8 -0
  174. package/dist/text-area/TextArea.module.js.map +1 -0
  175. package/dist/text-input/TextInput.d.ts +17 -0
  176. package/dist/text-input/TextInput.d.ts.map +1 -0
  177. package/dist/text-input/TextInput.js +61 -0
  178. package/dist/text-input/TextInput.js.map +1 -0
  179. package/dist/theme/bootstrap.d.ts +8 -0
  180. package/dist/theme/bootstrap.d.ts.map +1 -0
  181. package/dist/theme/bootstrap.js +61 -0
  182. package/dist/theme/bootstrap.js.map +1 -0
  183. package/dist/theme/theme.d.ts +23 -0
  184. package/dist/theme/theme.d.ts.map +1 -0
  185. package/dist/theme/theme.js +30 -0
  186. package/dist/theme/theme.js.map +1 -0
  187. package/dist/time-input/TimeInput.d.ts +8 -0
  188. package/dist/time-input/TimeInput.d.ts.map +1 -0
  189. package/dist/time-input/TimeInput.js +45 -0
  190. package/dist/time-input/TimeInput.js.map +1 -0
  191. package/dist/toast/Toast.css +109 -0
  192. package/dist/toast/Toast.d.ts +39 -0
  193. package/dist/toast/Toast.d.ts.map +1 -0
  194. package/dist/toast/Toast.js +152 -0
  195. package/dist/toast/Toast.js.map +1 -0
  196. package/dist/toast/Toast.module.js +30 -0
  197. package/dist/toast/Toast.module.js.map +1 -0
  198. package/dist/tooltip/Tooltip.css +25 -0
  199. package/dist/tooltip/Tooltip.d.ts +19 -0
  200. package/dist/tooltip/Tooltip.d.ts.map +1 -0
  201. package/dist/tooltip/Tooltip.js +29 -0
  202. package/dist/tooltip/Tooltip.js.map +1 -0
  203. package/dist/tooltip/Tooltip.module.js +12 -0
  204. package/dist/tooltip/Tooltip.module.js.map +1 -0
  205. package/dist/utils/cx.d.ts +3 -0
  206. package/dist/utils/cx.d.ts.map +1 -0
  207. package/dist/utils/cx.js +9 -0
  208. package/dist/utils/cx.js.map +1 -0
  209. package/package.json +48 -5
@@ -0,0 +1,8 @@
1
+ import { type TimeFieldProps, type TimeValue } from 'react-aria-components';
2
+ import { type FieldChromeProps } from '../field/FieldParts';
3
+ export interface TimeInputProps extends Omit<TimeFieldProps<TimeValue>, 'className' | 'style' | 'children' | 'isInvalid' | 'validate'>, FieldChromeProps {
4
+ controlClassName?: string;
5
+ }
6
+ /** A time of day, typed segment by segment in the format of the locale. */
7
+ export declare function TimeInput({ label, description, errors, isRequired, isReadOnly, className, labelClassName, descriptionClassName, errorsClassName, controlClassName, ...props }: TimeInputProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=TimeInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../../src/time-input/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,cAAc,EACnB,KAAK,SAAS,EACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,cACb,SACI,IAAI,CACA,cAAc,CAAC,SAAS,CAAC,EACzB,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAChE,EACD,gBAAgB;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,WAAW,EACX,MAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,GAAG,KAAK,EACX,EAAE,cAAc,+BAyBhB"}
@@ -0,0 +1,45 @@
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 DatePicker_module_default from "../date-picker/DatePicker.module.js";
5
+ import { DateInput, DateSegment, TimeField } from "react-aria-components";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/time-input/TimeInput.tsx
8
+ /** A time of day, typed segment by segment in the format of the locale. */
9
+ function TimeInput({ label, description, errors = [], isRequired, isReadOnly, className, labelClassName, descriptionClassName, errorsClassName, controlClassName, ...props }) {
10
+ return /* @__PURE__ */ jsxs(TimeField, {
11
+ ...props,
12
+ isRequired,
13
+ isReadOnly,
14
+ isInvalid: errors.length > 0,
15
+ validationBehavior: "aria",
16
+ className: cx(Field_module_default.field, className),
17
+ children: [
18
+ /* @__PURE__ */ jsx(FieldLabel, {
19
+ isRequired,
20
+ className: labelClassName,
21
+ children: label
22
+ }),
23
+ /* @__PURE__ */ jsx(DateInput, {
24
+ className: cx(Field_module_default.control, DatePicker_module_default.input, controlClassName),
25
+ "data-readonly": isReadOnly || void 0,
26
+ children: (segment) => /* @__PURE__ */ jsx(DateSegment, {
27
+ segment,
28
+ className: DatePicker_module_default.segment
29
+ })
30
+ }),
31
+ /* @__PURE__ */ jsx(FieldDescription, {
32
+ className: descriptionClassName,
33
+ children: description
34
+ }),
35
+ /* @__PURE__ */ jsx(FieldErrors, {
36
+ errors,
37
+ className: errorsClassName
38
+ })
39
+ ]
40
+ });
41
+ }
42
+ //#endregion
43
+ export { TimeInput };
44
+
45
+ //# sourceMappingURL=TimeInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeInput.js","names":["fieldStyles","datePickerStyles"],"sources":["../../src/time-input/TimeInput.tsx"],"sourcesContent":["import {\n DateInput,\n DateSegment,\n TimeField,\n type TimeFieldProps,\n type TimeValue,\n} from 'react-aria-components';\n\nimport datePickerStyles from '../date-picker/DatePicker.module.css';\nimport {\n type FieldChromeProps,\n FieldDescription,\n FieldErrors,\n FieldLabel,\n fieldStyles,\n} from '../field/FieldParts';\nimport { cx } from '../utils/cx';\n\nexport interface TimeInputProps\n extends\n Omit<\n TimeFieldProps<TimeValue>,\n 'className' | 'style' | 'children' | 'isInvalid' | 'validate'\n >,\n FieldChromeProps {\n controlClassName?: string;\n}\n\n/** A time of day, typed segment by segment in the format of the locale. */\nexport function TimeInput({\n label,\n description,\n errors = [],\n isRequired,\n isReadOnly,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n ...props\n}: TimeInputProps) {\n return (\n <TimeField\n {...props}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isInvalid={errors.length > 0}\n validationBehavior=\"aria\"\n className={cx(fieldStyles.field, className)}\n >\n <FieldLabel isRequired={isRequired} className={labelClassName}>\n {label}\n </FieldLabel>\n <DateInput\n className={cx(fieldStyles.control, datePickerStyles.input, controlClassName)}\n data-readonly={isReadOnly || undefined}\n >\n {(segment) => (\n <DateSegment segment={segment} className={datePickerStyles.segment} />\n )}\n </DateInput>\n <FieldDescription className={descriptionClassName}>{description}</FieldDescription>\n <FieldErrors errors={errors} className={errorsClassName} />\n </TimeField>\n );\n}\n"],"mappings":";;;;;;;;AA6BA,SAAgB,UAAU,EACtB,OACA,aACA,SAAS,CAAA,GACT,YACA,YACA,WACA,gBACA,sBACA,iBACA,kBACA,GAAG,SACY;CACf,OACI,qBAAC,WAAD;EACI,GAAI;EACQ;EACA;EACZ,WAAW,OAAO,SAAS;EAC3B,oBAAmB;EACnB,WAAW,GAAGA,qBAAY,OAAO,SAAS;EAN9C,UAAA;GAQI,oBAAC,YAAD;IAAwB;IAAY,WAAW;IAC1C,UAAA;GACO,CAAA;GACZ,oBAAC,WAAD;IACI,WAAW,GAAGA,qBAAY,SAASC,0BAAiB,OAAO,gBAAgB;IAC3E,iBAAe,cAAc,KAAA;IAE3B,WAAA,YACE,oBAAC,aAAD;KAAsB;KAAS,WAAWA,0BAAiB;IAAQ,CAAA;GAEhE,CAAA;GACX,oBAAC,kBAAD;IAAkB,WAAW;IAAuB,UAAA;GAA8B,CAAA;GAClF,oBAAC,aAAD;IAAqB;IAAQ,WAAW;GAAgB,CAAA;EACjD;;AAEnB"}
@@ -0,0 +1,109 @@
1
+ /* The region carries the root's class (tokens), since React Aria renders it in the body. */
2
+ .panneau-region-wzx1vG.panneau-region-wzx1vG {
3
+ position: fixed;
4
+ inset-block-end: var(--panneau-space-4);
5
+ inset-inline-end: var(--panneau-space-4);
6
+ z-index: var(--panneau-z-toast);
7
+ display: flex;
8
+ flex-direction: column-reverse;
9
+ gap: var(--panneau-space-2);
10
+ width: min(24rem, calc(100vw - 2 * var(--panneau-space-4)));
11
+ background: transparent;
12
+ outline: none;
13
+ }
14
+
15
+ .panneau-region-wzx1vG[data-focus-visible] {
16
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
17
+ outline-offset: 4px;
18
+ }
19
+
20
+ @media (max-width: 30rem) {
21
+ .panneau-region-wzx1vG.panneau-region-wzx1vG {
22
+ inset-inline: var(--panneau-space-2);
23
+ inset-block-end: var(--panneau-space-2);
24
+ width: auto;
25
+ }
26
+ }
27
+
28
+ .panneau-toast-zcR9rJ {
29
+ display: flex;
30
+ align-items: flex-start;
31
+ gap: var(--panneau-space-3);
32
+ padding: var(--panneau-space-3) var(--panneau-space-3) var(--panneau-space-3)
33
+ var(--panneau-space-4);
34
+ color: var(--panneau-color-text);
35
+ background-color: var(--panneau-color-surface-raised);
36
+ border: var(--panneau-border-width) solid var(--panneau-color-border);
37
+ border-inline-start-width: 4px;
38
+ border-radius: var(--panneau-radius-lg);
39
+ box-shadow: var(--panneau-shadow-lg);
40
+ outline: none;
41
+ }
42
+
43
+ .panneau-toast-zcR9rJ[data-focus-visible] {
44
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
45
+ outline-offset: 2px;
46
+ }
47
+
48
+ .panneau-success-bKO-t0 {
49
+ border-inline-start-color: var(--panneau-color-success);
50
+ }
51
+
52
+ .panneau-danger-xAgJYb {
53
+ border-inline-start-color: var(--panneau-color-danger);
54
+ }
55
+
56
+ .panneau-warning-8eqKky {
57
+ border-inline-start-color: var(--panneau-color-warning);
58
+ }
59
+
60
+ .panneau-info-3p-uFF {
61
+ border-inline-start-color: var(--panneau-color-info);
62
+ }
63
+
64
+ .panneau-icon-xCysks {
65
+ margin-top: 0.125rem;
66
+ }
67
+
68
+ .panneau-success-bKO-t0 .panneau-icon-xCysks {
69
+ color: var(--panneau-color-success);
70
+ }
71
+
72
+ .panneau-danger-xAgJYb .panneau-icon-xCysks {
73
+ color: var(--panneau-color-danger);
74
+ }
75
+
76
+ .panneau-warning-8eqKky .panneau-icon-xCysks {
77
+ color: var(--panneau-color-warning);
78
+ }
79
+
80
+ .panneau-info-3p-uFF .panneau-icon-xCysks {
81
+ color: var(--panneau-color-info);
82
+ }
83
+
84
+ .panneau-content-oL01to {
85
+ display: flex;
86
+ flex: 1 1 auto;
87
+ flex-direction: column;
88
+ gap: var(--panneau-space-1);
89
+ min-width: 0;
90
+ padding-top: 0.125rem;
91
+ }
92
+
93
+ .panneau-title-ZUmw4H {
94
+ font-weight: var(--panneau-font-weight-medium);
95
+ overflow-wrap: anywhere;
96
+ }
97
+
98
+ .panneau-description-bQFVpf {
99
+ font-size: var(--panneau-font-size-sm);
100
+ color: var(--panneau-color-text-muted);
101
+ overflow-wrap: anywhere;
102
+ }
103
+
104
+ .panneau-actions-4GKOfg {
105
+ display: flex;
106
+ flex: 0 0 auto;
107
+ align-items: center;
108
+ gap: var(--panneau-space-1);
109
+ }
@@ -0,0 +1,39 @@
1
+ import { type ReactNode } from 'react';
2
+ export type ToastTone = 'neutral' | 'success' | 'danger' | 'warning' | 'info';
3
+ /** What a toast says. */
4
+ export interface ToastContent {
5
+ title: string;
6
+ description?: string;
7
+ /** Defaults to `neutral`. */
8
+ tone?: ToastTone;
9
+ /** A button in the toast, such as "Retry" or "Undo". The toast closes when it is pressed. */
10
+ action?: {
11
+ label: string;
12
+ onAction: () => void;
13
+ };
14
+ }
15
+ export interface ToastOptions {
16
+ /**
17
+ * Milliseconds before the toast closes by itself. Defaults to 5000, and to no timeout for
18
+ * toasts with an action, which users must have time to reach.
19
+ */
20
+ timeout?: number | null;
21
+ onClose?: () => void;
22
+ }
23
+ export interface Toasts {
24
+ /** Shows a toast. Returns its key. */
25
+ show(content: ToastContent, options?: ToastOptions): string;
26
+ /** Closes a toast by key. */
27
+ close(key: string): void;
28
+ }
29
+ /** Shows toasts in the closest `PanneauRoot`. */
30
+ export declare function useToast(): Toasts;
31
+ export interface ToastProviderProps {
32
+ children?: ReactNode;
33
+ /** Class names that give the region its tokens, since it renders in the body. */
34
+ regionClassName?: string;
35
+ regionProps?: Record<`data-${string}`, string | undefined>;
36
+ }
37
+ /** Holds the toasts of a `PanneauRoot` and renders them in an accessible region. */
38
+ export declare function ToastProvider({ children, regionClassName, regionProps }: ToastProviderProps): import("react").JSX.Element;
39
+ //# sourceMappingURL=Toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../src/toast/Toast.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAgC,MAAM,OAAO,CAAC;AAiBrE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9E,yBAAyB;AACzB,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,6FAA6F;IAC7F,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CACpD;AAED,MAAM,WAAW,YAAY;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACnB,sCAAsC;IACtC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAC5D,6BAA6B;IAC7B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAYD,iDAAiD;AACjD,wBAAgB,QAAQ,IAAI,MAAM,CAMjC;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC9D;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,EAAE,kBAAkB,+BAqE3F"}
@@ -0,0 +1,152 @@
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 { Button as Button$1 } from "../button/Button.js";
6
+ import Toast_module_default from "./Toast.module.js";
7
+ import { IconButton } from "../icon-button/IconButton.js";
8
+ import { CircleAlert, CircleCheck, Info, TriangleAlert, X } from "lucide-react";
9
+ import { Text, UNSTABLE_Toast, UNSTABLE_ToastContent, UNSTABLE_ToastQueue, UNSTABLE_ToastRegion } from "react-aria-components";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ import { createContext, use, useState } from "react";
12
+ import { c } from "react/compiler-runtime";
13
+ //#region src/toast/Toast.tsx
14
+ var TONE_ICONS = {
15
+ neutral: null,
16
+ success: CircleCheck,
17
+ danger: CircleAlert,
18
+ warning: TriangleAlert,
19
+ info: Info
20
+ };
21
+ var ToastContext = createContext(null);
22
+ /** Shows toasts in the closest `PanneauRoot`. */
23
+ function useToast() {
24
+ const toasts = use(ToastContext);
25
+ if (toasts === null) throw new Error("useToast() must be used inside <PanneauRoot>.");
26
+ return toasts;
27
+ }
28
+ /** Holds the toasts of a `PanneauRoot` and renders them in an accessible region. */
29
+ function ToastProvider(t0) {
30
+ const $ = c(19);
31
+ const { children, regionClassName, regionProps } = t0;
32
+ const intl = usePanneauIntl();
33
+ const [queue] = useState(_temp);
34
+ let t1;
35
+ if ($[0] !== queue) {
36
+ t1 = () => ({
37
+ show(content, t2) {
38
+ const { timeout, onClose } = t2 === void 0 ? {} : t2;
39
+ const delay = timeout === void 0 ? content.action ? null : 5e3 : timeout;
40
+ return queue.add(content, {
41
+ ...delay !== null ? { timeout: delay } : {},
42
+ ...onClose !== void 0 ? { onClose } : {}
43
+ });
44
+ },
45
+ close(key) {
46
+ queue.close(key);
47
+ }
48
+ });
49
+ $[0] = queue;
50
+ $[1] = t1;
51
+ } else t1 = $[1];
52
+ const [toasts] = useState(t1);
53
+ let t2;
54
+ if ($[2] !== intl) {
55
+ t2 = intl.formatMessage(messages.notifications);
56
+ $[2] = intl;
57
+ $[3] = t2;
58
+ } else t2 = $[3];
59
+ let t3;
60
+ if ($[4] !== regionClassName) {
61
+ t3 = cx(regionClassName, Toast_module_default.region);
62
+ $[4] = regionClassName;
63
+ $[5] = t3;
64
+ } else t3 = $[5];
65
+ let t4;
66
+ if ($[6] !== intl || $[7] !== queue) {
67
+ t4 = (t5) => {
68
+ const { toast } = t5;
69
+ const tone = toast.content.tone ?? "neutral";
70
+ const icon = TONE_ICONS[tone];
71
+ const { action } = toast.content;
72
+ return /* @__PURE__ */ jsxs(UNSTABLE_Toast, {
73
+ toast,
74
+ className: cx(Toast_module_default.toast, Toast_module_default[tone]),
75
+ children: [
76
+ icon !== null ? /* @__PURE__ */ jsx(Icon, {
77
+ icon,
78
+ size: "lg",
79
+ className: Toast_module_default.icon
80
+ }) : null,
81
+ /* @__PURE__ */ jsxs(UNSTABLE_ToastContent, {
82
+ className: Toast_module_default.content,
83
+ children: [/* @__PURE__ */ jsx(Text, {
84
+ slot: "title",
85
+ className: Toast_module_default.title,
86
+ children: toast.content.title
87
+ }), toast.content.description !== void 0 ? /* @__PURE__ */ jsx(Text, {
88
+ slot: "description",
89
+ className: Toast_module_default.description,
90
+ children: toast.content.description
91
+ }) : null]
92
+ }),
93
+ /* @__PURE__ */ jsxs("div", {
94
+ className: Toast_module_default.actions,
95
+ children: [action !== void 0 ? /* @__PURE__ */ jsx(Button$1, {
96
+ size: "sm",
97
+ onPress: () => {
98
+ action.onAction();
99
+ queue.close(toast.key);
100
+ },
101
+ children: action.label
102
+ }) : null, /* @__PURE__ */ jsx(IconButton, {
103
+ slot: "close",
104
+ icon: X,
105
+ size: "sm",
106
+ label: intl.formatMessage(messages.close),
107
+ showTooltip: false
108
+ })]
109
+ })
110
+ ]
111
+ });
112
+ };
113
+ $[6] = intl;
114
+ $[7] = queue;
115
+ $[8] = t4;
116
+ } else t4 = $[8];
117
+ let t5;
118
+ if ($[9] !== queue || $[10] !== regionProps || $[11] !== t2 || $[12] !== t3 || $[13] !== t4) {
119
+ t5 = /* @__PURE__ */ jsx(UNSTABLE_ToastRegion, {
120
+ queue,
121
+ "aria-label": t2,
122
+ className: t3,
123
+ ...regionProps,
124
+ children: t4
125
+ });
126
+ $[9] = queue;
127
+ $[10] = regionProps;
128
+ $[11] = t2;
129
+ $[12] = t3;
130
+ $[13] = t4;
131
+ $[14] = t5;
132
+ } else t5 = $[14];
133
+ let t6;
134
+ if ($[15] !== children || $[16] !== t5 || $[17] !== toasts) {
135
+ t6 = /* @__PURE__ */ jsxs(ToastContext, {
136
+ value: toasts,
137
+ children: [children, t5]
138
+ });
139
+ $[15] = children;
140
+ $[16] = t5;
141
+ $[17] = toasts;
142
+ $[18] = t6;
143
+ } else t6 = $[18];
144
+ return t6;
145
+ }
146
+ function _temp() {
147
+ return new UNSTABLE_ToastQueue({ maxVisibleToasts: 5 });
148
+ }
149
+ //#endregion
150
+ export { ToastProvider, useToast };
151
+
152
+ //# sourceMappingURL=Toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.js","names":["toast","icon","X","queue","toasts","children","_c","styles","AriaToast","AriaToastContent","Button","AriaToastRegion","AriaToastQueue"],"sources":["../../src/toast/Toast.tsx"],"sourcesContent":["import { CircleAlert, CircleCheck, Info, TriangleAlert, X } from 'lucide-react';\nimport { type ReactNode, createContext, use, useState } from 'react';\nimport {\n UNSTABLE_Toast as AriaToast,\n UNSTABLE_ToastContent as AriaToastContent,\n UNSTABLE_ToastQueue as AriaToastQueue,\n UNSTABLE_ToastRegion as AriaToastRegion,\n Text,\n} from 'react-aria-components';\n\nimport { Button } from '../button/Button';\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 './Toast.module.css';\n\nexport type ToastTone = 'neutral' | 'success' | 'danger' | 'warning' | 'info';\n\n/** What a toast says. */\nexport interface ToastContent {\n title: string;\n description?: string;\n /** Defaults to `neutral`. */\n tone?: ToastTone;\n /** A button in the toast, such as \"Retry\" or \"Undo\". The toast closes when it is pressed. */\n action?: { label: string; onAction: () => void };\n}\n\nexport interface ToastOptions {\n /**\n * Milliseconds before the toast closes by itself. Defaults to 5000, and to no timeout for\n * toasts with an action, which users must have time to reach.\n */\n timeout?: number | null;\n onClose?: () => void;\n}\n\nexport interface Toasts {\n /** Shows a toast. Returns its key. */\n show(content: ToastContent, options?: ToastOptions): string;\n /** Closes a toast by key. */\n close(key: string): void;\n}\n\nconst TONE_ICONS: Record<ToastTone, IconComponent | null> = {\n neutral: null,\n success: CircleCheck,\n danger: CircleAlert,\n warning: TriangleAlert,\n info: Info,\n};\n\nconst ToastContext = createContext<Toasts | null>(null);\n\n/** Shows toasts in the closest `PanneauRoot`. */\nexport function useToast(): Toasts {\n const toasts = use(ToastContext);\n if (toasts === null) {\n throw new Error('useToast() must be used inside <PanneauRoot>.');\n }\n return toasts;\n}\n\nexport interface ToastProviderProps {\n children?: ReactNode;\n /** Class names that give the region its tokens, since it renders in the body. */\n regionClassName?: string;\n regionProps?: Record<`data-${string}`, string | undefined>;\n}\n\n/** Holds the toasts of a `PanneauRoot` and renders them in an accessible region. */\nexport function ToastProvider({ children, regionClassName, regionProps }: ToastProviderProps) {\n const intl = usePanneauIntl();\n const [queue] = useState(() => new AriaToastQueue<ToastContent>({ maxVisibleToasts: 5 }));\n const [toasts] = useState<Toasts>(() => ({\n show(content, { timeout, onClose } = {}) {\n const delay = timeout === undefined ? (content.action ? null : 5000) : timeout;\n return queue.add(content, {\n ...(delay !== null ? { timeout: delay } : {}),\n ...(onClose !== undefined ? { onClose } : {}),\n });\n },\n close(key) {\n queue.close(key);\n },\n }));\n return (\n <ToastContext value={toasts}>\n {children}\n <AriaToastRegion\n queue={queue}\n aria-label={intl.formatMessage(messages.notifications)}\n className={cx(regionClassName, styles.region)}\n {...regionProps}\n >\n {({ toast }) => {\n const tone = toast.content.tone ?? 'neutral';\n const icon = TONE_ICONS[tone];\n const { action } = toast.content;\n return (\n <AriaToast toast={toast} className={cx(styles.toast, styles[tone])}>\n {icon !== null ? (\n <Icon icon={icon} size=\"lg\" className={styles.icon} />\n ) : null}\n <AriaToastContent className={styles.content}>\n <Text slot=\"title\" className={styles.title}>\n {toast.content.title}\n </Text>\n {toast.content.description !== undefined ? (\n <Text slot=\"description\" className={styles.description}>\n {toast.content.description}\n </Text>\n ) : null}\n </AriaToastContent>\n <div className={styles.actions}>\n {action !== undefined ? (\n <Button\n size=\"sm\"\n onPress={() => {\n action.onAction();\n queue.close(toast.key);\n }}\n >\n {action.label}\n </Button>\n ) : null}\n <IconButton\n slot=\"close\"\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.close)}\n showTooltip={false}\n />\n </div>\n </AriaToast>\n );\n }}\n </AriaToastRegion>\n </ToastContext>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import "./Toast.css";
2
+ //#region src/toast/Toast.module.css
3
+ var region = "panneau-region-wzx1vG";
4
+ var toast = "panneau-toast-zcR9rJ";
5
+ var success = "panneau-success-bKO-t0";
6
+ var danger = "panneau-danger-xAgJYb";
7
+ var warning = "panneau-warning-8eqKky";
8
+ var info = "panneau-info-3p-uFF";
9
+ var icon = "panneau-icon-xCysks";
10
+ var content = "panneau-content-oL01to";
11
+ var title = "panneau-title-ZUmw4H";
12
+ var description = "panneau-description-bQFVpf";
13
+ var actions = "panneau-actions-4GKOfg";
14
+ var Toast_module_default = {
15
+ region,
16
+ toast,
17
+ success,
18
+ danger,
19
+ warning,
20
+ info,
21
+ icon,
22
+ content,
23
+ title,
24
+ description,
25
+ actions
26
+ };
27
+ //#endregion
28
+ export { actions, content, danger, Toast_module_default as default, description, icon, info, region, success, title, toast, warning };
29
+
30
+ //# sourceMappingURL=Toast.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.module.js","names":[],"sources":["../../src/toast/Toast.module.css"],"sourcesContent":["/* The region carries the root's class (tokens), since React Aria renders it in the body. */\n.region.region {\n position: fixed;\n inset-block-end: var(--panneau-space-4);\n inset-inline-end: var(--panneau-space-4);\n z-index: var(--panneau-z-toast);\n display: flex;\n flex-direction: column-reverse;\n gap: var(--panneau-space-2);\n width: min(24rem, calc(100vw - 2 * var(--panneau-space-4)));\n background: transparent;\n outline: none;\n}\n\n.region[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 4px;\n}\n\n@media (max-width: 30rem) {\n .region.region {\n inset-inline: var(--panneau-space-2);\n inset-block-end: var(--panneau-space-2);\n width: auto;\n }\n}\n\n.toast {\n display: flex;\n align-items: flex-start;\n gap: var(--panneau-space-3);\n padding: var(--panneau-space-3) var(--panneau-space-3) var(--panneau-space-3)\n 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-inline-start-width: 4px;\n border-radius: var(--panneau-radius-lg);\n box-shadow: var(--panneau-shadow-lg);\n outline: none;\n}\n\n.toast[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.success {\n border-inline-start-color: var(--panneau-color-success);\n}\n\n.danger {\n border-inline-start-color: var(--panneau-color-danger);\n}\n\n.warning {\n border-inline-start-color: var(--panneau-color-warning);\n}\n\n.info {\n border-inline-start-color: var(--panneau-color-info);\n}\n\n.icon {\n margin-top: 0.125rem;\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 padding-top: 0.125rem;\n}\n\n.title {\n font-weight: var(--panneau-font-weight-medium);\n overflow-wrap: anywhere;\n}\n\n.description {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n overflow-wrap: anywhere;\n}\n\n.actions {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n gap: var(--panneau-space-1);\n}\n"],"mappings":""}
@@ -0,0 +1,25 @@
1
+ .panneau-tooltip--CWkTN {
2
+ max-width: min(20rem, calc(100vw - 2 * var(--panneau-space-4)));
3
+ padding: var(--panneau-space-1) var(--panneau-space-2);
4
+ font-size: var(--panneau-font-size-sm);
5
+ line-height: var(--panneau-line-height-tight);
6
+ color: var(--panneau-color-bg);
7
+ background-color: var(--panneau-color-text);
8
+ border-radius: var(--panneau-radius-sm);
9
+ box-shadow: var(--panneau-shadow-md);
10
+ z-index: var(--panneau-z-overlay);
11
+ }
12
+
13
+ .panneau-tooltip--CWkTN[data-entering] {
14
+ animation: panneau-fade--CCbVC var(--panneau-duration);
15
+ }
16
+
17
+ .panneau-tooltip--CWkTN[data-exiting] {
18
+ animation: panneau-fade--CCbVC var(--panneau-duration) reverse ease-in;
19
+ }
20
+
21
+ @keyframes panneau-fade--CCbVC {
22
+ from {
23
+ opacity: 0;
24
+ }
25
+ }
@@ -0,0 +1,19 @@
1
+ import type { ReactElement, ReactNode } from 'react';
2
+ import { type TooltipProps as AriaTooltipProps } from 'react-aria-components';
3
+ export interface TooltipProps {
4
+ /** Content of the tooltip. */
5
+ content: ReactNode;
6
+ /** The element that shows the tooltip on hover and focus: a focusable React Aria element. */
7
+ children: ReactElement;
8
+ placement?: AriaTooltipProps['placement'];
9
+ /** Delay before showing, in milliseconds. Defaults to 600. */
10
+ delay?: number;
11
+ isDisabled?: boolean;
12
+ className?: string;
13
+ }
14
+ /**
15
+ * A tooltip on hover and keyboard focus. It only adds a description: never put information or
16
+ * actions in it that aren't available otherwise, since touch screens don't show it.
17
+ */
18
+ export declare function Tooltip({ content, children, placement, delay, isDisabled, className, }: TooltipProps): import("react").JSX.Element;
19
+ //# sourceMappingURL=Tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/tooltip/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAEH,KAAK,YAAY,IAAI,gBAAgB,EAExC,MAAM,uBAAuB,CAAC;AAM/B,MAAM,WAAW,YAAY;IACzB,8BAA8B;IAC9B,OAAO,EAAE,SAAS,CAAC;IACnB,6FAA6F;IAC7F,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,EACpB,OAAO,EACP,QAAQ,EACR,SAAiB,EACjB,KAAW,EACX,UAAkB,EAClB,SAAS,GACZ,EAAE,YAAY,+BAkBd"}
@@ -0,0 +1,29 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import { usePortalContainer } from "../root/PanneauRoot.js";
3
+ import Tooltip_module_default from "./Tooltip.module.js";
4
+ import { Tooltip, TooltipTrigger } from "react-aria-components";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/tooltip/Tooltip.tsx
7
+ /**
8
+ * A tooltip on hover and keyboard focus. It only adds a description: never put information or
9
+ * actions in it that aren't available otherwise, since touch screens don't show it.
10
+ */
11
+ function Tooltip$1({ content, children, placement = "top", delay = 600, isDisabled = false, className }) {
12
+ const container = usePortalContainer();
13
+ if (container === null) return children;
14
+ return /* @__PURE__ */ jsxs(TooltipTrigger, {
15
+ delay,
16
+ isDisabled,
17
+ children: [children, /* @__PURE__ */ jsx(Tooltip, {
18
+ placement,
19
+ offset: 6,
20
+ className: cx(Tooltip_module_default.tooltip, className),
21
+ UNSTABLE_portalContainer: container,
22
+ children: content
23
+ })]
24
+ });
25
+ }
26
+ //#endregion
27
+ export { Tooltip$1 as Tooltip };
28
+
29
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","names":["Tooltip","AriaTooltip","styles"],"sources":["../../src/tooltip/Tooltip.tsx"],"sourcesContent":["import type { ReactElement, ReactNode } from 'react';\nimport {\n Tooltip as AriaTooltip,\n type TooltipProps as AriaTooltipProps,\n TooltipTrigger,\n} from 'react-aria-components';\n\nimport { usePortalContainer } from '../root/PanneauRoot';\nimport { cx } from '../utils/cx';\nimport styles from './Tooltip.module.css';\n\nexport interface TooltipProps {\n /** Content of the tooltip. */\n content: ReactNode;\n /** The element that shows the tooltip on hover and focus: a focusable React Aria element. */\n children: ReactElement;\n placement?: AriaTooltipProps['placement'];\n /** Delay before showing, in milliseconds. Defaults to 600. */\n delay?: number;\n isDisabled?: boolean;\n className?: string;\n}\n\n/**\n * A tooltip on hover and keyboard focus. It only adds a description: never put information or\n * actions in it that aren't available otherwise, since touch screens don't show it.\n */\nexport function Tooltip({\n content,\n children,\n placement = 'top',\n delay = 600,\n isDisabled = false,\n className,\n}: TooltipProps) {\n const container = usePortalContainer();\n if (container === null) {\n return children;\n }\n return (\n <TooltipTrigger delay={delay} isDisabled={isDisabled}>\n {children}\n <AriaTooltip\n placement={placement}\n offset={6}\n className={cx(styles.tooltip, className)}\n UNSTABLE_portalContainer={container}\n >\n {content}\n </AriaTooltip>\n </TooltipTrigger>\n );\n}\n"],"mappings":";;;;;;;;;;AA2BA,SAAgBA,UAAQ,EACpB,SACA,UACA,YAAY,OACZ,QAAQ,KACR,aAAa,OACb,aACa;CACb,MAAM,YAAY,mBAAmB;CACrC,IAAI,cAAc,MACd,OAAO;CAEX,OACI,qBAAC,gBAAD;EAAuB;EAAmB;EAA1C,UAAA,CACK,UACD,oBAACC,SAAD;GACe;GACX,QAAQ;GACR,WAAW,GAAGC,uBAAO,SAAS,SAAS;GACvC,0BAA0B;GAEzB,UAAA;EACQ,CAAA,CACD;;AAExB"}
@@ -0,0 +1,12 @@
1
+ import "./Tooltip.css";
2
+ //#region src/tooltip/Tooltip.module.css
3
+ var tooltip = "panneau-tooltip--CWkTN";
4
+ var fade = "panneau-fade--CCbVC";
5
+ var Tooltip_module_default = {
6
+ tooltip,
7
+ fade
8
+ };
9
+ //#endregion
10
+ export { Tooltip_module_default as default, fade, tooltip };
11
+
12
+ //# sourceMappingURL=Tooltip.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.module.js","names":[],"sources":["../../src/tooltip/Tooltip.module.css"],"sourcesContent":[".tooltip {\n max-width: min(20rem, calc(100vw - 2 * var(--panneau-space-4)));\n padding: var(--panneau-space-1) var(--panneau-space-2);\n font-size: var(--panneau-font-size-sm);\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-bg);\n background-color: var(--panneau-color-text);\n border-radius: var(--panneau-radius-sm);\n box-shadow: var(--panneau-shadow-md);\n z-index: var(--panneau-z-overlay);\n}\n\n.tooltip[data-entering] {\n animation: fade var(--panneau-duration);\n}\n\n.tooltip[data-exiting] {\n animation: fade var(--panneau-duration) reverse ease-in;\n}\n\n@keyframes fade {\n from {\n opacity: 0;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** Joins class names, skipping empty ones. */
2
+ export declare function cx(...classNames: (string | false | null | undefined)[]): string;
3
+ //# sourceMappingURL=cx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cx.d.ts","sourceRoot":"","sources":["../../src/utils/cx.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,wBAAgB,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAE/E"}
@@ -0,0 +1,9 @@
1
+ //#region src/utils/cx.ts
2
+ /** Joins class names, skipping empty ones. */
3
+ function cx(...classNames) {
4
+ return classNames.filter(Boolean).join(" ");
5
+ }
6
+ //#endregion
7
+ export { cx };
8
+
9
+ //# sourceMappingURL=cx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cx.js","names":[],"sources":["../../src/utils/cx.ts"],"sourcesContent":["/** Joins class names, skipping empty ones. */\nexport function cx(...classNames: (string | false | null | undefined)[]): string {\n return classNames.filter(Boolean).join(' ');\n}\n"],"mappings":";;AACA,SAAgB,GAAG,GAAG,YAA2D;CAC7E,OAAO,WAAW,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC9C"}
package/package.json CHANGED
@@ -1,6 +1,49 @@
1
1
  {
2
- "name": "@panneau/ui",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
2
+ "name": "@panneau/ui",
3
+ "version": "5.0.0-alpha.0",
4
+ "description": "Design tokens, themes and accessible primitives of Panneau, built on React Aria Components.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/folkloreinc/panneau-js.git",
10
+ "directory": "packages/ui"
11
+ },
12
+ "sideEffects": [
13
+ "*.css"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "@panneau/source": "./src/index.ts",
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./locales": {
22
+ "@panneau/source": "./src/locales/index.ts",
23
+ "types": "./dist/locales/index.d.ts",
24
+ "default": "./dist/locales/index.js"
25
+ },
26
+ "./package.json": "./package.json"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "scripts": {
32
+ "build": "vite build && tsc -p tsconfig.build.json",
33
+ "typecheck": "tsc --noEmit",
34
+ "api": "tsc -p tsconfig.build.json && node ../../scripts/api-report.js"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "peerDependencies": {
40
+ "react": "^19.2.0",
41
+ "react-dom": "^19.2.0",
42
+ "react-aria-components": "^1.22.0",
43
+ "react-intl": "^12.0.0"
44
+ },
45
+ "dependencies": {
46
+ "@panneau/intl": "5.0.0-alpha.0",
47
+ "lucide-react": "^1.57.0"
48
+ }
49
+ }