@surflane/ui 0.4.0 → 0.6.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 (296) hide show
  1. package/README.md +2 -2
  2. package/dist/{disclosure.d.ts → accordion.d.ts} +1 -17
  3. package/dist/{disclosure.js → accordion.js} +3 -17
  4. package/dist/alert-dialog.d.ts +31 -0
  5. package/dist/alert-dialog.js +22 -0
  6. package/dist/app-shell.d.ts +44 -3
  7. package/dist/app-shell.js +86 -13
  8. package/dist/{input-extensions.d.ts → autocomplete.d.ts} +4 -42
  9. package/dist/{input-extensions.js → autocomplete.js} +7 -26
  10. package/dist/avatar.js +3 -5
  11. package/dist/badge.d.ts +20 -0
  12. package/dist/badge.js +16 -0
  13. package/dist/bottom-navigation.d.ts +66 -0
  14. package/dist/bottom-navigation.js +36 -0
  15. package/dist/{navigation.d.ts → breadcrumbs.d.ts} +2 -6
  16. package/dist/breadcrumbs.js +31 -0
  17. package/dist/button.d.ts +11 -0
  18. package/dist/button.js +27 -4
  19. package/dist/{content.d.ts → card.d.ts} +6 -24
  20. package/dist/card.js +26 -0
  21. package/dist/chart.d.ts +35 -0
  22. package/dist/chart.js +123 -50
  23. package/dist/checkbox-group.d.ts +2 -0
  24. package/dist/checkbox-group.js +16 -0
  25. package/dist/checkbox.d.ts +9 -0
  26. package/dist/checkbox.js +29 -0
  27. package/dist/choice-label.d.ts +25 -0
  28. package/dist/choice-label.js +14 -0
  29. package/dist/choice.d.ts +7 -0
  30. package/dist/choice.js +3 -0
  31. package/dist/code.d.ts +21 -0
  32. package/dist/{content.js → code.js} +5 -30
  33. package/dist/collapsible.d.ts +18 -0
  34. package/dist/collapsible.js +21 -0
  35. package/dist/{advanced-forms.d.ts → combobox.d.ts} +5 -25
  36. package/dist/{advanced-forms.js → combobox.js} +13 -49
  37. package/dist/{context-overlays.d.ts → context-menu.d.ts} +6 -28
  38. package/dist/{context-overlays.js → context-menu.js} +5 -25
  39. package/dist/css/accordion.css +11 -0
  40. package/dist/css/alert-dialog.css +11 -0
  41. package/{src → dist/css}/all.css +1 -1
  42. package/dist/css/app-shell.css +12 -0
  43. package/dist/css/autocomplete.css +15 -0
  44. package/dist/css/avatar.css +10 -0
  45. package/dist/css/badge.css +10 -0
  46. package/dist/css/bottom-navigation.css +8 -0
  47. package/dist/css/breadcrumbs.css +12 -0
  48. package/dist/css/button.css +8 -0
  49. package/dist/css/card.css +11 -0
  50. package/dist/css/chart.css +13 -0
  51. package/dist/css/checkbox-group.css +9 -0
  52. package/dist/css/checkbox.css +9 -0
  53. package/dist/css/choice-label.css +9 -0
  54. package/dist/css/code.css +13 -0
  55. package/dist/css/collapsible.css +11 -0
  56. package/dist/css/combobox.css +14 -0
  57. package/dist/css/context-menu.css +15 -0
  58. package/dist/css/date-picker.css +12 -0
  59. package/dist/css/dialog.css +10 -0
  60. package/dist/css/drawer.css +11 -0
  61. package/dist/css/empty-state.css +9 -0
  62. package/dist/css/field.css +10 -0
  63. package/dist/css/fieldset.css +8 -0
  64. package/dist/css/file-upload.css +17 -0
  65. package/dist/css/filter-bar.css +8 -0
  66. package/dist/css/form.css +8 -0
  67. package/dist/css/icon.css +8 -0
  68. package/dist/css/inline-message.css +10 -0
  69. package/dist/css/input.css +9 -0
  70. package/dist/css/layout.css +9 -0
  71. package/dist/css/link.css +9 -0
  72. package/dist/css/list.css +9 -0
  73. package/dist/css/markdown.css +18 -0
  74. package/dist/css/menu.css +14 -0
  75. package/dist/css/menubar.css +9 -0
  76. package/dist/css/meter.css +9 -0
  77. package/dist/css/native-select.css +13 -0
  78. package/dist/css/navigation-menu.css +11 -0
  79. package/dist/css/number-field.css +11 -0
  80. package/dist/css/otp-field.css +10 -0
  81. package/dist/css/page-header.css +11 -0
  82. package/dist/css/pagination.css +11 -0
  83. package/dist/css/popover.css +9 -0
  84. package/dist/css/preview-card.css +11 -0
  85. package/dist/css/progress.css +9 -0
  86. package/dist/css/radio-group.css +9 -0
  87. package/dist/css/rules/accordion.css +21 -0
  88. package/dist/css/rules/alert-dialog.css +23 -0
  89. package/dist/css/rules/app-shell.css +220 -0
  90. package/dist/css/rules/autocomplete.css +3 -0
  91. package/dist/css/rules/avatar.css +17 -0
  92. package/dist/css/rules/badge.css +17 -0
  93. package/dist/css/rules/bar.css +38 -0
  94. package/dist/css/rules/base.css +46 -0
  95. package/dist/css/rules/bottom-navigation.css +142 -0
  96. package/dist/css/rules/breadcrumbs.css +9 -0
  97. package/dist/css/rules/button.css +131 -0
  98. package/dist/css/rules/card.css +10 -0
  99. package/dist/css/rules/chart.css +256 -0
  100. package/dist/css/rules/checkbox-group.css +3 -0
  101. package/dist/css/rules/checkbox.css +25 -0
  102. package/dist/css/rules/choice-label.css +52 -0
  103. package/dist/css/rules/choice.css +104 -0
  104. package/dist/css/rules/code.css +9 -0
  105. package/dist/css/rules/collapsible.css +12 -0
  106. package/dist/css/rules/combobox.css +177 -0
  107. package/dist/css/rules/context-menu.css +9 -0
  108. package/dist/css/rules/date-picker.css +301 -0
  109. package/dist/css/rules/dialog.css +160 -0
  110. package/dist/css/rules/disclosure.css +107 -0
  111. package/dist/css/rules/drawer.css +18 -0
  112. package/dist/css/rules/empty-state.css +9 -0
  113. package/dist/css/rules/field-control.css +70 -0
  114. package/dist/css/rules/field.css +56 -0
  115. package/dist/css/rules/fieldset.css +23 -0
  116. package/dist/css/rules/file-upload.css +156 -0
  117. package/dist/css/rules/filter-bar.css +56 -0
  118. package/dist/css/rules/form.css +15 -0
  119. package/dist/css/rules/gauge.css +61 -0
  120. package/dist/css/rules/icon.css +27 -0
  121. package/dist/css/rules/inline-message.css +10 -0
  122. package/dist/css/rules/input-group.css +69 -0
  123. package/dist/css/rules/input.css +33 -0
  124. package/dist/css/rules/item.css +14 -0
  125. package/dist/css/rules/layout.css +3 -0
  126. package/dist/css/rules/link.css +9 -0
  127. package/dist/css/rules/list.css +10 -0
  128. package/dist/css/rules/markdown.css +63 -0
  129. package/dist/css/rules/menu.css +97 -0
  130. package/dist/css/rules/menubar.css +18 -0
  131. package/dist/css/rules/meter.css +3 -0
  132. package/dist/css/rules/native-select.css +3 -0
  133. package/dist/css/rules/navigation-menu.css +159 -0
  134. package/dist/css/rules/number-field.css +55 -0
  135. package/dist/css/rules/otp-field.css +68 -0
  136. package/dist/css/rules/page-header.css +3 -0
  137. package/dist/css/rules/pagination.css +3 -0
  138. package/dist/css/rules/panel.css +221 -0
  139. package/dist/css/rules/popover.css +41 -0
  140. package/dist/css/rules/popup.css +27 -0
  141. package/dist/css/rules/preview-card.css +60 -0
  142. package/dist/css/rules/progress.css +14 -0
  143. package/dist/css/rules/radio-group.css +26 -0
  144. package/dist/css/rules/scroll-area.css +101 -0
  145. package/dist/css/rules/select.css +88 -0
  146. package/dist/css/rules/separator.css +3 -0
  147. package/dist/css/rules/sheet.css +3 -0
  148. package/dist/css/rules/sizing.css +140 -0
  149. package/dist/css/rules/skeleton.css +41 -0
  150. package/dist/css/rules/slider.css +123 -0
  151. package/dist/css/rules/sparkline.css +52 -0
  152. package/dist/css/rules/spinner.css +38 -0
  153. package/dist/css/rules/stat.css +59 -0
  154. package/dist/css/rules/switch.css +50 -0
  155. package/dist/css/rules/syntax-highlighter.css +82 -0
  156. package/dist/css/rules/table.css +28 -0
  157. package/dist/css/rules/tabs.css +126 -0
  158. package/dist/css/rules/textarea.css +21 -0
  159. package/dist/css/rules/toast.css +247 -0
  160. package/dist/css/rules/toggle-group.css +3 -0
  161. package/dist/css/rules/toggle.css +27 -0
  162. package/dist/css/rules/toolbar.css +62 -0
  163. package/dist/css/rules/tooltip.css +38 -0
  164. package/dist/css/rules/tree.css +98 -0
  165. package/dist/css/rules/typography.css +3 -0
  166. package/dist/css/scroll-area.css +8 -0
  167. package/dist/css/select.css +12 -0
  168. package/dist/css/separator.css +9 -0
  169. package/dist/css/sheet.css +11 -0
  170. package/dist/css/sizing.css +7 -0
  171. package/dist/css/skeleton.css +8 -0
  172. package/dist/css/slider.css +8 -0
  173. package/dist/css/sparkline.css +8 -0
  174. package/dist/css/spinner.css +8 -0
  175. package/dist/css/stat.css +9 -0
  176. package/dist/css/styles.css +100 -0
  177. package/dist/css/switch.css +9 -0
  178. package/dist/css/syntax-highlighter.css +9 -0
  179. package/dist/css/table.css +12 -0
  180. package/dist/css/tabs.css +8 -0
  181. package/dist/css/textarea.css +10 -0
  182. package/dist/css/toast.css +11 -0
  183. package/dist/css/toggle-group.css +9 -0
  184. package/dist/css/toggle.css +10 -0
  185. package/dist/css/toolbar.css +12 -0
  186. package/dist/css/tooltip.css +9 -0
  187. package/dist/css/tree.css +10 -0
  188. package/dist/css/typography.css +9 -0
  189. package/dist/date-picker.js +3 -2
  190. package/dist/dialog.d.ts +6 -24
  191. package/dist/dialog.js +7 -20
  192. package/dist/{panels.d.ts → drawer.d.ts} +3 -34
  193. package/dist/drawer.js +47 -0
  194. package/dist/empty-state.d.ts +29 -0
  195. package/dist/empty-state.js +19 -0
  196. package/dist/field.d.ts +42 -0
  197. package/dist/field.js +21 -0
  198. package/dist/fieldset.d.ts +14 -0
  199. package/dist/fieldset.js +10 -0
  200. package/dist/file-upload.d.ts +3 -1
  201. package/dist/file-upload.js +7 -5
  202. package/dist/filter-bar.js +1 -1
  203. package/dist/form.d.ts +2 -0
  204. package/dist/form.js +7 -0
  205. package/dist/format.d.ts +25 -0
  206. package/dist/format.js +42 -0
  207. package/dist/icon.d.ts +11 -0
  208. package/dist/icon.js +19 -3
  209. package/dist/index.d.ts +61 -30
  210. package/dist/index.js +75 -33
  211. package/dist/{messages.d.ts → inline-message.d.ts} +0 -28
  212. package/dist/{messages.js → inline-message.js} +3 -18
  213. package/dist/input.js +2 -2
  214. package/dist/{foundations.d.ts → layout.d.ts} +5 -23
  215. package/dist/{foundations.js → layout.js} +4 -19
  216. package/dist/link.d.ts +6 -0
  217. package/dist/link.js +17 -0
  218. package/dist/list.d.ts +33 -0
  219. package/dist/list.js +21 -0
  220. package/dist/markdown.js +4 -5
  221. package/dist/menu.d.ts +7 -5
  222. package/dist/menu.js +12 -8
  223. package/dist/menubar.d.ts +4 -0
  224. package/dist/menubar.js +4 -0
  225. package/dist/meter.d.ts +29 -0
  226. package/dist/meter.js +13 -0
  227. package/dist/native-select.d.ts +8 -0
  228. package/dist/native-select.js +54 -0
  229. package/dist/navigation-menu.js +8 -5
  230. package/dist/number-field.d.ts +23 -0
  231. package/dist/number-field.js +33 -0
  232. package/dist/page-header.d.ts +12 -0
  233. package/dist/page-header.js +9 -0
  234. package/dist/pagination.js +3 -4
  235. package/dist/panel.d.ts +13 -0
  236. package/dist/panel.js +13 -0
  237. package/dist/parts.d.ts +19 -1
  238. package/dist/parts.js +32 -6
  239. package/dist/popover.d.ts +23 -6
  240. package/dist/popover.js +17 -7
  241. package/dist/preview-card.d.ts +29 -0
  242. package/dist/preview-card.js +27 -0
  243. package/dist/progress.d.ts +29 -0
  244. package/dist/progress.js +13 -0
  245. package/dist/radio-group.d.ts +16 -0
  246. package/dist/radio-group.js +31 -0
  247. package/dist/scroll-area.js +3 -4
  248. package/dist/select.d.ts +8 -8
  249. package/dist/select.js +19 -54
  250. package/dist/separator.d.ts +4 -0
  251. package/dist/separator.js +8 -0
  252. package/dist/sheet.d.ts +29 -0
  253. package/dist/sheet.js +39 -0
  254. package/dist/skeleton.d.ts +8 -0
  255. package/dist/skeleton.js +8 -0
  256. package/dist/slider.d.ts +40 -0
  257. package/dist/slider.js +27 -0
  258. package/dist/sparkline.d.ts +41 -0
  259. package/dist/sparkline.js +50 -0
  260. package/dist/spinner.d.ts +13 -0
  261. package/dist/spinner.js +10 -0
  262. package/dist/stat.d.ts +59 -0
  263. package/dist/stat.js +26 -0
  264. package/dist/status.d.ts +2 -20
  265. package/dist/status.js +11 -14
  266. package/dist/switch.d.ts +13 -0
  267. package/dist/switch.js +25 -0
  268. package/dist/syntax-highlighter.js +2 -1
  269. package/dist/{data.d.ts → table.d.ts} +8 -32
  270. package/dist/{data.js → table.js} +15 -30
  271. package/dist/textarea.d.ts +7 -0
  272. package/dist/textarea.js +12 -0
  273. package/dist/toast.d.ts +57 -1
  274. package/dist/toast.js +80 -8
  275. package/dist/toggle-group.d.ts +5 -0
  276. package/dist/toggle-group.js +7 -0
  277. package/dist/toggle.d.ts +7 -0
  278. package/dist/toggle.js +9 -0
  279. package/dist/{commands.d.ts → toolbar.d.ts} +0 -13
  280. package/dist/toolbar.js +14 -0
  281. package/dist/tooltip.d.ts +10 -3
  282. package/dist/tooltip.js +4 -4
  283. package/dist/tree.js +4 -2
  284. package/dist/typography.d.ts +12 -0
  285. package/dist/typography.js +14 -0
  286. package/package.json +324 -25
  287. package/dist/chevron.d.ts +0 -3
  288. package/dist/chevron.js +0 -6
  289. package/dist/commands.js +0 -27
  290. package/dist/feedback.d.ts +0 -76
  291. package/dist/feedback.js +0 -35
  292. package/dist/forms.d.ts +0 -91
  293. package/dist/forms.js +0 -109
  294. package/dist/navigation.js +0 -41
  295. package/dist/panels.js +0 -100
  296. package/src/styles.css +0 -3780
package/dist/dialog.js CHANGED
@@ -1,20 +1,19 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from 'react';
4
- import { skin } from './parts.js';
4
+ import { Icon } from './icon.js';
5
+ import { sizeName, skin, cx } from './parts.js';
5
6
  import { useDialogFocusBoundary } from './dialog-focus.js';
6
7
  import { useComponentSize } from './sizing.js';
7
8
  import { Dialog as BaseDialog } from '@base-ui/react/dialog';
8
- import { AlertDialog as BaseAlertDialog } from '@base-ui/react/alert-dialog';
9
- const cx = (...v) => v.filter(Boolean).join(' ');
10
9
  /** Visible icon close action; inherits Dialog focus and dismissal behavior. */
11
10
  const DialogCloseButton = /* @__PURE__ */ React.forwardRef(function DialogCloseButton({ className, 'aria-label': label = 'Close dialog', ...props }, ref) {
12
- return (_jsx(BaseDialog.Close, { ...props, ref: ref, "aria-label": label, className: skin('pui-icon-button pui-dialog-close', className), children: _jsx("svg", { width: '18', height: '18', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '1.7', "aria-hidden": 'true', children: _jsx("path", { d: 'm6 6 12 12M18 6 6 18' }) }) }));
11
+ return (_jsx(BaseDialog.Close, { ...props, ref: ref, "aria-label": label, className: skin('pui-icon-button pui-dialog-close', className), children: _jsx(Icon, { name: 'close' }) }));
13
12
  });
14
- const DialogContent = /* @__PURE__ */ React.forwardRef(function DialogContent({ className, children, closeLabel = 'Close dialog', closeDisabled, focusBoundaryLabel = 'Continue dialog navigation', ...props }, ref) {
15
- const scheme = useComponentSize();
13
+ const DialogContent = /* @__PURE__ */ React.forwardRef(function DialogContent({ size, className, children, closeLabel = 'Close dialog', closeDisabled, focusBoundaryLabel = 'Continue dialog navigation', ...props }, ref) {
14
+ const scheme = useComponentSize(size);
16
15
  const portalRef = useDialogFocusBoundary(focusBoundaryLabel);
17
- return (_jsxs(BaseDialog.Portal, { ref: portalRef, children: [_jsx(BaseDialog.Backdrop, { className: 'pui-dialog-backdrop' }), _jsxs(BaseDialog.Popup, { "data-ui-size": scheme, ...props, ref: ref, className: skin('pui-dialog-popup pui-dialog-content', className), children: [_jsx(DialogCloseButton, { "aria-label": closeLabel, disabled: closeDisabled }), children] })] }));
16
+ return (_jsxs(BaseDialog.Portal, { ref: portalRef, children: [_jsx(BaseDialog.Backdrop, { className: 'pui-dialog-backdrop' }), _jsxs(BaseDialog.Popup, { "data-ui-size": scheme, "data-size": sizeName(size), ...props, ref: ref, className: skin('pui-dialog-popup pui-dialog-content', className), children: [_jsx(DialogCloseButton, { "aria-label": closeLabel, disabled: closeDisabled }), children] })] }));
18
17
  });
19
18
  function DialogHeader({ className, ...props }) {
20
19
  return _jsx("div", { ...props, className: cx('pui-dialog-header', className) });
@@ -33,18 +32,6 @@ export const Dialog = {
33
32
  Footer: DialogFooter,
34
33
  CloseButton: DialogCloseButton,
35
34
  };
36
- const AlertDialogContent = /* @__PURE__ */ React.forwardRef(function AlertDialogContent({ className, focusBoundaryLabel = 'Continue dialog navigation', ...props }, ref) {
37
- const scheme = useComponentSize();
38
- const portalRef = useDialogFocusBoundary(focusBoundaryLabel);
39
- return (_jsxs(BaseAlertDialog.Portal, { ref: portalRef, children: [_jsx(BaseAlertDialog.Backdrop, { className: 'pui-dialog-backdrop' }), _jsx(BaseAlertDialog.Popup, { "data-ui-size": scheme, ...props, ref: ref, className: skin('pui-dialog-popup pui-dialog-content pui-confirm-content', className) })] }));
40
- });
41
- export const AlertDialog = {
42
- ...BaseAlertDialog,
43
- Content: AlertDialogContent,
44
- Header: DialogHeader,
45
- Footer: DialogFooter,
46
- };
47
35
  // Flat names for React Server Components, which cannot dot into client exports.
48
- export { AlertDialogContent, DialogContent, DialogHeader, DialogBody, DialogFooter, DialogCloseButton, };
49
- export const { Backdrop: AlertDialogBackdrop, Close: AlertDialogClose, Description: AlertDialogDescription, Handle: AlertDialogHandle, Popup: AlertDialogPopup, Portal: AlertDialogPortal, Root: AlertDialogRoot, Title: AlertDialogTitle, Trigger: AlertDialogTrigger, Viewport: AlertDialogViewport, Header: AlertDialogHeader, Footer: AlertDialogFooter, } = AlertDialog;
36
+ export { DialogContent, DialogHeader, DialogBody, DialogFooter, DialogCloseButton, };
50
37
  export const { Backdrop: DialogBackdrop, Close: DialogClose, Description: DialogDescription, Handle: DialogHandle, Popup: DialogPopup, Portal: DialogPortal, Root: DialogRoot, Title: DialogTitle, Trigger: DialogTrigger, Viewport: DialogViewport, } = Dialog;
@@ -1,43 +1,12 @@
1
1
  import * as React from 'react';
2
- import { type ComponentSizeAlias } from './sizing.js';
3
- import { Dialog as BaseDialog } from '@base-ui/react/dialog';
4
2
  import { Drawer as BaseDrawer } from '@base-ui/react/drawer';
5
- export type PanelSide = 'left' | 'right' | 'top' | 'bottom';
6
- type PanelOptions = {
7
- size?: ComponentSizeAlias;
8
- closeLabel?: string;
9
- };
10
- declare function SheetRoot({ side, modal, ...props }: React.ComponentProps<typeof BaseDialog.Root> & {
11
- side?: PanelSide;
12
- }): React.JSX.Element;
3
+ import { Footer, Header, type PanelOptions, type PanelSide } from './panel.js';
13
4
  declare function DrawerRoot({ side, modal, ...props }: Omit<React.ComponentProps<typeof BaseDrawer.Root>, 'swipeDirection'> & {
14
5
  side?: PanelSide;
15
6
  }): React.JSX.Element;
16
- declare const SheetContent: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/dialog").DialogPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & PanelOptions & React.RefAttributes<HTMLDivElement>>;
17
7
  declare const DrawerContent: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/drawer").DrawerPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & PanelOptions & React.RefAttributes<HTMLDivElement>>;
18
- declare function Header({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
19
- declare function Footer({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
20
- declare function SheetTitle({ className, ...props }: React.ComponentProps<typeof BaseDialog.Title>): React.JSX.Element;
21
- declare function SheetDescription({ className, ...props }: React.ComponentProps<typeof BaseDialog.Description>): React.JSX.Element;
22
8
  declare function DrawerTitle({ className, ...props }: React.ComponentProps<typeof BaseDrawer.Title>): React.JSX.Element;
23
9
  declare function DrawerDescription({ className, ...props }: React.ComponentProps<typeof BaseDrawer.Description>): React.JSX.Element;
24
- export declare const Sheet: {
25
- Root: typeof SheetRoot;
26
- Content: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/dialog").DialogPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & PanelOptions & React.RefAttributes<HTMLDivElement>>;
27
- Header: typeof Header;
28
- Body: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
29
- Footer: typeof Footer;
30
- Title: typeof SheetTitle;
31
- Description: typeof SheetDescription;
32
- Backdrop: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogBackdropProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
33
- Close: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogCloseProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
34
- Popup: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
35
- Portal: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
36
- Viewport: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogViewportProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
37
- Trigger: BaseDialog.Trigger;
38
- createHandle: typeof BaseDialog.createHandle;
39
- Handle: typeof BaseDialog.Handle;
40
- };
41
10
  export declare const Drawer: {
42
11
  Root: typeof DrawerRoot;
43
12
  Content: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/drawer").DrawerPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & PanelOptions & React.RefAttributes<HTMLDivElement>>;
@@ -61,6 +30,6 @@ export declare const Drawer: {
61
30
  createHandle: typeof BaseDrawer.createHandle;
62
31
  Handle: typeof BaseDrawer.Handle;
63
32
  };
64
- export { DrawerContent, DrawerDescription, DrawerRoot, DrawerTitle, SheetDescription, SheetRoot, SheetTitle, SheetContent, };
33
+ export { DrawerContent, DrawerDescription, DrawerRoot, DrawerTitle };
65
34
  export declare const DrawerBackdrop: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerBackdropProps, "ref"> & React.RefAttributes<HTMLDivElement>>, DrawerClose: BaseDrawer.Close, DrawerHandle: typeof BaseDrawer.Handle, DrawerIndent: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerIndentProps, "ref"> & React.RefAttributes<HTMLDivElement>>, DrawerIndentBackground: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerIndentBackgroundProps, "ref"> & React.RefAttributes<HTMLDivElement>>, DrawerPopup: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>, DrawerPortal: BaseDrawer.Portal, DrawerProvider: typeof BaseDrawer.Provider, DrawerSwipeArea: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerSwipeAreaProps, "ref"> & React.RefAttributes<HTMLDivElement>>, DrawerTrigger: BaseDrawer.Trigger, DrawerViewport: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerViewportProps, "ref"> & React.RefAttributes<HTMLDivElement>>, DrawerVirtualKeyboardProvider: typeof BaseDrawer.VirtualKeyboardProvider, DrawerPrimitiveContent: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerContentProps, "ref"> & React.RefAttributes<HTMLDivElement>>, DrawerHeader: typeof Header, DrawerBody: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>, DrawerFooter: typeof Footer;
66
- export declare const SheetBackdrop: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogBackdropProps, "ref"> & React.RefAttributes<HTMLDivElement>>, SheetClose: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogCloseProps, "ref"> & React.RefAttributes<HTMLButtonElement>>, SheetHandle: typeof BaseDialog.Handle, SheetPopup: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>, SheetPortal: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>, SheetTrigger: BaseDialog.Trigger, SheetViewport: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/dialog").DialogViewportProps, "ref"> & React.RefAttributes<HTMLDivElement>>, SheetHeader: typeof Header, SheetBody: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>, SheetFooter: typeof Footer;
35
+ export type { PanelSide } from './panel.js';
package/dist/drawer.js ADDED
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Icon } from './icon.js';
5
+ import { skin } from './parts.js';
6
+ import { useComponentSize, normalizeSize } from './sizing.js';
7
+ import { Drawer as BaseDrawer } from '@base-ui/react/drawer';
8
+ import { Body, Footer, Header, } from './panel.js';
9
+ const DrawerSide = /* @__PURE__ */ React.createContext({
10
+ side: 'bottom',
11
+ modal: true,
12
+ });
13
+ function DrawerRoot({ side = 'bottom', modal = true, ...props }) {
14
+ const direction = {
15
+ left: 'left',
16
+ right: 'right',
17
+ top: 'up',
18
+ bottom: 'down',
19
+ };
20
+ return (_jsx(DrawerSide.Provider, { value: { side, modal }, children: _jsx(BaseDrawer.Root, { ...props, modal: modal, swipeDirection: direction[side] }) }));
21
+ }
22
+ const DrawerContent = /* @__PURE__ */ React.forwardRef(function DrawerContent({ size, flush, closeLabel = 'Close panel', className, children, ...props }, ref) {
23
+ const scheme = useComponentSize(size);
24
+ const { side, modal } = React.useContext(DrawerSide);
25
+ const KeyboardProvider = side === 'bottom' ? BaseDrawer.VirtualKeyboardProvider : React.Fragment;
26
+ return (_jsx(KeyboardProvider, { children: _jsx(BaseDrawer.Portal, { children: _jsxs("div", { className: 'pui-panel-layer', "data-ui-size": scheme, children: [modal === true && (_jsx(BaseDrawer.Backdrop, { className: 'pui-panel-backdrop' })), _jsx(BaseDrawer.Viewport, { className: 'pui-panel-viewport', "data-side": side, "data-flush": flush || undefined, children: _jsxs(BaseDrawer.Popup, { ...props, ref: ref, className: skin('pui-panel pui-drawer', className), "data-side": side, "data-size": normalizeSize(size) ?? 'large', "data-flush": flush || undefined, children: [_jsx("div", { className: 'pui-drawer-handle', "aria-hidden": 'true' }), _jsx(BaseDrawer.Close, { className: 'pui-panel-close pui-icon-button', "aria-label": closeLabel, children: _jsx(Icon, { name: 'close' }) }), _jsx(BaseDrawer.Content, { className: 'pui-panel-content', children: children })] }) })] }) }) }));
27
+ });
28
+ function DrawerTitle({ className, ...props }) {
29
+ return (_jsx(BaseDrawer.Title, { ...props, className: skin('pui-panel-title', className) }));
30
+ }
31
+ function DrawerDescription({ className, ...props }) {
32
+ return (_jsx(BaseDrawer.Description, { ...props, className: skin('pui-panel-description', className) }));
33
+ }
34
+ export const Drawer = {
35
+ ...BaseDrawer,
36
+ Root: DrawerRoot,
37
+ Content: DrawerContent,
38
+ PrimitiveContent: BaseDrawer.Content,
39
+ Header,
40
+ Body,
41
+ Footer,
42
+ Title: DrawerTitle,
43
+ Description: DrawerDescription,
44
+ };
45
+ // Flat names for React Server Components, which cannot dot into client exports.
46
+ export { DrawerContent, DrawerDescription, DrawerRoot, DrawerTitle };
47
+ export const { Backdrop: DrawerBackdrop, Close: DrawerClose, Handle: DrawerHandle, Indent: DrawerIndent, IndentBackground: DrawerIndentBackground, Popup: DrawerPopup, Portal: DrawerPortal, Provider: DrawerProvider, SwipeArea: DrawerSwipeArea, Trigger: DrawerTrigger, Viewport: DrawerViewport, VirtualKeyboardProvider: DrawerVirtualKeyboardProvider, PrimitiveContent: DrawerPrimitiveContent, Header: DrawerHeader, Body: DrawerBody, Footer: DrawerFooter, } = Drawer;
@@ -0,0 +1,29 @@
1
+ import * as React from 'react';
2
+ export declare const EmptyState: {
3
+ Root: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
4
+ size?: import("./sizing.js").ComponentSize;
5
+ } & React.RefAttributes<HTMLDivElement>>;
6
+ Icon: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
7
+ size?: import("./sizing.js").ComponentSize;
8
+ } & React.RefAttributes<HTMLDivElement>>;
9
+ Title: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>, "ref"> & {
10
+ level?: 2 | 3 | 4 | 5 | 6;
11
+ } & React.RefAttributes<HTMLHeadingElement>>;
12
+ Description: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "ref">, "size"> & {
13
+ size?: import("./sizing.js").ComponentSize;
14
+ } & React.RefAttributes<HTMLParagraphElement>>;
15
+ Actions: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
16
+ size?: import("./sizing.js").ComponentSize;
17
+ } & React.RefAttributes<HTMLDivElement>>;
18
+ };
19
+ export declare const EmptyStateRoot: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
20
+ size?: import("./sizing.js").ComponentSize;
21
+ } & React.RefAttributes<HTMLDivElement>>, EmptyStateIcon: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
22
+ size?: import("./sizing.js").ComponentSize;
23
+ } & React.RefAttributes<HTMLDivElement>>, EmptyStateTitle: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>, "ref"> & {
24
+ level?: 2 | 3 | 4 | 5 | 6;
25
+ } & React.RefAttributes<HTMLHeadingElement>>, EmptyStateDescription: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "ref">, "size"> & {
26
+ size?: import("./sizing.js").ComponentSize;
27
+ } & React.RefAttributes<HTMLParagraphElement>>, EmptyStateActions: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
28
+ size?: import("./sizing.js").ComponentSize;
29
+ } & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import { part, cx } from './parts.js';
4
+ const EmptyTitle = /* @__PURE__ */ React.forwardRef(function EmptyTitle({ level = 3, className, ...props }, ref) {
5
+ return React.createElement(`h${level}`, {
6
+ ...props,
7
+ ref,
8
+ className: cx('pui-empty-title', className),
9
+ });
10
+ });
11
+ export const EmptyState = {
12
+ Root: /* @__PURE__ */ part('div', 'pui-empty'),
13
+ Icon: /* @__PURE__ */ part('div', 'pui-empty-icon'),
14
+ Title: EmptyTitle,
15
+ Description: /* @__PURE__ */ part('p', 'pui-empty-description'),
16
+ Actions: /* @__PURE__ */ part('div', 'pui-empty-actions'),
17
+ };
18
+ // Flat names for React Server Components, which cannot dot into client exports.
19
+ export const { Root: EmptyStateRoot, Icon: EmptyStateIcon, Title: EmptyStateTitle, Description: EmptyStateDescription, Actions: EmptyStateActions, } = EmptyState;
@@ -0,0 +1,42 @@
1
+ import * as React from 'react';
2
+ declare const FieldRoot: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
3
+ size?: import("./sizing.js").ComponentSize;
4
+ } & React.RefAttributes<HTMLDivElement>>;
5
+ declare const FieldLabel: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldLabelProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
6
+ size?: import("./sizing.js").ComponentSize;
7
+ } & React.RefAttributes<HTMLElement>>;
8
+ declare const FieldControl: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldControlProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
9
+ size?: import("./sizing.js").ComponentSize;
10
+ } & React.RefAttributes<HTMLElement>>;
11
+ declare const FieldDescription: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldDescriptionProps, "ref"> & React.RefAttributes<HTMLParagraphElement>, "ref">, "size"> & {
12
+ size?: import("./sizing.js").ComponentSize;
13
+ } & React.RefAttributes<HTMLParagraphElement>>;
14
+ declare const FieldError: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldErrorProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
15
+ size?: import("./sizing.js").ComponentSize;
16
+ } & React.RefAttributes<HTMLDivElement>>;
17
+ declare const FieldItem: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldItemProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
18
+ size?: import("./sizing.js").ComponentSize;
19
+ } & React.RefAttributes<HTMLDivElement>>;
20
+ export declare const Field: {
21
+ Root: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
22
+ size?: import("./sizing.js").ComponentSize;
23
+ } & React.RefAttributes<HTMLDivElement>>;
24
+ Label: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldLabelProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
25
+ size?: import("./sizing.js").ComponentSize;
26
+ } & React.RefAttributes<HTMLElement>>;
27
+ Control: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldControlProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
28
+ size?: import("./sizing.js").ComponentSize;
29
+ } & React.RefAttributes<HTMLElement>>;
30
+ Description: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldDescriptionProps, "ref"> & React.RefAttributes<HTMLParagraphElement>, "ref">, "size"> & {
31
+ size?: import("./sizing.js").ComponentSize;
32
+ } & React.RefAttributes<HTMLParagraphElement>>;
33
+ Error: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldErrorProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
34
+ size?: import("./sizing.js").ComponentSize;
35
+ } & React.RefAttributes<HTMLDivElement>>;
36
+ Item: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/field").FieldItemProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
37
+ size?: import("./sizing.js").ComponentSize;
38
+ } & React.RefAttributes<HTMLDivElement>>;
39
+ Validity: React.FC<import("@base-ui/react/field").FieldValidityProps>;
40
+ };
41
+ export { FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldRoot, };
42
+ export declare const FieldValidity: React.FC<import("@base-ui/react/field").FieldValidityProps>;
package/dist/field.js ADDED
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { Field as BaseField } from '@base-ui/react/field';
3
+ import { part } from './parts.js';
4
+ const FieldRoot = /* @__PURE__ */ part(BaseField.Root, 'pui-field');
5
+ const FieldLabel = /* @__PURE__ */ part(BaseField.Label, 'pui-field-label');
6
+ const FieldControl = /* @__PURE__ */ part(BaseField.Control, 'pui-input');
7
+ const FieldDescription = /* @__PURE__ */ part(BaseField.Description, 'pui-field-description');
8
+ const FieldError = /* @__PURE__ */ part(BaseField.Error, 'pui-field-error');
9
+ const FieldItem = /* @__PURE__ */ part(BaseField.Item, 'pui-field-item');
10
+ export const Field = {
11
+ ...BaseField,
12
+ Root: FieldRoot,
13
+ Label: FieldLabel,
14
+ Control: FieldControl,
15
+ Description: FieldDescription,
16
+ Error: FieldError,
17
+ Item: FieldItem,
18
+ };
19
+ // Flat names for React Server Components, which cannot dot into client exports.
20
+ export { FieldControl, FieldDescription, FieldError, FieldItem, FieldLabel, FieldRoot, };
21
+ export const { Validity: FieldValidity } = Field;
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ export declare const Fieldset: {
3
+ Root: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/fieldset").FieldsetRootProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
4
+ size?: import("./sizing.js").ComponentSize;
5
+ } & React.RefAttributes<HTMLElement>>;
6
+ Legend: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/fieldset").FieldsetLegendProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
7
+ size?: import("./sizing.js").ComponentSize;
8
+ } & React.RefAttributes<HTMLDivElement>>;
9
+ };
10
+ export declare const FieldsetLegend: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/fieldset").FieldsetLegendProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
11
+ size?: import("./sizing.js").ComponentSize;
12
+ } & React.RefAttributes<HTMLDivElement>>, FieldsetRoot: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/fieldset").FieldsetRootProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
13
+ size?: import("./sizing.js").ComponentSize;
14
+ } & React.RefAttributes<HTMLElement>>;
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { Fieldset as BaseFieldset } from '@base-ui/react/fieldset';
3
+ import { part } from './parts.js';
4
+ export const Fieldset = {
5
+ ...BaseFieldset,
6
+ Root: /* @__PURE__ */ part(BaseFieldset.Root, 'pui-fieldset'),
7
+ Legend: /* @__PURE__ */ part(BaseFieldset.Legend, 'pui-fieldset-legend'),
8
+ };
9
+ // Flat names for React Server Components, which cannot dot into client exports.
10
+ export const { Legend: FieldsetLegend, Root: FieldsetRoot } = Fieldset;
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { Field } from './forms.js';
2
+ import { Field } from './field.js';
3
3
  export type UploadState = 'ready' | 'uploading' | 'success' | 'error' | 'canceled';
4
4
  export type UploadTransport = (file: File, context: {
5
5
  signal: AbortSignal;
@@ -29,6 +29,8 @@ export type FileUploadLabels = {
29
29
  failed: (file: File) => string;
30
30
  reset: string;
31
31
  progress: (file: File) => string;
32
+ /** Shown when an upload fails and getUploadError gives no message. */
33
+ uploadError: string;
32
34
  };
33
35
  export type FileUploadProps = Omit<React.ComponentPropsWithoutRef<typeof Field.Root>, 'children' | 'name' | 'onDragEnter' | 'onDragLeave' | 'onDragOver' | 'onDrop'> & Pick<React.HTMLAttributes<HTMLDivElement>, 'onDragEnter' | 'onDragLeave' | 'onDragOver' | 'onDrop'> & {
34
36
  label: React.ReactNode;
@@ -1,10 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from 'react';
4
- import { Field } from './forms.js';
4
+ import { Icon } from './icon.js';
5
+ import { Field } from './field.js';
5
6
  import { Button } from './button.js';
6
- import { Progress } from './feedback.js';
7
- import { StatusBadge } from './status.js';
7
+ import { Progress } from './progress.js';
8
+ import { StatusBadge } from './badge.js';
8
9
  import { skin } from './parts.js';
9
10
  import { useResetValue, useRootRef } from './form-state.js';
10
11
  const labelsDefault = {
@@ -28,6 +29,7 @@ const labelsDefault = {
28
29
  failed: (file) => `${file.name}: upload failed.`,
29
30
  reset: 'Files reset.',
30
31
  progress: (file) => `${file.name} upload progress`,
32
+ uploadError: 'Upload failed. Try again.',
31
33
  };
32
34
  function signature(file) {
33
35
  return JSON.stringify([file.name, file.size, file.type, file.lastModified]);
@@ -253,7 +255,7 @@ export const FileUpload = /* @__PURE__ */ React.forwardRef(function FileUpload({
253
255
  }
254
256
  catch (error) {
255
257
  if (current()) {
256
- let message = 'Upload failed. Try again.';
258
+ let message = labels.uploadError;
257
259
  try {
258
260
  message = getUploadError?.(error) || message;
259
261
  }
@@ -302,7 +304,7 @@ export const FileUpload = /* @__PURE__ */ React.forwardRef(function FileUpload({
302
304
  event.preventBaseUIHandler();
303
305
  select(Array.from(event.currentTarget.files ?? []), 'select');
304
306
  }
305
- } }), _jsxs("label", { htmlFor: inputId, className: 'pui-button pui-file-trigger', "data-variant": 'outline', "data-disabled": disabled || undefined, children: [_jsx("svg", { width: '16', height: '16', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '1.6', "aria-hidden": 'true', children: _jsx("path", { d: 'M12 16V3m-5 5 5-5 5 5M4 16v5h16v-5' }) }), labels.choose] }), _jsx("p", { className: 'pui-file-drop-hint', children: labels.drop })] }), _jsx("div", { id: errorId, role: 'alert', className: 'pui-file-errors', children: rejections.length > 0 && (_jsx("ul", { children: rejections.map((rejection, index) => (_jsx("li", { children: labels.rejection(rejection) }, index))) })) }), _jsx(Field.Error, {}), files.length > 0 && (_jsx("ul", { className: 'pui-file-list', role: 'list', children: files.map((file) => {
307
+ } }), _jsxs("label", { htmlFor: inputId, className: 'pui-button pui-file-trigger', "data-variant": 'outline', "data-disabled": disabled || undefined, children: [_jsx(Icon, { name: 'upload' }), labels.choose] }), _jsx("p", { className: 'pui-file-drop-hint', children: labels.drop })] }), _jsx("div", { id: errorId, role: 'alert', className: 'pui-file-errors', children: rejections.length > 0 && (_jsx("ul", { children: rejections.map((rejection, index) => (_jsx("li", { children: labels.rejection(rejection) }, index))) })) }), _jsx(Field.Error, {}), files.length > 0 && (_jsx("ul", { className: 'pui-file-list', role: 'list', children: files.map((file) => {
306
308
  const state = metadata.get(file) ?? {
307
309
  status: 'ready',
308
310
  progress: null,
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from 'react';
4
- const cx = (base, extra) => [base, extra].filter(Boolean).join(' ');
4
+ import { cx } from './parts.js';
5
5
  /** Layout only: filtering, routing and async results remain controlled by the caller. */
6
6
  const Root = /* @__PURE__ */ React.forwardRef(function FilterBarRoot({ label, className, ...props }, ref) {
7
7
  return (_jsx("form", { ...props, ref: ref, role: 'search', "aria-label": label, className: cx('pui-filter-bar', className) }));
package/dist/form.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { Form as BaseForm } from '@base-ui/react/form';
2
+ export declare function Form<Values extends Record<string, unknown> = Record<string, unknown>>({ className, ...props }: BaseForm.Props<Values>): import("react").JSX.Element;
package/dist/form.js ADDED
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Form as BaseForm } from '@base-ui/react/form';
4
+ import { skin } from './parts.js';
5
+ export function Form({ className, ...props }) {
6
+ return _jsx(BaseForm, { ...props, className: skin('pui-form', className) });
7
+ }
@@ -0,0 +1,25 @@
1
+ /** Number formatting shared by every screen: one place decides the locale, the sign and
2
+ * the precision of values, money, percentages and compact figures. Pass `locale` when
3
+ * rendering on the server, so the client formats the same text. */
4
+ export type NumberFormatOptions = {
5
+ /** A BCP 47 locale such as 'ko-KR'. Defaults to the runtime's. */
6
+ locale?: string | string[];
7
+ /** Digits after the decimal point: an exact count, or a [minimum, maximum] range. */
8
+ precision?: number | readonly [number, number];
9
+ /** Shows + before gains and − before losses. Zero stays unsigned. */
10
+ signed?: boolean;
11
+ /** Shortens large values: 1.2K and 3.4M, or 1.2만 in Korean. */
12
+ compact?: boolean;
13
+ /** Text for a missing value: null, undefined or a non-finite number. */
14
+ missing?: string;
15
+ };
16
+ /** The default text for a missing value. Zero is a value; missing is not. */
17
+ export declare const missingValue = "\u2014";
18
+ /** A plain number: 1,234.5. */
19
+ export declare function formatNumber(value: number | null | undefined, options?: NumberFormatOptions): string;
20
+ /** An amount of money in an ISO 4217 currency: ₩1,200 or $12.50. The currency sets the
21
+ * default precision. */
22
+ export declare function formatCurrency(value: number | null | undefined, currency: string, options?: NumberFormatOptions): string;
23
+ /** A ratio as a percentage: 0.032 is 3.2%. Up to one decimal place unless `precision`
24
+ * says otherwise. */
25
+ export declare function formatPercent(value: number | null | undefined, options?: NumberFormatOptions): string;
package/dist/format.js ADDED
@@ -0,0 +1,42 @@
1
+ /** The default text for a missing value. Zero is a value; missing is not. */
2
+ export const missingValue = '—';
3
+ const cache = new Map();
4
+ function formatter(locale, options) {
5
+ const key = JSON.stringify([locale ?? null, options]);
6
+ let format = cache.get(key);
7
+ if (!format) {
8
+ format = new Intl.NumberFormat(locale, options);
9
+ cache.set(key, format);
10
+ }
11
+ return format;
12
+ }
13
+ function digits(precision) {
14
+ if (precision === undefined)
15
+ return {};
16
+ const [minimumFractionDigits, maximumFractionDigits] = typeof precision === 'number' ? [precision, precision] : precision;
17
+ return { minimumFractionDigits, maximumFractionDigits };
18
+ }
19
+ function format(value, base, { locale, precision, signed, compact, missing = missingValue, }) {
20
+ if (typeof value !== 'number' || !Number.isFinite(value))
21
+ return missing;
22
+ return formatter(locale, {
23
+ ...base,
24
+ ...(compact ? { notation: 'compact' } : {}),
25
+ ...(signed ? { signDisplay: 'exceptZero' } : {}),
26
+ ...digits(precision),
27
+ }).format(value);
28
+ }
29
+ /** A plain number: 1,234.5. */
30
+ export function formatNumber(value, options = {}) {
31
+ return format(value, {}, options);
32
+ }
33
+ /** An amount of money in an ISO 4217 currency: ₩1,200 or $12.50. The currency sets the
34
+ * default precision. */
35
+ export function formatCurrency(value, currency, options = {}) {
36
+ return format(value, { style: 'currency', currency }, options);
37
+ }
38
+ /** A ratio as a percentage: 0.032 is 3.2%. Up to one decimal place unless `precision`
39
+ * says otherwise. */
40
+ export function formatPercent(value, options = {}) {
41
+ return format(value, { style: 'percent' }, { precision: [0, 1], ...options });
42
+ }
package/dist/icon.d.ts CHANGED
@@ -8,16 +8,27 @@ declare const shapes: {
8
8
  alert: React.JSX.Element;
9
9
  warning: React.JSX.Element;
10
10
  menu: React.JSX.Element;
11
+ sidebar: React.JSX.Element;
11
12
  more: React.JSX.Element;
12
13
  sun: React.JSX.Element;
13
14
  moon: React.JSX.Element;
14
15
  monitor: React.JSX.Element;
16
+ minus: React.JSX.Element;
17
+ 'minus-circle': React.JSX.Element;
18
+ clock: React.JSX.Element;
15
19
  'chevron-down': React.JSX.Element;
16
20
  'chevron-forward': React.JSX.Element;
21
+ 'chevron-back': React.JSX.Element;
17
22
  'arrow-back': React.JSX.Element;
23
+ 'arrow-up': React.JSX.Element;
24
+ 'arrow-down': React.JSX.Element;
25
+ sort: React.JSX.Element;
18
26
  'external-link': React.JSX.Element;
19
27
  copy: React.JSX.Element;
20
28
  play: React.JSX.Element;
29
+ upload: React.JSX.Element;
30
+ calendar: React.JSX.Element;
31
+ user: React.JSX.Element;
21
32
  settings: React.JSX.Element;
22
33
  };
23
34
  export type IconName = keyof typeof shapes;
package/dist/icon.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from 'react';
4
+ import { cx } from './parts.js';
4
5
  const shapes = {
5
6
  search: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: '10.5', cy: '10.5', r: '6.5' }), _jsx("path", { d: 'm16 16 4 4' })] })),
6
7
  plus: _jsx("path", { d: 'M12 5v14M5 12h14' }),
@@ -10,22 +11,37 @@ const shapes = {
10
11
  alert: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: '12', cy: '12', r: '9' }), _jsx("path", { d: 'M12 7v6m0 3v1' })] })),
11
12
  warning: (_jsxs(_Fragment, { children: [_jsx("path", { d: 'm12 3 10 18H2L12 3Z' }), _jsx("path", { d: 'M12 9v4m0 3v1' })] })),
12
13
  menu: _jsx("path", { d: 'M4 6h16M4 12h16M4 18h16' }),
14
+ sidebar: (_jsxs(_Fragment, { children: [_jsx("rect", { x: '3', y: '4', width: '18', height: '16', rx: '2' }), _jsx("path", { d: 'M9 4v16' })] })),
13
15
  more: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: '5', cy: '12', r: '1' }), _jsx("circle", { cx: '12', cy: '12', r: '1' }), _jsx("circle", { cx: '19', cy: '12', r: '1' })] })),
14
16
  sun: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: '12', cy: '12', r: '4' }), _jsx("path", { d: 'M12 2v2m0 16v2M2 12h2m16 0h2M5 5l1.5 1.5m11 11L19 19M5 19l1.5-1.5m11-11L19 5' })] })),
15
17
  moon: _jsx("path", { d: 'M20.5 13.2A8.5 8.5 0 0 1 10.8 3.5 8.5 8.5 0 1 0 20.5 13.2Z' }),
16
18
  monitor: (_jsxs(_Fragment, { children: [_jsx("rect", { x: '3', y: '4', width: '18', height: '13', rx: '2' }), _jsx("path", { d: 'M8 21h8m-4-4v4' })] })),
19
+ minus: _jsx("path", { d: 'M5 12h14' }),
20
+ 'minus-circle': (_jsxs(_Fragment, { children: [_jsx("circle", { cx: '12', cy: '12', r: '9' }), _jsx("path", { d: 'M8 12h8' })] })),
21
+ clock: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: '12', cy: '12', r: '9' }), _jsx("path", { d: 'M12 7v6l4 2' })] })),
17
22
  'chevron-down': _jsx("path", { d: 'm7 10 5 5 5-5' }),
18
23
  'chevron-forward': _jsx("path", { d: 'm9 6 6 6-6 6' }),
24
+ 'chevron-back': _jsx("path", { d: 'm15 6-6 6 6 6' }),
19
25
  'arrow-back': _jsx("path", { d: 'M20 12H4m7-7-7 7 7 7' }),
26
+ 'arrow-up': _jsx("path", { d: 'M12 19V5m-6 6 6-6 6 6' }),
27
+ 'arrow-down': _jsx("path", { d: 'M12 5v14m-6-6 6 6 6-6' }),
28
+ sort: _jsx("path", { d: 'm8 9 4-4 4 4m-8 6 4 4 4-4' }),
20
29
  'external-link': (_jsx(_Fragment, { children: _jsx("path", { d: 'M14 3h7v7m0-7L10 14M10 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-5' }) })),
21
30
  copy: (_jsxs(_Fragment, { children: [_jsx("rect", { x: '8', y: '8', width: '12', height: '13', rx: '2' }), _jsx("path", { d: 'M16 8V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h3' })] })),
22
31
  play: _jsx("path", { d: 'm7 3 14 9-14 9V3Z' }),
32
+ upload: _jsx("path", { d: 'M12 16V3m-5 5 5-5 5 5M4 16v5h16v-5' }),
33
+ calendar: (_jsxs(_Fragment, { children: [_jsx("rect", { x: '3', y: '5', width: '18', height: '16', rx: '3' }), _jsx("path", { d: 'M7 3v4m10-4v4M3 11h18m-12 4h2' })] })),
34
+ user: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: '12', cy: '8', r: '4' }), _jsx("path", { d: 'M4 21v-2a8 8 0 0 1 16 0v2' })] })),
23
35
  settings: (_jsx(_Fragment, { children: _jsx("path", { d: 'M4 6h16M4 12h16M4 18h16M9 3v6m6 0v6m-6 0v6' }) })),
24
36
  };
25
37
  export const iconNames = Object.keys(shapes);
38
+ // These point along the reading direction, so they mirror in right-to-left text.
39
+ const directional = new Set([
40
+ 'chevron-forward',
41
+ 'chevron-back',
42
+ 'arrow-back',
43
+ ]);
26
44
  /** Static SVG only. Actions, focus, accessible button names and hit targets belong to the parent control. */
27
45
  export const Icon = /* @__PURE__ */ React.forwardRef(function Icon({ name, size = 'sm', decorative = true, label, className, ...props }, ref) {
28
- return (_jsx("svg", { ...props, ref: ref, className: ['pui-icon', className].filter(Boolean).join(' '), "data-size": size, "data-directional": name === 'chevron-forward' || name === 'arrow-back'
29
- ? 'true'
30
- : undefined, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeLinecap: 'round', strokeLinejoin: 'round', focusable: 'false', "aria-hidden": decorative ? true : undefined, role: decorative ? undefined : 'img', "aria-label": decorative ? undefined : label, children: shapes[name] }));
46
+ return (_jsx("svg", { ...props, ref: ref, className: cx('pui-icon', className), "data-size": size, "data-directional": directional.has(name) ? 'true' : undefined, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeLinecap: 'round', strokeLinejoin: 'round', focusable: 'false', "aria-hidden": decorative ? true : undefined, role: decorative ? undefined : 'img', "aria-label": decorative ? undefined : label, children: shapes[name] }));
31
47
  });