@surflane/ui 0.4.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 (136) hide show
  1. package/README.md +1 -1
  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.js +9 -9
  7. package/dist/{input-extensions.d.ts → autocomplete.d.ts} +4 -42
  8. package/dist/{input-extensions.js → autocomplete.js} +7 -26
  9. package/dist/avatar.js +3 -5
  10. package/dist/badge.d.ts +20 -0
  11. package/dist/badge.js +16 -0
  12. package/dist/{navigation.d.ts → breadcrumbs.d.ts} +2 -6
  13. package/dist/breadcrumbs.js +31 -0
  14. package/dist/button.d.ts +11 -0
  15. package/dist/button.js +27 -4
  16. package/dist/{content.d.ts → card.d.ts} +6 -24
  17. package/dist/card.js +26 -0
  18. package/dist/chart.d.ts +19 -0
  19. package/dist/chart.js +24 -6
  20. package/dist/checkbox-group.d.ts +2 -0
  21. package/dist/checkbox-group.js +16 -0
  22. package/dist/checkbox.d.ts +9 -0
  23. package/dist/checkbox.js +29 -0
  24. package/dist/choice-label.d.ts +25 -0
  25. package/dist/choice-label.js +14 -0
  26. package/dist/choice.d.ts +7 -0
  27. package/dist/choice.js +3 -0
  28. package/dist/code.d.ts +21 -0
  29. package/dist/{content.js → code.js} +5 -30
  30. package/dist/collapsible.d.ts +18 -0
  31. package/dist/collapsible.js +21 -0
  32. package/dist/{advanced-forms.d.ts → combobox.d.ts} +5 -25
  33. package/dist/{advanced-forms.js → combobox.js} +13 -49
  34. package/dist/{context-overlays.d.ts → context-menu.d.ts} +6 -28
  35. package/dist/{context-overlays.js → context-menu.js} +5 -25
  36. package/dist/date-picker.js +3 -2
  37. package/dist/dialog.d.ts +6 -24
  38. package/dist/dialog.js +7 -20
  39. package/dist/{panels.d.ts → drawer.d.ts} +3 -34
  40. package/dist/drawer.js +47 -0
  41. package/dist/empty-state.d.ts +29 -0
  42. package/dist/empty-state.js +19 -0
  43. package/dist/field.d.ts +42 -0
  44. package/dist/field.js +21 -0
  45. package/dist/fieldset.d.ts +14 -0
  46. package/dist/fieldset.js +10 -0
  47. package/dist/file-upload.d.ts +3 -1
  48. package/dist/file-upload.js +7 -5
  49. package/dist/filter-bar.js +1 -1
  50. package/dist/form.d.ts +2 -0
  51. package/dist/form.js +7 -0
  52. package/dist/icon.d.ts +10 -0
  53. package/dist/icon.js +18 -3
  54. package/dist/index.d.ts +56 -29
  55. package/dist/index.js +70 -32
  56. package/dist/{messages.d.ts → inline-message.d.ts} +0 -28
  57. package/dist/{messages.js → inline-message.js} +3 -18
  58. package/dist/input.js +2 -2
  59. package/dist/{foundations.d.ts → layout.d.ts} +5 -23
  60. package/dist/{foundations.js → layout.js} +4 -19
  61. package/dist/link.d.ts +6 -0
  62. package/dist/link.js +17 -0
  63. package/dist/list.d.ts +33 -0
  64. package/dist/list.js +21 -0
  65. package/dist/markdown.js +4 -5
  66. package/dist/menu.d.ts +7 -5
  67. package/dist/menu.js +12 -8
  68. package/dist/menubar.d.ts +4 -0
  69. package/dist/menubar.js +4 -0
  70. package/dist/meter.d.ts +29 -0
  71. package/dist/meter.js +13 -0
  72. package/dist/native-select.d.ts +8 -0
  73. package/dist/native-select.js +54 -0
  74. package/dist/navigation-menu.js +8 -5
  75. package/dist/number-field.d.ts +23 -0
  76. package/dist/number-field.js +33 -0
  77. package/dist/page-header.d.ts +12 -0
  78. package/dist/page-header.js +9 -0
  79. package/dist/pagination.js +3 -4
  80. package/dist/panel.d.ts +13 -0
  81. package/dist/panel.js +13 -0
  82. package/dist/parts.d.ts +19 -1
  83. package/dist/parts.js +32 -6
  84. package/dist/popover.d.ts +23 -6
  85. package/dist/popover.js +17 -7
  86. package/dist/preview-card.d.ts +29 -0
  87. package/dist/preview-card.js +27 -0
  88. package/dist/progress.d.ts +29 -0
  89. package/dist/progress.js +13 -0
  90. package/dist/radio-group.d.ts +16 -0
  91. package/dist/radio-group.js +31 -0
  92. package/dist/scroll-area.js +3 -4
  93. package/dist/select.d.ts +8 -8
  94. package/dist/select.js +19 -54
  95. package/dist/separator.d.ts +4 -0
  96. package/dist/separator.js +8 -0
  97. package/dist/sheet.d.ts +29 -0
  98. package/dist/sheet.js +39 -0
  99. package/dist/skeleton.d.ts +8 -0
  100. package/dist/skeleton.js +8 -0
  101. package/dist/slider.d.ts +40 -0
  102. package/dist/slider.js +27 -0
  103. package/dist/spinner.d.ts +13 -0
  104. package/dist/spinner.js +10 -0
  105. package/dist/status.d.ts +1 -19
  106. package/dist/status.js +10 -14
  107. package/dist/switch.d.ts +13 -0
  108. package/dist/switch.js +25 -0
  109. package/dist/syntax-highlighter.js +2 -1
  110. package/dist/{data.d.ts → table.d.ts} +8 -32
  111. package/dist/{data.js → table.js} +15 -30
  112. package/dist/textarea.d.ts +7 -0
  113. package/dist/textarea.js +12 -0
  114. package/dist/toast.js +7 -6
  115. package/dist/toggle-group.d.ts +5 -0
  116. package/dist/toggle-group.js +7 -0
  117. package/dist/toggle.d.ts +7 -0
  118. package/dist/toggle.js +9 -0
  119. package/dist/{commands.d.ts → toolbar.d.ts} +0 -13
  120. package/dist/toolbar.js +14 -0
  121. package/dist/tooltip.d.ts +3 -2
  122. package/dist/tooltip.js +2 -2
  123. package/dist/tree.js +4 -2
  124. package/dist/typography.d.ts +12 -0
  125. package/dist/typography.js +14 -0
  126. package/package.json +237 -21
  127. package/src/styles.css +359 -191
  128. package/dist/chevron.d.ts +0 -3
  129. package/dist/chevron.js +0 -6
  130. package/dist/commands.js +0 -27
  131. package/dist/feedback.d.ts +0 -76
  132. package/dist/feedback.js +0 -35
  133. package/dist/forms.d.ts +0 -91
  134. package/dist/forms.js +0 -109
  135. package/dist/navigation.js +0 -41
  136. package/dist/panels.js +0 -100
package/dist/switch.js ADDED
@@ -0,0 +1,25 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useComponentSize } from './sizing.js';
5
+ import { Switch as BaseSwitch } from '@base-ui/react/switch';
6
+ import { skin, part } from './parts.js';
7
+ import { useRootRef, useResetValue } from './form-state.js';
8
+ const SwitchRoot = /* @__PURE__ */ React.forwardRef(function SwitchRoot({ size, checked, defaultChecked = false, onCheckedChange, className, form, ...props }, ref) {
9
+ const scheme = useComponentSize(size);
10
+ const [element, attach] = useRootRef(ref);
11
+ const [selected, setSelected] = useResetValue(checked, defaultChecked, element, form);
12
+ return (_jsx(BaseSwitch.Root, { ...props, "data-ui-size": size ? scheme : undefined, form: form, ref: attach, checked: selected, className: skin('pui-switch', className), onCheckedChange: (next, event) => {
13
+ onCheckedChange?.(next, event);
14
+ if (checked === undefined && !event.isCanceled)
15
+ setSelected(next);
16
+ } }));
17
+ });
18
+ export const Switch = {
19
+ ...BaseSwitch,
20
+ Root: SwitchRoot,
21
+ Thumb: /* @__PURE__ */ part(BaseSwitch.Thumb, 'pui-switch-thumb'),
22
+ };
23
+ // Flat names for React Server Components, which cannot dot into client exports.
24
+ export { SwitchRoot };
25
+ export const { Thumb: SwitchThumb } = Switch;
@@ -3,6 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from 'react';
4
4
  import { ScrollArea } from './scroll-area.js';
5
5
  import { SyntaxEngineContext } from './syntax-context.js';
6
+ import { cx } from './parts.js';
6
7
  export const syntaxLanguages = [
7
8
  'tsx',
8
9
  'jsx',
@@ -63,7 +64,7 @@ export const SyntaxHighlighter = /* @__PURE__ */ React.forwardRef(function Synta
63
64
  const tokens = result?.code === code && result.language === lang ? result.tokens : null;
64
65
  const eols = code.match(/\r\n|\n|\r/g) ?? [];
65
66
  const valid = tokens && tokens.length === eols.length + 1;
66
- const element = (_jsx("code", { ...props, ref: ref, className: ['pui-syntax', className].filter(Boolean).join(' '), "data-language": lang, "data-highlighted": valid ? 'true' : 'false', children: valid
67
+ const element = (_jsx("code", { ...props, ref: ref, className: cx('pui-syntax', className), "data-language": lang, "data-highlighted": valid ? 'true' : 'false', children: valid
67
68
  ? tokens.map((line, i) => (_jsxs(React.Fragment, { children: [line.map((token, j) => (_jsx("span", { "data-syntax": token.role, children: token.content }, j))), eols[i] ?? ''] }, i)))
68
69
  : code }));
69
70
  return inline ? (element) : (_jsx(ScrollArea, { label: label, orientation: 'horizontal', rootClassName: 'pui-syntax-scroll', children: _jsx("pre", { className: 'pui-syntax-pre', "data-wrap": wrap || undefined, children: element }) }));
@@ -7,6 +7,9 @@ declare const TableContainer: React.ForwardRefExoticComponent<Omit<Omit<React.De
7
7
  scrollChain?: "auto" | "contain";
8
8
  } & React.RefAttributes<HTMLDivElement>, "ref"> & {
9
9
  label: string;
10
+ /** Hangs the table into the gutter by its cell inset, so cell text lines up with
11
+ * the text around it and a row's hover reaches past it evenly on both sides. */
12
+ bleed?: boolean;
10
13
  } & React.RefAttributes<HTMLDivElement>>;
11
14
  export type TableDensity = 'default' | 'compact';
12
15
  declare const TableRoot: React.ForwardRefExoticComponent<Omit<Omit<Omit<React.DetailedHTMLProps<React.TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, "ref">, "size"> & {
@@ -55,6 +58,9 @@ export declare const Table: {
55
58
  scrollChain?: "auto" | "contain";
56
59
  } & React.RefAttributes<HTMLDivElement>, "ref"> & {
57
60
  label: string;
61
+ /** Hangs the table into the gutter by its cell inset, so cell text lines up with
62
+ * the text around it and a row's hover reaches past it evenly on both sides. */
63
+ bleed?: boolean;
58
64
  } & React.RefAttributes<HTMLDivElement>>;
59
65
  Root: React.ForwardRefExoticComponent<Omit<Omit<Omit<React.DetailedHTMLProps<React.TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, "ref">, "size"> & {
60
66
  size?: import("./sizing.js").ComponentSize;
@@ -97,38 +103,7 @@ export declare const Table: {
97
103
  colSpan: number;
98
104
  } & React.RefAttributes<HTMLTableCellElement>>;
99
105
  };
100
- declare const ListRoot: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & React.RefAttributes<HTMLUListElement>>;
101
- declare const ListItem: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "ref"> & {
102
- selected?: boolean;
103
- } & React.RefAttributes<HTMLLIElement>>;
104
- export declare const List: {
105
- Root: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & React.RefAttributes<HTMLUListElement>>;
106
- Item: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "ref"> & {
107
- selected?: boolean;
108
- } & React.RefAttributes<HTMLLIElement>>;
109
- Content: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
110
- size?: import("./sizing.js").ComponentSize;
111
- } & React.RefAttributes<HTMLDivElement>>;
112
- Title: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
113
- size?: import("./sizing.js").ComponentSize;
114
- } & React.RefAttributes<HTMLDivElement>>;
115
- Description: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "ref">, "size"> & {
116
- size?: import("./sizing.js").ComponentSize;
117
- } & React.RefAttributes<HTMLParagraphElement>>;
118
- Actions: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
119
- size?: import("./sizing.js").ComponentSize;
120
- } & React.RefAttributes<HTMLDivElement>>;
121
- };
122
- export { ListRoot, ListItem, TableContainer, TableRoot, TableRow, TableHeaderCell, TableSortHeader, TableCell, TableTruncate, TableMessage, };
123
- export declare const ListContent: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
124
- size?: import("./sizing.js").ComponentSize;
125
- } & React.RefAttributes<HTMLDivElement>>, ListTitle: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
126
- size?: import("./sizing.js").ComponentSize;
127
- } & React.RefAttributes<HTMLDivElement>>, ListDescription: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "ref">, "size"> & {
128
- size?: import("./sizing.js").ComponentSize;
129
- } & React.RefAttributes<HTMLParagraphElement>>, ListActions: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
130
- size?: import("./sizing.js").ComponentSize;
131
- } & React.RefAttributes<HTMLDivElement>>;
106
+ export { TableContainer, TableRoot, TableRow, TableHeaderCell, TableSortHeader, TableCell, TableTruncate, TableMessage, };
132
107
  export declare const TableCaption: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, "ref">, "size"> & {
133
108
  size?: import("./sizing.js").ComponentSize;
134
109
  } & React.RefAttributes<HTMLTableCaptionElement>>, TableHead: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref">, "size"> & {
@@ -138,3 +113,4 @@ export declare const TableCaption: React.ForwardRefExoticComponent<Omit<Omit<Rea
138
113
  } & React.RefAttributes<HTMLTableSectionElement>>, TableFoot: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref">, "size"> & {
139
114
  size?: import("./sizing.js").ComponentSize;
140
115
  } & React.RefAttributes<HTMLTableSectionElement>>;
116
+ export { useTableSelection, type TableSelectionOptions, type TableSelectionCheckbox, } from './table-selection.js';
@@ -1,11 +1,12 @@
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 { Button } from './button.js';
5
- import { part } from './parts.js';
6
+ import { part, cx } from './parts.js';
6
7
  import { ScrollArea } from './scroll-area.js';
7
- const TableContainer = /* @__PURE__ */ React.forwardRef(function TableContainer(props, ref) {
8
- return _jsx(ScrollArea, { ...props, ref: ref });
8
+ const TableContainer = /* @__PURE__ */ React.forwardRef(function TableContainer({ bleed, rootClassName, ...props }, ref) {
9
+ return (_jsx(ScrollArea, { ...props, ref: ref, rootClassName: cx(bleed && 'pui-table-bleed', rootClassName) }));
9
10
  });
10
11
  const RootPart = /* @__PURE__ */ part('table', 'pui-table');
11
12
  const TableRoot = /* @__PURE__ */ React.forwardRef(function TableRoot({ density, stickyHeader, ...props }, ref) {
@@ -25,28 +26,26 @@ const TableCell = /* @__PURE__ */ React.forwardRef(function TableCell({ align, n
25
26
  return _jsx(CellPart, { ...props, ...layout({ align, numeric }), ref: ref });
26
27
  });
27
28
  function SortIcon({ sort }) {
28
- return (_jsx("svg", { className: 'pui-table-sort-icon', width: '16', height: '16', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '1.6', strokeLinecap: 'round', strokeLinejoin: 'round', "aria-hidden": 'true', children: _jsx("path", { d: sort === 'ascending'
29
- ? 'M12 19V5m-6 6 6-6 6 6'
30
- : sort === 'descending'
31
- ? 'M12 5v14m-6-6 6 6 6-6'
32
- : 'm8 9 4-4 4 4m-8 6 4 4 4-4' }) }));
29
+ return (_jsx(Icon, { name: sort === 'ascending'
30
+ ? 'arrow-up'
31
+ : sort === 'descending'
32
+ ? 'arrow-down'
33
+ : 'sort', className: 'pui-table-sort-icon' }));
33
34
  }
34
35
  /** A column header whose button sorts the column. aria-sort names the order on the sorted column only. */
35
36
  const TableSortHeader = /* @__PURE__ */ React.forwardRef(function TableSortHeader({ sort, onSort, disabled, children, className, ...props }, ref) {
36
- return (_jsx(TableHeaderCell, { ...props, ref: ref, scope: 'col', "aria-sort": sort, className: ['pui-table-sort-header', className].filter(Boolean).join(' '), children: _jsxs(Button, { variant: 'ghost', className: 'pui-table-sort', "data-sort": sort, disabled: disabled, onClick: onSort, children: [_jsx("span", { children: children }), _jsx(SortIcon, { sort: sort })] }) }));
37
+ return (_jsx(TableHeaderCell, { ...props, ref: ref, scope: 'col', "aria-sort": sort, className: cx('pui-table-sort-header', className), children: _jsxs(Button, { variant: 'ghost', className: 'pui-table-sort', "data-sort": sort, disabled: disabled, onClick: onSort, children: [_jsx("span", { children: children }), _jsx(SortIcon, { sort: sort })] }) }));
37
38
  });
38
39
  /** One-line text that ends in an ellipsis. String content also becomes the title. */
39
40
  const TableTruncate = /* @__PURE__ */ React.forwardRef(function TableTruncate({ className, title, children, ...props }, ref) {
40
- return (_jsx("span", { ...props, ref: ref, title: title ?? (typeof children === 'string' ? children : undefined), className: ['pui-table-truncate', className].filter(Boolean).join(' '), children: children }));
41
+ return (_jsx("span", { ...props, ref: ref, title: title ?? (typeof children === 'string' ? children : undefined), className: cx('pui-table-truncate', className), children: children }));
41
42
  });
42
43
  /** A full-width body row for loading, empty, error and permission messages. It has no hover. */
43
44
  const TableMessage = /* @__PURE__ */ React.forwardRef(function TableMessage({ className, ...props }, ref) {
44
- return (_jsx("tr", { className: 'pui-table-row pui-table-message-row', children: _jsx("td", { ...props, ref: ref, className: ['pui-table-cell pui-table-message', className]
45
- .filter(Boolean)
46
- .join(' ') }) }));
45
+ return (_jsx("tr", { className: 'pui-table-row pui-table-message-row', children: _jsx("td", { ...props, ref: ref, className: cx('pui-table-cell pui-table-message', className) }) }));
47
46
  });
48
47
  const TableRow = /* @__PURE__ */ React.forwardRef(function TableRow({ selected, className, ...props }, ref) {
49
- return (_jsx("tr", { ...props, ref: ref, "data-selected": selected || undefined, className: ['pui-table-row', className].filter(Boolean).join(' ') }));
48
+ return (_jsx("tr", { ...props, ref: ref, "data-selected": selected || undefined, className: cx('pui-table-row', className) }));
50
49
  });
51
50
  export const Table = {
52
51
  Container: TableContainer,
@@ -62,21 +61,7 @@ export const Table = {
62
61
  Truncate: TableTruncate,
63
62
  Message: TableMessage,
64
63
  };
65
- const ListRoot = /* @__PURE__ */ React.forwardRef(function ListRoot({ className, ...props }, ref) {
66
- return (_jsx("ul", { role: 'list', ...props, ref: ref, className: ['pui-list', className].filter(Boolean).join(' ') }));
67
- });
68
- const ListItem = /* @__PURE__ */ React.forwardRef(function ListItem({ selected, className, ...props }, ref) {
69
- return (_jsx("li", { ...props, ref: ref, "data-selected": selected || undefined, className: ['pui-list-item', className].filter(Boolean).join(' ') }));
70
- });
71
- export const List = {
72
- Root: ListRoot,
73
- Item: ListItem,
74
- Content: /* @__PURE__ */ part('div', 'pui-list-content'),
75
- Title: /* @__PURE__ */ part('div', 'pui-list-title'),
76
- Description: /* @__PURE__ */ part('p', 'pui-list-description'),
77
- Actions: /* @__PURE__ */ part('div', 'pui-list-actions'),
78
- };
79
64
  // Flat names for React Server Components, which cannot dot into client exports.
80
- export { ListRoot, ListItem, TableContainer, TableRoot, TableRow, TableHeaderCell, TableSortHeader, TableCell, TableTruncate, TableMessage, };
81
- export const { Content: ListContent, Title: ListTitle, Description: ListDescription, Actions: ListActions, } = List;
65
+ export { TableContainer, TableRoot, TableRow, TableHeaderCell, TableSortHeader, TableCell, TableTruncate, TableMessage, };
82
66
  export const { Caption: TableCaption, Head: TableHead, Body: TableBody, Foot: TableFoot, } = Table;
67
+ export { useTableSelection, } from './table-selection.js';
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import { type ComponentSizeAlias } from './sizing.js';
3
+ /** A multi-line text field. Inside Field.Root it takes the label, description and
4
+ * error from the field, as Input does. */
5
+ export declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & {
6
+ size?: ComponentSizeAlias;
7
+ } & React.RefAttributes<HTMLTextAreaElement>>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useComponentSize } from './sizing.js';
5
+ import { Field as BaseField } from '@base-ui/react/field';
6
+ import { cx } from './parts.js';
7
+ /** A multi-line text field. Inside Field.Root it takes the label, description and
8
+ * error from the field, as Input does. */
9
+ export const Textarea = /* @__PURE__ */ React.forwardRef(function Textarea({ className, size, rows, cols, wrap, ...props }, ref) {
10
+ const scheme = useComponentSize(size);
11
+ return (_jsx(BaseField.Control, { ...props, ref: ref, "data-ui-size": scheme, render: _jsx("textarea", { rows: rows, cols: cols, wrap: wrap }), className: cx('pui-input pui-textarea', className) }));
12
+ });
package/dist/toast.js CHANGED
@@ -1,20 +1,21 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from 'react';
4
+ import { Icon } from './icon.js';
4
5
  import { useComponentSize } from './sizing.js';
5
6
  import { Toast as BaseToast } from '@base-ui/react/toast';
6
- import { part, skin } from './parts.js';
7
+ import { part, skin, cx } from './parts.js';
7
8
  import { StatusIcon } from './status.js';
8
9
  const ToneContext = /* @__PURE__ */ React.createContext('neutral');
9
10
  const Root = /* @__PURE__ */ React.forwardRef(function Root({ tone = 'neutral', className, ...props }, ref) {
10
11
  return (_jsx(ToneContext.Provider, { value: tone, children: _jsx(BaseToast.Root, { ...props, ref: ref, "data-tone": tone, className: skin('pui-toast', className) }) }));
11
12
  });
12
- const Icon = /* @__PURE__ */ React.forwardRef(function Icon({ tone, children, className, ...props }, ref) {
13
+ const ToneIcon = /* @__PURE__ */ React.forwardRef(function ToastIcon({ tone, children, className, ...props }, ref) {
13
14
  const inherited = React.useContext(ToneContext);
14
- return (_jsx("span", { ...props, ref: ref, "aria-hidden": 'true', className: ['pui-toast-icon', className].filter(Boolean).join(' '), children: children ?? _jsx(StatusIcon, { tone: tone ?? inherited }) }));
15
+ return (_jsx("span", { ...props, ref: ref, "aria-hidden": 'true', className: cx('pui-toast-icon', className), children: children ?? _jsx(StatusIcon, { tone: tone ?? inherited }) }));
15
16
  });
16
17
  const Close = /* @__PURE__ */ React.forwardRef(function Close({ className, children, ...props }, ref) {
17
- return (_jsx(BaseToast.Close, { "aria-label": 'Dismiss notification', "aria-hidden": false, "data-variant": 'ghost', "data-size": 'icon-sm', "data-ui-size": 'small', ...props, ref: ref, className: skin('pui-button pui-toast-close', 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 6 12 12M18 6 6 18' }) })) }));
18
+ return (_jsx(BaseToast.Close, { "aria-label": 'Dismiss notification', "aria-hidden": false, "data-variant": 'ghost', "data-size": 'icon-sm', "data-ui-size": 'small', ...props, ref: ref, className: skin('pui-button pui-toast-close', className), children: children ?? _jsx(Icon, { name: 'close' }) }));
18
19
  });
19
20
  const Action = /* @__PURE__ */ React.forwardRef(function Action({ className, ...props }, ref) {
20
21
  return (_jsx(BaseToast.Action, { "data-variant": 'outline', "data-size": 'small', "data-ui-size": 'small', ...props, ref: ref, className: skin('pui-button pui-toast-action', className) }));
@@ -85,7 +86,7 @@ const Viewport = /* @__PURE__ */ React.forwardRef(function Viewport({ layout = '
85
86
  export const Toast = {
86
87
  ...BaseToast,
87
88
  Root,
88
- Icon,
89
+ Icon: ToneIcon,
89
90
  Close,
90
91
  Action,
91
92
  Viewport,
@@ -93,7 +94,7 @@ export const Toast = {
93
94
  Title: /* @__PURE__ */ part(BaseToast.Title, 'pui-toast-title'),
94
95
  Description: /* @__PURE__ */ part(BaseToast.Description, 'pui-toast-description'),
95
96
  Text: /* @__PURE__ */ part('div', 'pui-toast-text'),
96
- Positioner: /* @__PURE__ */ part(BaseToast.Positioner, 'pui-positioner'),
97
+ Positioner: /* @__PURE__ */ part(BaseToast.Positioner, 'pui-positioner', { portal: true }),
97
98
  };
98
99
  // Flat names for React Server Components, which cannot dot into client exports.
99
100
  export const { Action: ToastAction, Arrow: ToastArrow, Close: ToastClose, Content: ToastContent, Description: ToastDescription, Portal: ToastPortal, Positioner: ToastPositioner, Provider: ToastProvider, Root: ToastRoot, Title: ToastTitle, Viewport: ToastViewport, Icon: ToastIcon, Text: ToastText, } = Toast;
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ import { ToggleGroup as BaseToggleGroup } from '@base-ui/react/toggle-group';
3
+ export declare function ToggleGroup<Value extends string>({ className, ref, ...props }: BaseToggleGroup.Props<Value> & {
4
+ ref?: React.Ref<HTMLDivElement>;
5
+ }): React.JSX.Element;
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { ToggleGroup as BaseToggleGroup } from '@base-ui/react/toggle-group';
4
+ import { skin } from './parts.js';
5
+ export function ToggleGroup({ className, ref, ...props }) {
6
+ return (_jsx(BaseToggleGroup, { ...props, ref: ref, className: skin('pui-toggle-group', className) }));
7
+ }
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import { type ComponentSizeAlias } from './sizing.js';
3
+ import { Toggle as BaseToggle } from '@base-ui/react/toggle';
4
+ export declare function Toggle<Value extends string>({ className, size, ref, ...props }: BaseToggle.Props<Value> & {
5
+ size?: ComponentSizeAlias | 'icon';
6
+ ref?: React.Ref<HTMLButtonElement>;
7
+ }): React.JSX.Element;
package/dist/toggle.js ADDED
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useComponentSize } from './sizing.js';
4
+ import { Toggle as BaseToggle } from '@base-ui/react/toggle';
5
+ import { sizeName, skin } from './parts.js';
6
+ export function Toggle({ className, size, ref, ...props }) {
7
+ const scheme = useComponentSize(size === 'icon' ? undefined : size);
8
+ return (_jsx(BaseToggle, { ...props, ref: ref, className: skin('pui-button pui-toggle', className), "data-size": sizeName(size), "data-ui-size": scheme }));
9
+ }
@@ -1,14 +1,4 @@
1
1
  import * as React from 'react';
2
- import { type ComponentSizeAlias } from './sizing.js';
3
- import { Toggle as BaseToggle } from '@base-ui/react/toggle';
4
- import { ToggleGroup as BaseToggleGroup } from '@base-ui/react/toggle-group';
5
- export declare function Toggle<Value extends string>({ className, size, ref, ...props }: BaseToggle.Props<Value> & {
6
- size?: ComponentSizeAlias | 'icon';
7
- ref?: React.Ref<HTMLButtonElement>;
8
- }): React.JSX.Element;
9
- export declare function ToggleGroup<Value extends string>({ className, ref, ...props }: BaseToggleGroup.Props<Value> & {
10
- ref?: React.Ref<HTMLDivElement>;
11
- }): React.JSX.Element;
12
2
  export declare const Toolbar: {
13
3
  Root: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/toolbar").ToolbarRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
14
4
  size?: import("./sizing.js").ComponentSize;
@@ -29,9 +19,6 @@ export declare const Toolbar: {
29
19
  size?: import("./sizing.js").ComponentSize;
30
20
  } & React.RefAttributes<HTMLDivElement>>;
31
21
  };
32
- export declare const Menubar: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/menubar").MenubarProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
33
- size?: import("./sizing.js").ComponentSize;
34
- } & React.RefAttributes<HTMLDivElement>>;
35
22
  export declare const ToolbarButton: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/toolbar").ToolbarButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>, "ref">, "size"> & {
36
23
  size?: import("./sizing.js").ComponentSize;
37
24
  } & React.RefAttributes<HTMLButtonElement>>, ToolbarGroup: React.ForwardRefExoticComponent<Omit<Omit<Omit<import("@base-ui/react/toolbar").ToolbarGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref">, "size"> & {
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ import { Toolbar as BaseToolbar } from '@base-ui/react/toolbar';
3
+ import { part } from './parts.js';
4
+ export const Toolbar = {
5
+ ...BaseToolbar,
6
+ Root: /* @__PURE__ */ part(BaseToolbar.Root, 'pui-toolbar'),
7
+ Group: /* @__PURE__ */ part(BaseToolbar.Group, 'pui-toolbar-group'),
8
+ Button: /* @__PURE__ */ part(BaseToolbar.Button, 'pui-button pui-toolbar-button'),
9
+ Link: /* @__PURE__ */ part(BaseToolbar.Link, 'pui-button pui-toolbar-link'),
10
+ Input: /* @__PURE__ */ part(BaseToolbar.Input, 'pui-input pui-toolbar-input'),
11
+ Separator: /* @__PURE__ */ part(BaseToolbar.Separator, 'pui-toolbar-separator'),
12
+ };
13
+ // Flat names for React Server Components, which cannot dot into client exports.
14
+ export const { Button: ToolbarButton, Group: ToolbarGroup, Input: ToolbarInput, Link: ToolbarLink, Root: ToolbarRoot, Separator: ToolbarSeparator, } = Toolbar;
package/dist/tooltip.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import * as React from 'react';
2
+ import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';
2
3
  export declare function TooltipProvider({ delayDuration, skipDelayDuration, children, }: {
3
4
  delayDuration?: number;
4
5
  skipDelayDuration?: number;
5
6
  children: React.ReactNode;
6
7
  }): React.JSX.Element;
7
- export declare function Tooltip({ label, enabled, children, }: {
8
+ export declare function Tooltip({ label, enabled, side, align, sideOffset, children, }: {
8
9
  label: string;
9
10
  enabled?: boolean;
10
11
  children: React.ReactElement;
11
- }): React.JSX.Element;
12
+ } & Pick<React.ComponentPropsWithoutRef<typeof BaseTooltip.Positioner>, 'side' | 'align' | 'sideOffset'>): React.JSX.Element;
package/dist/tooltip.js CHANGED
@@ -5,9 +5,9 @@ import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';
5
5
  export function TooltipProvider({ delayDuration = 150, skipDelayDuration = 300, children, }) {
6
6
  return (_jsx(BaseTooltip.Provider, { delay: delayDuration, closeDelay: 0, timeout: skipDelayDuration, children: children }));
7
7
  }
8
- export function Tooltip({ label, enabled = true, children, }) {
8
+ export function Tooltip({ label, enabled = true, side = 'right', align, sideOffset = 10, children, }) {
9
9
  const scheme = useComponentSize();
10
10
  if (!enabled)
11
11
  return children;
12
- return (_jsxs(BaseTooltip.Root, { children: [_jsx(BaseTooltip.Trigger, { render: children }), _jsx(BaseTooltip.Portal, { children: _jsx(BaseTooltip.Positioner, { side: 'right', sideOffset: 10, collisionPadding: 8, className: 'pui-positioner pui-tooltip-positioner', children: _jsx(BaseTooltip.Popup, { className: 'pui-tooltip', "data-ui-size": scheme, children: label }) }) })] }));
12
+ return (_jsxs(BaseTooltip.Root, { children: [_jsx(BaseTooltip.Trigger, { render: children }), _jsx(BaseTooltip.Portal, { children: _jsx(BaseTooltip.Positioner, { side: side, align: align, sideOffset: sideOffset, collisionPadding: 8, className: 'pui-positioner pui-tooltip-positioner', children: _jsx(BaseTooltip.Popup, { className: 'pui-tooltip', "data-ui-size": scheme, children: label }) }) })] }));
13
13
  }
package/dist/tree.js CHANGED
@@ -2,11 +2,13 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { createElement as _createElement } from "react";
4
4
  import * as React from 'react';
5
+ import { Icon } from './icon.js';
5
6
  import { useComponentSize } from './sizing.js';
6
7
  import { buildProxiedInstance, syncDataLoaderFeature, } from '@headless-tree/core';
7
8
  import { useTree } from '@headless-tree/react';
8
9
  import { defaultRangeExtractor, useVirtualizer, } from '@tanstack/react-virtual';
9
10
  import { ScrollArea } from './scroll-area.js';
11
+ import { cx } from './parts.js';
10
12
  const normalize = (text) => text.normalize('NFKC').toLocaleLowerCase();
11
13
  /** Loaded, immutable hierarchy. Remote loading, permission checks and mutations remain caller-owned. */
12
14
  export function Tree({ nodes, label, expandedIds, defaultExpandedIds = [], onExpandedIdsChange, selectedIds, defaultSelectedIds = [], onSelectedIdsChange, selectionMode = 'single', height = 320, rowHeight: explicitRowHeight, size, virtualized = true, emptyLabel = 'No items.', dir, className, }) {
@@ -271,7 +273,7 @@ export function Tree({ nodes, label, expandedIds, defaultExpandedIds = [], onExp
271
273
  .getVirtualItems()
272
274
  .map((row) => ({ index: row.index, start: row.start }))
273
275
  : items.map((_, index) => ({ index, start: index * rowHeight }));
274
- return (_jsx(ScrollArea, { orientation: 'vertical', label: `${label} scroll area`, tabIndex: -1, ref: viewport, scrollChain: 'contain', rootClassName: ['pui-tree-scroll', className].filter(Boolean).join(' '), dir: dir, rootStyle: { blockSize: height, direction: dir }, className: 'pui-tree-viewport', children: items.length ? (_jsx("div", { ...containerProps, ref: (element) => {
276
+ return (_jsx(ScrollArea, { orientation: 'vertical', label: `${label} scroll area`, tabIndex: -1, ref: viewport, scrollChain: 'contain', rootClassName: cx('pui-tree-scroll', className), dir: dir, rootStyle: { blockSize: height, direction: dir }, className: 'pui-tree-viewport', children: items.length ? (_jsx("div", { ...containerProps, ref: (element) => {
275
277
  container.current = element;
276
278
  containerProps.ref(element);
277
279
  }, dir: dir, className: 'pui-tree', "data-ui-size": scheme, "aria-multiselectable": selectionMode === 'multiple' || undefined, onKeyDown: keydown, onFocusCapture: () => {
@@ -305,7 +307,7 @@ export function Tree({ nodes, label, expandedIds, defaultExpandedIds = [], onExp
305
307
  item.collapse();
306
308
  else
307
309
  item.expand();
308
- }, children: _jsx("svg", { "aria-hidden": 'true', width: '14', height: '14', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '1.6', "data-expanded": item.isExpanded() || undefined, children: _jsx("path", { d: 'm9 5 7 7-7 7' }) }) })) : (_jsx("span", { className: 'pui-tree-leaf', "aria-hidden": 'true' })),
310
+ }, children: _jsx(Icon, { name: 'chevron-forward', "data-expanded": item.isExpanded() || undefined }) })) : (_jsx("span", { className: 'pui-tree-leaf', "aria-hidden": 'true' })),
309
311
  _jsx("span", { className: 'pui-tree-label', children: node.label })));
310
312
  }) })) : (_jsx("div", { role: 'status', className: 'pui-tree-empty', children: emptyLabel })) }));
311
313
  }
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ export declare function Heading({ level, size, className, ...props }: React.HTMLAttributes<HTMLHeadingElement> & {
3
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
4
+ size?: 'display' | 'title' | 'page' | 'section' | 'subsection' | 'workspace' | 'document';
5
+ }): React.JSX.Element;
6
+ export declare function Text({ as: Tag, variant, color, weight, className, ...props }: React.HTMLAttributes<HTMLElement> & {
7
+ as?: 'p' | 'span' | 'div';
8
+ variant?: 'body' | 'reading' | 'table' | 'caption' | 'label' | 'mono' | 'metric';
9
+ color?: 'primary' | 'secondary' | 'muted';
10
+ weight?: 'regular' | 'medium';
11
+ }): React.JSX.Element;
12
+ export declare const Prose: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,14 @@
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 Heading({ level = 2, size = 'section', className, ...props }) {
6
+ const Tag = `h${level}`;
7
+ return (_jsx(Tag, { ...props, className: cx('pui-heading', className), "data-size": size }));
8
+ }
9
+ export function Text({ as: Tag = 'p', variant = 'body', color = 'primary', weight = 'regular', className, ...props }) {
10
+ return (_jsx(Tag, { ...props, className: cx('pui-text', className), "data-variant": variant, "data-color": color, "data-weight": weight }));
11
+ }
12
+ export const Prose = /* @__PURE__ */ React.forwardRef(function Prose({ className, ...props }, ref) {
13
+ return _jsx("div", { ...props, ref: ref, className: cx('pui-prose', className) });
14
+ });