@surflane/ui 0.3.0 → 0.5.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 (151) hide show
  1. package/README.md +18 -8
  2. package/dist/accordion.d.ts +26 -0
  3. package/dist/accordion.js +27 -0
  4. package/dist/alert-dialog.d.ts +31 -0
  5. package/dist/alert-dialog.js +22 -0
  6. package/dist/app-shell.js +17 -17
  7. package/dist/{input-extensions.d.ts → autocomplete.d.ts} +4 -42
  8. package/dist/{input-extensions.js → autocomplete.js} +12 -31
  9. package/dist/avatar.d.ts +24 -0
  10. package/dist/avatar.js +24 -0
  11. package/dist/badge.d.ts +20 -0
  12. package/dist/badge.js +16 -0
  13. package/dist/breadcrumbs.d.ts +13 -0
  14. package/dist/breadcrumbs.js +31 -0
  15. package/dist/button.d.ts +11 -0
  16. package/dist/button.js +28 -5
  17. package/dist/{content.d.ts → card.d.ts} +6 -24
  18. package/dist/card.js +26 -0
  19. package/dist/chart.d.ts +19 -0
  20. package/dist/chart.js +29 -8
  21. package/dist/checkbox-group.d.ts +2 -0
  22. package/dist/checkbox-group.js +16 -0
  23. package/dist/checkbox.d.ts +9 -0
  24. package/dist/checkbox.js +29 -0
  25. package/dist/choice-label.d.ts +25 -0
  26. package/dist/choice-label.js +14 -0
  27. package/dist/choice.d.ts +7 -0
  28. package/dist/choice.js +3 -0
  29. package/dist/code.d.ts +21 -0
  30. package/dist/{content.js → code.js} +10 -32
  31. package/dist/collapsible.d.ts +18 -0
  32. package/dist/collapsible.js +21 -0
  33. package/dist/{advanced-forms.d.ts → combobox.d.ts} +5 -25
  34. package/dist/combobox.js +57 -0
  35. package/dist/{context-overlays.d.ts → context-menu.d.ts} +6 -28
  36. package/dist/context-menu.js +30 -0
  37. package/dist/date-picker.js +3 -2
  38. package/dist/dialog.d.ts +6 -24
  39. package/dist/dialog.js +9 -21
  40. package/dist/{panels.d.ts → drawer.d.ts} +3 -34
  41. package/dist/drawer.js +47 -0
  42. package/dist/empty-state.d.ts +29 -0
  43. package/dist/empty-state.js +19 -0
  44. package/dist/field.d.ts +42 -0
  45. package/dist/field.js +21 -0
  46. package/dist/fieldset.d.ts +14 -0
  47. package/dist/fieldset.js +10 -0
  48. package/dist/file-upload.d.ts +3 -1
  49. package/dist/file-upload.js +8 -6
  50. package/dist/filter-bar.js +6 -6
  51. package/dist/form.d.ts +2 -0
  52. package/dist/form.js +7 -0
  53. package/dist/icon.d.ts +10 -0
  54. package/dist/icon.js +19 -2
  55. package/dist/index.d.ts +57 -31
  56. package/dist/index.js +71 -31
  57. package/dist/{messages.d.ts → inline-message.d.ts} +0 -28
  58. package/dist/inline-message.js +23 -0
  59. package/dist/input.js +3 -3
  60. package/dist/{foundations.d.ts → layout.d.ts} +5 -23
  61. package/dist/layout.js +40 -0
  62. package/dist/link.d.ts +6 -0
  63. package/dist/link.js +17 -0
  64. package/dist/list.d.ts +33 -0
  65. package/dist/list.js +21 -0
  66. package/dist/markdown.js +7 -7
  67. package/dist/menu.d.ts +7 -5
  68. package/dist/menu.js +24 -20
  69. package/dist/menubar.d.ts +4 -0
  70. package/dist/menubar.js +4 -0
  71. package/dist/meter.d.ts +29 -0
  72. package/dist/meter.js +13 -0
  73. package/dist/native-select.d.ts +8 -0
  74. package/dist/native-select.js +54 -0
  75. package/dist/navigation-menu.js +14 -11
  76. package/dist/number-field.d.ts +23 -0
  77. package/dist/number-field.js +33 -0
  78. package/dist/otp-field.js +4 -4
  79. package/dist/page-header.d.ts +12 -0
  80. package/dist/page-header.js +9 -0
  81. package/dist/pagination.js +4 -5
  82. package/dist/panel.d.ts +13 -0
  83. package/dist/panel.js +13 -0
  84. package/dist/parts.d.ts +22 -1
  85. package/dist/parts.js +40 -7
  86. package/dist/popover.d.ts +23 -6
  87. package/dist/popover.js +17 -7
  88. package/dist/preview-card.d.ts +29 -0
  89. package/dist/preview-card.js +27 -0
  90. package/dist/progress.d.ts +29 -0
  91. package/dist/progress.js +13 -0
  92. package/dist/radio-group.d.ts +16 -0
  93. package/dist/radio-group.js +31 -0
  94. package/dist/scroll-area.js +4 -5
  95. package/dist/select.d.ts +8 -8
  96. package/dist/select.js +19 -53
  97. package/dist/separator.d.ts +4 -0
  98. package/dist/separator.js +8 -0
  99. package/dist/sheet.d.ts +29 -0
  100. package/dist/sheet.js +39 -0
  101. package/dist/sizing.js +1 -1
  102. package/dist/skeleton.d.ts +8 -0
  103. package/dist/skeleton.js +8 -0
  104. package/dist/slider.d.ts +40 -0
  105. package/dist/slider.js +27 -0
  106. package/dist/spinner.d.ts +13 -0
  107. package/dist/spinner.js +10 -0
  108. package/dist/status.d.ts +1 -19
  109. package/dist/status.js +10 -14
  110. package/dist/switch.d.ts +13 -0
  111. package/dist/switch.js +25 -0
  112. package/dist/syntax-context.d.ts +7 -0
  113. package/dist/syntax-context.js +4 -0
  114. package/dist/syntax-highlighter.d.ts +4 -1
  115. package/dist/syntax-highlighter.js +13 -6
  116. package/dist/syntax-highlighting.d.ts +8 -0
  117. package/dist/syntax-highlighting.js +12 -0
  118. package/dist/{data.d.ts → table.d.ts} +8 -32
  119. package/dist/table.js +67 -0
  120. package/dist/tabs.d.ts +29 -0
  121. package/dist/tabs.js +13 -0
  122. package/dist/textarea.d.ts +7 -0
  123. package/dist/textarea.js +12 -0
  124. package/dist/toast.js +18 -17
  125. package/dist/toggle-group.d.ts +5 -0
  126. package/dist/toggle-group.js +7 -0
  127. package/dist/toggle.d.ts +7 -0
  128. package/dist/toggle.js +9 -0
  129. package/dist/{commands.d.ts → toolbar.d.ts} +0 -13
  130. package/dist/toolbar.js +14 -0
  131. package/dist/tooltip.d.ts +3 -2
  132. package/dist/tooltip.js +2 -2
  133. package/dist/tree.js +4 -2
  134. package/dist/typography.d.ts +12 -0
  135. package/dist/typography.js +14 -0
  136. package/package.json +286 -21
  137. package/src/all.css +8 -0
  138. package/src/styles.css +3745 -3629
  139. package/dist/advanced-forms.js +0 -93
  140. package/dist/commands.js +0 -27
  141. package/dist/context-overlays.js +0 -50
  142. package/dist/data.js +0 -82
  143. package/dist/feedback.d.ts +0 -76
  144. package/dist/feedback.js +0 -35
  145. package/dist/forms.d.ts +0 -91
  146. package/dist/forms.js +0 -109
  147. package/dist/foundations.js +0 -55
  148. package/dist/messages.js +0 -38
  149. package/dist/navigation.d.ts +0 -107
  150. package/dist/navigation.js +0 -108
  151. package/dist/panels.js +0 -99
package/dist/markdown.js CHANGED
@@ -3,8 +3,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from 'react';
4
4
  import ReactMarkdown from 'react-markdown';
5
5
  import remarkGfm from 'remark-gfm';
6
- import { CodeBlock } from './content.js';
7
- import { Table } from './data.js';
6
+ import { CodeBlock } from './code.js';
7
+ import { Table } from './table.js';
8
+ import { cx } from './parts.js';
8
9
  function text(node) {
9
10
  return 'value' in node
10
11
  ? node.value
@@ -20,7 +21,7 @@ function visit(node, callback) {
20
21
  }
21
22
  /** CommonMark + GFM. HTML stays disabled, URLs use react-markdown's safe default.
22
23
  * Fetching, permissions, frontmatter, MDX and script execution are caller concerns. */
23
- export const Markdown = React.forwardRef(function Markdown({ source, label = 'Markdown content', headingLevel = 2, codeWrap = false, className, ...props }, ref) {
24
+ export const Markdown = /* @__PURE__ */ React.forwardRef(function Markdown({ source, label = 'Markdown content', headingLevel = 2, codeWrap = false, className, ...props }, ref) {
24
25
  const prefix = `md-${React.useId().replace(/[^a-zA-Z0-9_-]/g, '')}`;
25
26
  const headings = React.useMemo(() => () => (tree) => {
26
27
  const counts = new Map();
@@ -91,7 +92,8 @@ export const Markdown = React.forwardRef(function Markdown({ source, label = 'Ma
91
92
  const child = React.Children.toArray(children)[0];
92
93
  if (!React.isValidElement(child))
93
94
  return _jsx("pre", { children: children });
94
- const language = /(?:^|\s)language-([^\s]+)/.exec(child.props.className ?? '')?.[1] ?? 'text';
95
+ const language = /(?:^|\s)language-([^\s]+)/.exec(child.props.className ?? '')?.[1] ??
96
+ 'text';
95
97
  const code = String(child.props.children ?? '').replace(/\n$/, '');
96
98
  return (_jsx(CodeBlock, { code: code, language: language, wrap: codeWrap, label: `${label}: code at line ${node?.position?.start.line ?? 1}` }));
97
99
  },
@@ -115,7 +117,5 @@ export const Markdown = React.forwardRef(function Markdown({ source, label = 'Ma
115
117
  },
116
118
  };
117
119
  }, [headingLevel, label, codeWrap]);
118
- return (_jsx("div", { ...props, ref: ref, role: 'article', className: ['pui-prose pui-markdown', className]
119
- .filter(Boolean)
120
- .join(' '), "aria-label": label, children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], rehypePlugins: [headings], remarkRehypeOptions: { clobberPrefix: `${prefix}-` }, skipHtml: true, components: components, children: source }) }));
120
+ return (_jsx("div", { ...props, ref: ref, role: 'article', className: cx('pui-prose pui-markdown', className), "aria-label": label, children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], rehypePlugins: [headings], remarkRehypeOptions: { clobberPrefix: `${prefix}-` }, skipHtml: true, components: components, children: source }) }));
121
121
  });
package/dist/menu.d.ts CHANGED
@@ -6,10 +6,13 @@ declare const MenuPopup: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("
6
6
  declare const MenuPositioner: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menu").MenuPositionerProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
7
7
  size?: import("./sizing.js").ComponentSize;
8
8
  } & React.RefAttributes<HTMLDivElement>>;
9
- declare const MenuContent: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/menu").MenuPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & Pick<Omit<Omit<import("@base-ui/react/menu").MenuPositionerProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "align" | "side" | "sideOffset" | "collisionPadding"> & React.RefAttributes<HTMLDivElement>>;
9
+ declare const MenuContent: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/menu").MenuPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & Pick<Omit<Omit<import("@base-ui/react/menu").MenuPositionerProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "side" | "align" | "sideOffset" | "collisionPadding"> & React.RefAttributes<HTMLDivElement>>;
10
10
  declare const MenuTrigger: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuTriggerProps<unknown> & React.RefAttributes<HTMLElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
11
+ /** Content brings its own portal; Portal stays for wrapping it, or raw parts. */
12
+ declare const MenuPortal: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
11
13
  export declare const Menu: {
12
- Content: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/menu").MenuPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & Pick<Omit<Omit<import("@base-ui/react/menu").MenuPositionerProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "align" | "side" | "sideOffset" | "collisionPadding"> & React.RefAttributes<HTMLDivElement>>;
14
+ Portal: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
15
+ Content: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/menu").MenuPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & Pick<Omit<Omit<import("@base-ui/react/menu").MenuPositionerProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "side" | "align" | "sideOffset" | "collisionPadding"> & React.RefAttributes<HTMLDivElement>>;
13
16
  Popup: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menu").MenuPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
14
17
  size?: import("./sizing.js").ComponentSize;
15
18
  } & React.RefAttributes<HTMLDivElement>>;
@@ -46,7 +49,6 @@ export declare const Menu: {
46
49
  Arrow: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
47
50
  Backdrop: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuBackdropProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
48
51
  Group: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
49
- Portal: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
50
52
  RadioGroup: React.NamedExoticComponent<Omit<import("@base-ui/react/menu").MenuRadioGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
51
53
  Root: typeof BaseMenu.Root;
52
54
  SubmenuRoot: typeof BaseMenu.SubmenuRoot;
@@ -59,7 +61,7 @@ export declare const Menu: {
59
61
  Empty: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuEmptyProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
60
62
  useFilter: typeof BaseMenu.useFilter;
61
63
  };
62
- export { MenuPopup, MenuPositioner, MenuTrigger, MenuContent };
64
+ export { MenuPopup, MenuPositioner, MenuTrigger, MenuContent, MenuPortal };
63
65
  export declare const MenuArrow: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuBackdrop: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuBackdropProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuCheckboxItem: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menu").MenuCheckboxItemProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
64
66
  size?: import("./sizing.js").ComponentSize;
65
67
  } & React.RefAttributes<HTMLDivElement>>, MenuCheckboxItemIndicator: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/menu").MenuCheckboxItemIndicatorProps, "ref"> & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>, MenuClear: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuClearProps, "ref"> & React.RefAttributes<HTMLButtonElement>>, MenuEmpty: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuEmptyProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuFilterProvider: typeof BaseMenu.FilterProvider, MenuGroup: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuGroupLabel: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menu").MenuGroupLabelProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
@@ -70,7 +72,7 @@ export declare const MenuArrow: React.ForwardRefExoticComponent<Omit<import("@ba
70
72
  size?: import("./sizing.js").ComponentSize;
71
73
  } & React.RefAttributes<HTMLDivElement>>, MenuLinkItem: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menu").MenuLinkItemProps, "ref"> & React.RefAttributes<Element>, "ref">, "size"> & {
72
74
  size?: import("./sizing.js").ComponentSize;
73
- } & React.RefAttributes<HTMLAnchorElement>>, MenuList: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuListProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuPortal: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuRadioGroup: React.NamedExoticComponent<Omit<import("@base-ui/react/menu").MenuRadioGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuRadioItem: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menu").MenuRadioItemProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
75
+ } & React.RefAttributes<HTMLAnchorElement>>, MenuList: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/menu").MenuListProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuRadioGroup: React.NamedExoticComponent<Omit<import("@base-ui/react/menu").MenuRadioGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>, MenuRadioItem: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menu").MenuRadioItemProps, "ref"> & React.RefAttributes<HTMLElement>, "ref">, "size"> & {
74
76
  size?: import("./sizing.js").ComponentSize;
75
77
  } & React.RefAttributes<HTMLDivElement>>, MenuRadioItemIndicator: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/menu").MenuRadioItemIndicatorProps, "ref"> & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>, MenuRoot: typeof BaseMenu.Root, MenuSeparator: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react").SeparatorProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
76
78
  size?: import("./sizing.js").ComponentSize;
package/dist/menu.js CHANGED
@@ -1,29 +1,33 @@
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 { Icon } from './icon.js';
4
5
  import { Menu as BaseMenu } from '@base-ui/react/menu';
5
- import { skin, part } from './parts.js';
6
- const MenuPopup = part(BaseMenu.Popup, 'pui-menu');
7
- const MenuPositioner = part(BaseMenu.Positioner, 'pui-positioner');
8
- const MenuContent = React.forwardRef(function MenuContent({ align = 'end', sideOffset = 6, side, collisionPadding, className, ...props }, ref) {
9
- return (_jsx(MenuPositioner, { align: align, side: side, sideOffset: sideOffset, collisionPadding: collisionPadding, children: _jsx(MenuPopup, { ...props, ref: ref, className: className }) }));
6
+ import { OwnPortal, part, scopedPortal, skin } from './parts.js';
7
+ const MenuPopup = /* @__PURE__ */ part(BaseMenu.Popup, 'pui-menu', { portal: true });
8
+ const MenuPositioner = /* @__PURE__ */ part(BaseMenu.Positioner, 'pui-positioner', { portal: true });
9
+ const MenuContent = /* @__PURE__ */ React.forwardRef(function MenuContent({ align = 'end', sideOffset = 6, side, collisionPadding, className, ...props }, ref) {
10
+ return (_jsx(OwnPortal, { portal: BaseMenu.Portal, children: _jsx(MenuPositioner, { align: align, side: side, sideOffset: sideOffset, collisionPadding: collisionPadding, children: _jsx(MenuPopup, { ...props, ref: ref, className: className }) }) }));
10
11
  });
11
- const MenuTrigger = React.forwardRef(function MenuTrigger({ className, ...props }, ref) {
12
+ const MenuTrigger = /* @__PURE__ */ React.forwardRef(function MenuTrigger({ className, ...props }, ref) {
12
13
  return (_jsx(BaseMenu.Trigger, { "data-variant": 'ghost', ...props, ref: ref, className: skin('pui-button pui-menu-trigger', className) }));
13
14
  });
14
- const CheckboxIndicator = React.forwardRef(function CheckboxIndicator({ className, children, ...props }, ref) {
15
- return (_jsx(BaseMenu.CheckboxItemIndicator, { keepMounted: true, ...props, ref: ref, className: skin('pui-menu-indicator', className), children: 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: 'm5 12 4 4L19 6' }) })) }));
15
+ const CheckboxIndicator = /* @__PURE__ */ React.forwardRef(function CheckboxIndicator({ className, children, ...props }, ref) {
16
+ return (_jsx(BaseMenu.CheckboxItemIndicator, { keepMounted: true, ...props, ref: ref, className: skin('pui-menu-indicator', className), children: children ?? _jsx(Icon, { name: 'check' }) }));
16
17
  });
17
- const RadioIndicator = React.forwardRef(function RadioIndicator({ className, children, ...props }, ref) {
18
+ const RadioIndicator = /* @__PURE__ */ React.forwardRef(function RadioIndicator({ className, children, ...props }, ref) {
18
19
  return (_jsx(BaseMenu.RadioItemIndicator, { keepMounted: true, ...props, ref: ref, className: skin('pui-menu-indicator', className), children: children ?? (_jsx("svg", { width: '16', height: '16', viewBox: '0 0 24 24', fill: 'currentColor', "aria-hidden": 'true', children: _jsx("circle", { cx: '12', cy: '12', r: '4' }) })) }));
19
20
  });
20
- const SubmenuTrigger = React.forwardRef(function SubmenuTrigger({ className, children, indicator, ...props }, ref) {
21
+ const SubmenuTrigger = /* @__PURE__ */ React.forwardRef(function SubmenuTrigger({ className, children, indicator, ...props }, ref) {
21
22
  return (_jsxs(BaseMenu.SubmenuTrigger, { ...props, ref: ref, className: skin('pui-menu-item pui-menu-submenu-trigger', className), children: [children, indicator === false
22
23
  ? null
23
- : (indicator ?? (_jsx("svg", { className: 'pui-submenu-arrow', width: '16', height: '16', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '1.6', "aria-hidden": 'true', children: _jsx("path", { d: 'm9 6 6 6-6 6' }) })))] }));
24
+ : (indicator ?? (_jsx(Icon, { name: 'chevron-forward', className: 'pui-submenu-arrow' })))] }));
24
25
  });
26
+ /** Content brings its own portal; Portal stays for wrapping it, or raw parts. */
27
+ const MenuPortal = /* @__PURE__ */ scopedPortal(BaseMenu.Portal);
25
28
  export const Menu = {
26
29
  ...BaseMenu,
30
+ Portal: MenuPortal,
27
31
  Content: MenuContent,
28
32
  Popup: MenuPopup,
29
33
  Positioner: MenuPositioner,
@@ -31,14 +35,14 @@ export const Menu = {
31
35
  CheckboxItemIndicator: CheckboxIndicator,
32
36
  RadioItemIndicator: RadioIndicator,
33
37
  SubmenuTrigger,
34
- Item: part(BaseMenu.Item, 'pui-menu-item'),
35
- LinkItem: part(BaseMenu.LinkItem, 'pui-menu-item'),
36
- CheckboxItem: part(BaseMenu.CheckboxItem, 'pui-menu-item pui-menu-check-item'),
37
- RadioItem: part(BaseMenu.RadioItem, 'pui-menu-item pui-menu-check-item'),
38
- GroupLabel: part(BaseMenu.GroupLabel, 'pui-menu-group-label'),
39
- Separator: part(BaseMenu.Separator, 'pui-menu-separator'),
40
- Input: part(BaseMenu.Input, 'pui-input'),
38
+ Item: /* @__PURE__ */ part(BaseMenu.Item, 'pui-menu-item'),
39
+ LinkItem: /* @__PURE__ */ part(BaseMenu.LinkItem, 'pui-menu-item'),
40
+ CheckboxItem: /* @__PURE__ */ part(BaseMenu.CheckboxItem, 'pui-menu-item pui-menu-check-item'),
41
+ RadioItem: /* @__PURE__ */ part(BaseMenu.RadioItem, 'pui-menu-item pui-menu-check-item'),
42
+ GroupLabel: /* @__PURE__ */ part(BaseMenu.GroupLabel, 'pui-menu-group-label'),
43
+ Separator: /* @__PURE__ */ part(BaseMenu.Separator, 'pui-menu-separator'),
44
+ Input: /* @__PURE__ */ part(BaseMenu.Input, 'pui-input'),
41
45
  };
42
46
  // Flat names for React Server Components, which cannot dot into client exports.
43
- export { MenuPopup, MenuPositioner, MenuTrigger, MenuContent };
44
- export const { Arrow: MenuArrow, Backdrop: MenuBackdrop, CheckboxItem: MenuCheckboxItem, CheckboxItemIndicator: MenuCheckboxItemIndicator, Clear: MenuClear, Empty: MenuEmpty, FilterProvider: MenuFilterProvider, Group: MenuGroup, GroupLabel: MenuGroupLabel, Handle: MenuHandle, Input: MenuInput, Item: MenuItem, LinkItem: MenuLinkItem, List: MenuList, Portal: MenuPortal, RadioGroup: MenuRadioGroup, RadioItem: MenuRadioItem, RadioItemIndicator: MenuRadioItemIndicator, Root: MenuRoot, Separator: MenuSeparator, SubmenuRoot: MenuSubmenuRoot, SubmenuTrigger: MenuSubmenuTrigger, Viewport: MenuViewport, } = Menu;
47
+ export { MenuPopup, MenuPositioner, MenuTrigger, MenuContent, MenuPortal };
48
+ export const { Arrow: MenuArrow, Backdrop: MenuBackdrop, CheckboxItem: MenuCheckboxItem, CheckboxItemIndicator: MenuCheckboxItemIndicator, Clear: MenuClear, Empty: MenuEmpty, FilterProvider: MenuFilterProvider, Group: MenuGroup, GroupLabel: MenuGroupLabel, Handle: MenuHandle, Input: MenuInput, Item: MenuItem, LinkItem: MenuLinkItem, List: MenuList, RadioGroup: MenuRadioGroup, RadioItem: MenuRadioItem, RadioItemIndicator: MenuRadioItemIndicator, Root: MenuRoot, Separator: MenuSeparator, SubmenuRoot: MenuSubmenuRoot, SubmenuTrigger: MenuSubmenuTrigger, Viewport: MenuViewport, } = Menu;
@@ -0,0 +1,4 @@
1
+ import * as React from 'react';
2
+ export declare const Menubar: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menubar").MenubarProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
3
+ size?: import("./sizing.js").ComponentSize;
4
+ } & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,4 @@
1
+ 'use client';
2
+ import { Menubar as BaseMenubar } from '@base-ui/react/menubar';
3
+ import { part } from './parts.js';
4
+ export const Menubar = /* @__PURE__ */ part(BaseMenubar, 'pui-menubar');
@@ -0,0 +1,29 @@
1
+ import * as React from 'react';
2
+ export declare const Meter: {
3
+ Root: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
4
+ size?: import("./sizing.js").ComponentSize;
5
+ } & React.RefAttributes<HTMLDivElement>>;
6
+ Label: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterLabelProps, "ref"> & React.RefAttributes<HTMLSpanElement>, "ref">, "size"> & {
7
+ size?: import("./sizing.js").ComponentSize;
8
+ } & React.RefAttributes<HTMLSpanElement>>;
9
+ Value: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterValueProps, "ref"> & React.RefAttributes<HTMLSpanElement>, "ref">, "size"> & {
10
+ size?: import("./sizing.js").ComponentSize;
11
+ } & React.RefAttributes<HTMLSpanElement>>;
12
+ Track: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterTrackProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
13
+ size?: import("./sizing.js").ComponentSize;
14
+ } & React.RefAttributes<HTMLDivElement>>;
15
+ Indicator: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterIndicatorProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
16
+ size?: import("./sizing.js").ComponentSize;
17
+ } & React.RefAttributes<HTMLDivElement>>;
18
+ };
19
+ export declare const MeterIndicator: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterIndicatorProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
20
+ size?: import("./sizing.js").ComponentSize;
21
+ } & React.RefAttributes<HTMLDivElement>>, MeterLabel: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterLabelProps, "ref"> & React.RefAttributes<HTMLSpanElement>, "ref">, "size"> & {
22
+ size?: import("./sizing.js").ComponentSize;
23
+ } & React.RefAttributes<HTMLSpanElement>>, MeterRoot: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
24
+ size?: import("./sizing.js").ComponentSize;
25
+ } & React.RefAttributes<HTMLDivElement>>, MeterTrack: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterTrackProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
26
+ size?: import("./sizing.js").ComponentSize;
27
+ } & React.RefAttributes<HTMLDivElement>>, MeterValue: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/meter").MeterValueProps, "ref"> & React.RefAttributes<HTMLSpanElement>, "ref">, "size"> & {
28
+ size?: import("./sizing.js").ComponentSize;
29
+ } & React.RefAttributes<HTMLSpanElement>>;
package/dist/meter.js ADDED
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { Meter as BaseMeter } from '@base-ui/react/meter';
3
+ import { part } from './parts.js';
4
+ export const Meter = {
5
+ ...BaseMeter,
6
+ Root: /* @__PURE__ */ part(BaseMeter.Root, 'pui-gauge pui-meter'),
7
+ Label: /* @__PURE__ */ part(BaseMeter.Label, 'pui-gauge-label'),
8
+ Value: /* @__PURE__ */ part(BaseMeter.Value, 'pui-gauge-value'),
9
+ Track: /* @__PURE__ */ part(BaseMeter.Track, 'pui-gauge-track'),
10
+ Indicator: /* @__PURE__ */ part(BaseMeter.Indicator, 'pui-gauge-indicator'),
11
+ };
12
+ // Flat names for React Server Components, which cannot dot into client exports.
13
+ export const { Indicator: MeterIndicator, Label: MeterLabel, Root: MeterRoot, Track: MeterTrack, Value: MeterValue, } = Meter;
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ import { type ComponentSizeAlias } from './sizing.js';
3
+ /** Transitional HTML-option adapter. Submitted values use Base UI's native hidden input. */
4
+ export declare const NativeSelect: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.SelectHTMLAttributes<HTMLSelectElement>, HTMLSelectElement>, "ref">, "size" | "multiple"> & {
5
+ size?: ComponentSizeAlias;
6
+ } & React.RefAttributes<HTMLButtonElement>>;
7
+ export declare function NativeSelectOption(props: React.ComponentProps<'option'>): React.JSX.Element;
8
+ export declare function NativeSelectOptGroup(props: React.ComponentProps<'optgroup'>): React.JSX.Element;
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Select } from './select.js';
5
+ function optionList(children) {
6
+ return React.Children.toArray(children).flatMap((child) => {
7
+ if (!React.isValidElement(child))
8
+ return [];
9
+ const p = child.props;
10
+ if (child.type === React.Fragment)
11
+ return optionList(p.children);
12
+ // An optgroup keeps its label as a visible group heading.
13
+ if (child.type === 'optgroup' || child.type === NativeSelectOptGroup)
14
+ return [
15
+ {
16
+ label: p.label,
17
+ options: optionList(p.children).flatMap((item) => 'options' in item ? item.options : [item]),
18
+ },
19
+ ];
20
+ return [
21
+ {
22
+ value: String(p.value ?? p.children ?? ''),
23
+ label: p.label ?? p.children,
24
+ disabled: p.disabled,
25
+ },
26
+ ];
27
+ });
28
+ }
29
+ /** Transitional HTML-option adapter. Submitted values use Base UI's native hidden input. */
30
+ export const NativeSelect = /* @__PURE__ */ React.forwardRef(function NativeSelect({ children, onChange, value, defaultValue, className, size, ...props }, ref) {
31
+ const input = React.useRef(null);
32
+ const options = optionList(children);
33
+ return (_jsx(Select, { options: options, value: value === undefined ? undefined : String(value), defaultValue: defaultValue === undefined ? undefined : String(defaultValue), className: className, size: size, inputRef: input, triggerRef: ref, name: props.name, form: props.form, disabled: props.disabled, required: props.required, id: props.id, "aria-label": props['aria-label'], "aria-labelledby": props['aria-labelledby'], "aria-describedby": props['aria-describedby'], "aria-invalid": props['aria-invalid'], onValueChange: (next) => {
34
+ if (!onChange)
35
+ return;
36
+ const target = input.current;
37
+ if (!target)
38
+ return;
39
+ const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set;
40
+ setter?.call(target, next);
41
+ const event = new Event('change', { bubbles: true });
42
+ Object.defineProperties(event, {
43
+ target: { value: target },
44
+ currentTarget: { value: target },
45
+ });
46
+ onChange(event);
47
+ } }));
48
+ });
49
+ export function NativeSelectOption(props) {
50
+ return _jsx("option", { ...props });
51
+ }
52
+ export function NativeSelectOptGroup(props) {
53
+ return _jsx("optgroup", { ...props });
54
+ }
@@ -1,30 +1,33 @@
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 { Icon } from './icon.js';
4
5
  import { NavigationMenu as BaseNavigationMenu } from '@base-ui/react/navigation-menu';
5
6
  import { part, skin } from './parts.js';
6
7
  function Root(props) {
7
8
  const { className, orientation = 'horizontal', ...rest } = props;
8
9
  return (_jsx(BaseNavigationMenu.Root, { ...rest, orientation: orientation, "data-orientation": orientation, className: skin('pui-navigation-menu', className) }));
9
10
  }
10
- const Trigger = React.forwardRef(function Trigger({ className, children, indicator, ...props }, ref) {
11
+ const Trigger = /* @__PURE__ */ React.forwardRef(function Trigger({ className, children, indicator, ...props }, ref) {
11
12
  return (_jsxs(BaseNavigationMenu.Trigger, { "data-variant": 'ghost', ...props, ref: ref, className: skin('pui-button pui-navigation-trigger', className), children: [children, indicator === false
12
13
  ? null
13
- : (indicator ?? (_jsx(BaseNavigationMenu.Icon, { className: 'pui-navigation-icon', 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: 'm6 9 6 6 6-6' }) }) })))] }));
14
+ : (indicator ?? (_jsx(BaseNavigationMenu.Icon, { className: 'pui-navigation-icon', children: _jsx(Icon, { name: 'chevron-down' }) })))] }));
14
15
  });
15
16
  export const NavigationMenu = {
16
17
  ...BaseNavigationMenu,
17
18
  Root,
18
19
  Trigger,
19
- List: part(BaseNavigationMenu.List, 'pui-navigation-list'),
20
- Item: part(BaseNavigationMenu.Item, 'pui-navigation-item'),
21
- Link: part(BaseNavigationMenu.Link, 'pui-navigation-link'),
22
- Content: part(BaseNavigationMenu.Content, 'pui-navigation-content'),
23
- Positioner: part(BaseNavigationMenu.Positioner, 'pui-positioner pui-navigation-positioner'),
24
- Popup: part(BaseNavigationMenu.Popup, 'pui-navigation-popup'),
25
- Viewport: part(BaseNavigationMenu.Viewport, 'pui-navigation-viewport'),
26
- Icon: React.forwardRef(function Icon({ children, className, ...props }, ref) {
27
- return (_jsx(BaseNavigationMenu.Icon, { ...props, ref: ref, className: skin('pui-navigation-icon', className), children: 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: 'm6 9 6 6 6-6' }) })) }));
20
+ List: /* @__PURE__ */ part(BaseNavigationMenu.List, 'pui-navigation-list'),
21
+ Item: /* @__PURE__ */ part(BaseNavigationMenu.Item, 'pui-navigation-item'),
22
+ Link: /* @__PURE__ */ part(BaseNavigationMenu.Link, 'pui-navigation-link'),
23
+ Content: /* @__PURE__ */ part(BaseNavigationMenu.Content, 'pui-navigation-content'),
24
+ Positioner: /* @__PURE__ */ part(BaseNavigationMenu.Positioner, 'pui-positioner pui-navigation-positioner', {
25
+ portal: true,
26
+ }),
27
+ Popup: /* @__PURE__ */ part(BaseNavigationMenu.Popup, 'pui-navigation-popup', { portal: true }),
28
+ Viewport: /* @__PURE__ */ part(BaseNavigationMenu.Viewport, 'pui-navigation-viewport'),
29
+ Icon: /* @__PURE__ */ React.forwardRef(function NavigationMenuIcon({ children, className, ...props }, ref) {
30
+ return (_jsx(BaseNavigationMenu.Icon, { ...props, ref: ref, className: skin('pui-navigation-icon', className), children: children ?? _jsx(Icon, { name: 'chevron-down' }) }));
28
31
  }),
29
32
  };
30
33
  // Flat names for React Server Components, which cannot dot into client exports.
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ export declare const NumberField: {
3
+ Root: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/number-field").NumberFieldRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
4
+ Increment: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/number-field").NumberFieldIncrementProps, "ref"> & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
5
+ Decrement: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/number-field").NumberFieldDecrementProps, "ref"> & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
6
+ Group: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/number-field").NumberFieldGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
7
+ size?: import("./sizing.js").ComponentSize;
8
+ } & React.RefAttributes<HTMLDivElement>>;
9
+ Input: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/number-field").NumberFieldInputProps, "ref"> & React.RefAttributes<HTMLInputElement>, "ref">, "size"> & {
10
+ size?: import("./sizing.js").ComponentSize;
11
+ } & React.RefAttributes<HTMLInputElement>>;
12
+ ScrubArea: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/number-field").NumberFieldScrubAreaProps, "ref"> & React.RefAttributes<HTMLSpanElement>, "ref">, "size"> & {
13
+ size?: import("./sizing.js").ComponentSize;
14
+ } & React.RefAttributes<HTMLSpanElement>>;
15
+ ScrubAreaCursor: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/number-field").NumberFieldScrubAreaCursorProps, "ref"> & React.RefAttributes<HTMLSpanElement>>;
16
+ };
17
+ export declare const NumberFieldDecrement: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/number-field").NumberFieldDecrementProps, "ref"> & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>, NumberFieldGroup: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/number-field").NumberFieldGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
18
+ size?: import("./sizing.js").ComponentSize;
19
+ } & React.RefAttributes<HTMLDivElement>>, NumberFieldIncrement: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/number-field").NumberFieldIncrementProps, "ref"> & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>, NumberFieldInput: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/number-field").NumberFieldInputProps, "ref"> & React.RefAttributes<HTMLInputElement>, "ref">, "size"> & {
20
+ size?: import("./sizing.js").ComponentSize;
21
+ } & React.RefAttributes<HTMLInputElement>>, NumberFieldRoot: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/number-field").NumberFieldRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>, NumberFieldScrubArea: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/number-field").NumberFieldScrubAreaProps, "ref"> & React.RefAttributes<HTMLSpanElement>, "ref">, "size"> & {
22
+ size?: import("./sizing.js").ComponentSize;
23
+ } & React.RefAttributes<HTMLSpanElement>>, NumberFieldScrubAreaCursor: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/number-field").NumberFieldScrubAreaCursorProps, "ref"> & React.RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Icon } from './icon.js';
5
+ import { NumberField as BaseNumberField } from '@base-ui/react/number-field';
6
+ import { part, skin } from './parts.js';
7
+ import { useRootRef, useResetValue } from './form-state.js';
8
+ const NumberRoot = /* @__PURE__ */ React.forwardRef(function NumberRoot({ value, defaultValue, onValueChange, className, form, ...props }, ref) {
9
+ const [element, attach] = useRootRef(ref);
10
+ const [numeric, setNumeric] = useResetValue(value, defaultValue ?? null, element, form);
11
+ return (_jsx(BaseNumberField.Root, { ...props, form: form, ref: attach, value: numeric, className: skin('pui-number-field', className), onValueChange: (next, event) => {
12
+ onValueChange?.(next, event);
13
+ if (value === undefined && !event.isCanceled)
14
+ setNumeric(next);
15
+ } }));
16
+ });
17
+ const NumberIncrement = /* @__PURE__ */ React.forwardRef(function NumberIncrement({ className, children, ...props }, ref) {
18
+ return (_jsx(BaseNumberField.Increment, { "aria-label": 'Increase value', ...props, ref: ref, className: skin('pui-number-step', className), children: children ?? _jsx(Icon, { name: 'plus' }) }));
19
+ });
20
+ const NumberDecrement = /* @__PURE__ */ React.forwardRef(function NumberDecrement({ className, children, ...props }, ref) {
21
+ return (_jsx(BaseNumberField.Decrement, { "aria-label": 'Decrease value', ...props, ref: ref, className: skin('pui-number-step', className), children: children ?? _jsx(Icon, { name: 'minus' }) }));
22
+ });
23
+ export const NumberField = {
24
+ ...BaseNumberField,
25
+ Root: NumberRoot,
26
+ Increment: NumberIncrement,
27
+ Decrement: NumberDecrement,
28
+ Group: /* @__PURE__ */ part(BaseNumberField.Group, 'pui-number-group'),
29
+ Input: /* @__PURE__ */ part(BaseNumberField.Input, 'pui-number-input'),
30
+ ScrubArea: /* @__PURE__ */ part(BaseNumberField.ScrubArea, 'pui-number-scrub'),
31
+ };
32
+ // Flat names for React Server Components, which cannot dot into client exports.
33
+ export const { Decrement: NumberFieldDecrement, Group: NumberFieldGroup, Increment: NumberFieldIncrement, Input: NumberFieldInput, Root: NumberFieldRoot, ScrubArea: NumberFieldScrubArea, ScrubAreaCursor: NumberFieldScrubAreaCursor, } = NumberField;
package/dist/otp-field.js CHANGED
@@ -5,7 +5,7 @@ import { useRender } from '@base-ui/react/use-render';
5
5
  import { OTPField as BaseOTPField } from '@base-ui/react/otp-field';
6
6
  import { part, skin } from './parts.js';
7
7
  import { useResetValue, useRootRef } from './form-state.js';
8
- const Root = React.forwardRef(function Root({ value, defaultValue = '', form, onValueChange, className, ...props }, forwardedRef) {
8
+ const Root = /* @__PURE__ */ React.forwardRef(function Root({ value, defaultValue = '', form, onValueChange, className, ...props }, forwardedRef) {
9
9
  const [element, ref] = useRootRef(forwardedRef);
10
10
  const [local, setLocal, revision] = useResetValue(value, defaultValue, element, form);
11
11
  return (_jsx(BaseOTPField.Root, { ...props, ref: ref, form: form, value: local, className: skin('pui-otp-field', className), onValueChange: (next, event) => {
@@ -14,7 +14,7 @@ const Root = React.forwardRef(function Root({ value, defaultValue = '', form, on
14
14
  setLocal(next);
15
15
  } }, revision));
16
16
  });
17
- const Separator = React.forwardRef(function Separator({ className, ...props }, ref) {
17
+ const Separator = /* @__PURE__ */ React.forwardRef(function Separator({ className, ...props }, ref) {
18
18
  return (_jsx(BaseOTPField.Separator, { "aria-hidden": 'true', ...props, ref: ref, className: skin('pui-otp-separator', className) }));
19
19
  });
20
20
  // Preserve Base UI's DOM refs and user render composition while fixing native-validation ARIA.
@@ -32,14 +32,14 @@ function SlotElement({ domProps, state, render, }) {
32
32
  },
33
33
  });
34
34
  }
35
- const Input = React.forwardRef(function Input({ render, className, ...props }, ref) {
35
+ const Input = /* @__PURE__ */ React.forwardRef(function Input({ render, className, ...props }, ref) {
36
36
  return (_jsx(BaseOTPField.Input, { ...props, ref: ref, className: skin('pui-input pui-otp-input', className), render: (domProps, state) => (_jsx(SlotElement, { domProps: domProps, state: state, render: render })) }));
37
37
  });
38
38
  export const OTPField = {
39
39
  ...BaseOTPField,
40
40
  Root,
41
41
  Input,
42
- Group: part('div', 'pui-otp-group'),
42
+ Group: /* @__PURE__ */ part('div', 'pui-otp-group'),
43
43
  Separator,
44
44
  };
45
45
  // Flat names for React Server Components, which cannot dot into client exports.
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ export declare function PageHeader({ as: Root, headingProps, actionsLabel, title, description, breadcrumb, actions, level, size, className, ...props }: Omit<React.ComponentProps<'div'>, 'title'> & {
3
+ as?: 'div' | 'header';
4
+ headingProps?: Omit<React.HTMLAttributes<HTMLHeadingElement>, 'children' | 'dangerouslySetInnerHTML'>;
5
+ actionsLabel?: string;
6
+ title: React.ReactNode;
7
+ description?: React.ReactNode;
8
+ breadcrumb?: React.ReactNode;
9
+ actions?: React.ReactNode;
10
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
11
+ size?: 'title' | 'page' | 'workspace' | 'document';
12
+ }): React.JSX.Element;
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cx } from './parts.js';
4
+ import { Heading, Text } from './typography.js';
5
+ export function PageHeader({ as: Root = 'div', headingProps, actionsLabel, title, description, breadcrumb, actions, level = 1, size = 'title', className, ...props }) {
6
+ return (_jsxs(Root, { ...props, className: cx('pui-page-header', className), children: [breadcrumb != null && breadcrumb !== false && breadcrumb !== '' && (_jsx("div", { className: 'pui-page-header-breadcrumb', children: breadcrumb })), _jsxs("div", { className: 'pui-page-header-content', children: [_jsxs("div", { className: 'pui-page-header-copy', children: [_jsx(Heading, { ...headingProps, level: level, size: size, children: title }), description != null &&
7
+ description !== false &&
8
+ description !== '' && (_jsx(Text, { color: 'secondary', className: 'pui-page-header-description', children: description }))] }), actions != null && actions !== false && actions !== '' && (_jsx("div", { className: 'pui-page-header-actions', role: actionsLabel ? 'group' : undefined, "aria-label": actionsLabel, children: actions }))] })] }));
9
+ }
@@ -1,11 +1,10 @@
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 { Icon } from './icon.js';
4
5
  import { Button } from './button.js';
5
- function Chevron({ next = false }) {
6
- return (_jsx("svg", { className: 'pui-pagination-arrow', width: '16', height: '16', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '1.6', "aria-hidden": 'true', children: _jsx("path", { d: next ? 'm9 6 6 6-6 6' : 'm15 6-6 6 6 6' }) }));
7
- }
8
- export const Pagination = React.forwardRef(function Pagination({ page, pageCount, siblings = 1, disabled = false, labels, getPageHref, onPageChange, className, 'aria-label': ariaLabel = 'Pagination', ...props }, ref) {
6
+ import { cx } from './parts.js';
7
+ export const Pagination = /* @__PURE__ */ React.forwardRef(function Pagination({ page, pageCount, siblings = 1, disabled = false, labels, getPageHref, onPageChange, className, 'aria-label': ariaLabel = 'Pagination', ...props }, ref) {
9
8
  const count = Number.isFinite(pageCount)
10
9
  ? Math.min(Number.MAX_SAFE_INTEGER, Math.max(0, Math.floor(pageCount)))
11
10
  : 0;
@@ -40,5 +39,5 @@ export const Pagination = React.forwardRef(function Pagination({ page, pageCount
40
39
  onPageChange?.(target);
41
40
  }, children: children }));
42
41
  }
43
- return (_jsxs("nav", { ...props, ref: ref, "aria-label": ariaLabel, className: ['pui-pagination', className].filter(Boolean).join(' '), children: [control(Math.max(1, current - 1), labels?.previous ?? 'Previous page', _jsxs(_Fragment, { children: [_jsx(Chevron, {}), _jsx("span", { children: labels?.previous ?? 'Previous page' })] }), current === 1), _jsx("span", { className: 'pui-pagination-summary', children: labels?.summary?.(current, count) ?? `Page ${current} of ${count}` }), _jsx("ul", { role: 'list', className: 'pui-pagination-list', children: items.map((item) => (_jsx("li", { children: typeof item === 'number' ? (control(item, labels?.page?.(item) ?? `Page ${item}`, item)) : (_jsxs("span", { className: 'pui-pagination-gap', children: [_jsxs("svg", { width: '16', height: '16', viewBox: '0 0 24 24', fill: 'currentColor', "aria-hidden": 'true', children: [_jsx("circle", { cx: '5', cy: '12', r: '1.5' }), _jsx("circle", { cx: '12', cy: '12', r: '1.5' }), _jsx("circle", { cx: '19', cy: '12', r: '1.5' })] }), _jsx("span", { className: 'pui-feedback-sr', children: labels?.more ?? 'More pages' })] })) }, item))) }), control(Math.min(count, current + 1), labels?.next ?? 'Next page', _jsxs(_Fragment, { children: [_jsx("span", { children: labels?.next ?? 'Next page' }), _jsx(Chevron, { next: true })] }), current === count)] }));
42
+ return (_jsxs("nav", { ...props, ref: ref, "aria-label": ariaLabel, className: cx('pui-pagination', className), children: [control(Math.max(1, current - 1), labels?.previous ?? 'Previous page', _jsxs(_Fragment, { children: [_jsx(Icon, { name: 'chevron-back', className: 'pui-pagination-arrow' }), _jsx("span", { children: labels?.previous ?? 'Previous page' })] }), current === 1), _jsx("span", { className: 'pui-pagination-summary', children: labels?.summary?.(current, count) ?? `Page ${current} of ${count}` }), _jsx("ul", { role: 'list', className: 'pui-pagination-list', children: items.map((item) => (_jsx("li", { children: typeof item === 'number' ? (control(item, labels?.page?.(item) ?? `Page ${item}`, item)) : (_jsxs("span", { className: 'pui-pagination-gap', children: [_jsx(Icon, { name: 'more' }), _jsx("span", { className: 'pui-feedback-sr', children: labels?.more ?? 'More pages' })] })) }, item))) }), control(Math.min(count, current + 1), labels?.next ?? 'Next page', _jsxs(_Fragment, { children: [_jsx("span", { children: labels?.next ?? 'Next page' }), _jsx(Icon, { name: 'chevron-forward', className: 'pui-pagination-arrow' })] }), current === count)] }));
44
43
  });
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import { type ComponentSizeAlias } from './sizing.js';
3
+ export type PanelSide = 'left' | 'right' | 'top' | 'bottom';
4
+ export type PanelOptions = {
5
+ size?: ComponentSizeAlias;
6
+ closeLabel?: string;
7
+ /** Attaches the panel to its edge: no gap, and square corners on that edge, as a
8
+ * mobile bottom sheet sits. */
9
+ flush?: boolean;
10
+ };
11
+ export declare function Header({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
12
+ export declare const Body: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
+ export declare function Footer({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
package/dist/panel.js ADDED
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { cx } from './parts.js';
5
+ export function Header({ className, ...props }) {
6
+ return _jsx("div", { ...props, className: cx('pui-panel-header', className) });
7
+ }
8
+ export const Body = /* @__PURE__ */ React.forwardRef(function Body({ className, ...props }, ref) {
9
+ return (_jsx("div", { ...props, ref: ref, className: cx('pui-panel-body', className) }));
10
+ });
11
+ export function Footer({ className, ...props }) {
12
+ return _jsx("div", { ...props, className: cx('pui-panel-footer', className) });
13
+ }
package/dist/parts.d.ts CHANGED
@@ -1,9 +1,30 @@
1
1
  import { type ComponentSize } from './sizing.js';
2
2
  import * as React from 'react';
3
+ /** Joins class names, skipping empty ones. */
4
+ export declare function cx(...classes: (string | false | null | undefined)[]): string;
5
+ /** The data-size value: a short alias (sm, md, lg) renders as its full name, so both
6
+ * spellings meet the same CSS; other values such as xs or icon pass through. */
7
+ export declare function sizeName<Size extends string>(size?: Size): ComponentSize | Size | undefined;
3
8
  /** Preserve Base UI's state-dependent className contract when adding a skin. */
4
9
  export declare function skin<State>(base: string, custom?: string | ((state: State) => string | undefined)): string | ((state: State) => string);
10
+ /** A styled Base UI part or element. A portal part renders outside the tree that sets
11
+ * data-ui-size, so it always carries the size scheme; other parts carry it only when
12
+ * size is set. */
5
13
  export declare function part<Element extends HTMLElement, Props extends {
6
14
  className?: unknown;
7
- }>(Component: React.ElementType, base: string): React.ForwardRefExoticComponent<React.PropsWithoutRef<Omit<Props, "size"> & {
15
+ }>(Component: React.ElementType, base: string, { portal }?: {
16
+ portal?: boolean;
17
+ }): React.ForwardRefExoticComponent<React.PropsWithoutRef<Omit<Props, "size"> & {
8
18
  size?: ComponentSize;
9
19
  }> & React.RefAttributes<Element>>;
20
+ /** A namespace Portal that marks its subtree as already portalled. */
21
+ export declare function scopedPortal<Portal extends React.ElementType>(BasePortal: Portal): Portal;
22
+ /** Renders a Content's positioner in its portal, unless a namespace Portal holds it. */
23
+ export declare function OwnPortal({ portal: BasePortal, children, }: {
24
+ portal: React.ElementType;
25
+ children: React.ReactNode;
26
+ }): React.JSX.Element;
27
+ /** Drops undefined entries, so explicit placement props override defaults only when set. */
28
+ export declare function defined<Props extends object>(props: Props): Partial<Props>;
29
+ /** The placement props a popup Content passes to its Positioner. */
30
+ export type Placement<Positioner extends React.ElementType> = Pick<React.ComponentPropsWithoutRef<Positioner>, 'side' | 'align' | 'sideOffset' | 'collisionPadding'>;