@surflane/ui 0.0.0-stage → 0.2.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 (89) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/LICENSE-MIT +18 -0
  3. package/README.md +55 -2
  4. package/dist/advanced-forms.d.ts +115 -0
  5. package/dist/advanced-forms.js +93 -0
  6. package/dist/app-shell.d.ts +23 -0
  7. package/dist/app-shell.js +29 -0
  8. package/dist/button.d.ts +11 -0
  9. package/dist/button.js +16 -0
  10. package/dist/chart.d.ts +48 -0
  11. package/dist/chart.js +126 -0
  12. package/dist/commands.d.ts +47 -0
  13. package/dist/commands.js +27 -0
  14. package/dist/content.d.ts +59 -0
  15. package/dist/content.js +104 -0
  16. package/dist/context-overlays.d.ts +95 -0
  17. package/dist/context-overlays.js +50 -0
  18. package/dist/data.d.ts +95 -0
  19. package/dist/data.js +40 -0
  20. package/dist/date-picker.d.ts +23 -0
  21. package/dist/date-picker.js +39 -0
  22. package/dist/dialog-focus.d.ts +5 -0
  23. package/dist/dialog-focus.js +35 -0
  24. package/dist/dialog.d.ts +59 -0
  25. package/dist/dialog.js +49 -0
  26. package/dist/feedback.d.ts +76 -0
  27. package/dist/feedback.js +35 -0
  28. package/dist/file-upload.d.ts +77 -0
  29. package/dist/file-upload.js +344 -0
  30. package/dist/filter-bar.d.ts +17 -0
  31. package/dist/filter-bar.js +23 -0
  32. package/dist/form-state.d.ts +5 -0
  33. package/dist/form-state.js +63 -0
  34. package/dist/forms.d.ts +91 -0
  35. package/dist/forms.js +109 -0
  36. package/dist/foundations.d.ts +51 -0
  37. package/dist/foundations.js +55 -0
  38. package/dist/icon.d.ts +37 -0
  39. package/dist/icon.js +28 -0
  40. package/dist/index.d.ts +37 -0
  41. package/dist/index.js +38 -0
  42. package/dist/input-extensions.d.ts +117 -0
  43. package/dist/input-extensions.js +64 -0
  44. package/dist/input.d.ts +7 -0
  45. package/dist/input.js +10 -0
  46. package/dist/markdown.d.ts +15 -0
  47. package/dist/markdown.js +121 -0
  48. package/dist/menu.d.ts +79 -0
  49. package/dist/menu.js +44 -0
  50. package/dist/messages.d.ts +63 -0
  51. package/dist/messages.js +38 -0
  52. package/dist/navigation-menu.d.ts +52 -0
  53. package/dist/navigation-menu.js +31 -0
  54. package/dist/navigation.d.ts +107 -0
  55. package/dist/navigation.js +108 -0
  56. package/dist/otp-field.d.ts +12 -0
  57. package/dist/otp-field.js +46 -0
  58. package/dist/pagination.d.ts +23 -0
  59. package/dist/pagination.js +44 -0
  60. package/dist/panels.d.ts +66 -0
  61. package/dist/panels.js +99 -0
  62. package/dist/parts.d.ts +9 -0
  63. package/dist/parts.js +22 -0
  64. package/dist/popover.d.ts +21 -0
  65. package/dist/popover.js +13 -0
  66. package/dist/scroll-area.d.ts +8 -0
  67. package/dist/scroll-area.js +39 -0
  68. package/dist/select.d.ts +33 -0
  69. package/dist/select.js +97 -0
  70. package/dist/sizing.d.ts +13 -0
  71. package/dist/sizing.js +23 -0
  72. package/dist/slot.d.ts +2 -0
  73. package/dist/slot.js +10 -0
  74. package/dist/status.d.ts +22 -0
  75. package/dist/status.js +17 -0
  76. package/dist/syntax-engine.d.ts +5 -0
  77. package/dist/syntax-engine.js +129 -0
  78. package/dist/syntax-highlighter.d.ts +17 -0
  79. package/dist/syntax-highlighter.js +64 -0
  80. package/dist/toast.d.ts +59 -0
  81. package/dist/toast.js +99 -0
  82. package/dist/tone-transition.d.ts +4 -0
  83. package/dist/tone-transition.js +81 -0
  84. package/dist/tooltip.d.ts +11 -0
  85. package/dist/tooltip.js +13 -0
  86. package/dist/tree.d.ts +28 -0
  87. package/dist/tree.js +311 -0
  88. package/package.json +109 -4
  89. package/src/styles.css +3799 -0
@@ -0,0 +1,108 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useComponentSize } from './sizing.js';
5
+ import { Tabs as BaseTabs } from '@base-ui/react/tabs';
6
+ import { Accordion as BaseAccordion } from '@base-ui/react/accordion';
7
+ import { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible';
8
+ import { Avatar as BaseAvatar } from '@base-ui/react/avatar';
9
+ import { Separator as BaseSeparator } from '@base-ui/react/separator';
10
+ import { skin, part } from './parts.js';
11
+ export const Tabs = {
12
+ ...BaseTabs,
13
+ Root: part(BaseTabs.Root, 'pui-tabs'),
14
+ List: part(BaseTabs.List, 'pui-tabs-list'),
15
+ Tab: part(BaseTabs.Tab, 'pui-tabs-tab'),
16
+ Panel: part(BaseTabs.Panel, 'pui-tabs-panel'),
17
+ Indicator: part(BaseTabs.Indicator, 'pui-tabs-indicator'),
18
+ };
19
+ function Chevron() {
20
+ return (_jsx("svg", { className: 'pui-disclosure-chevron', width: '16', height: '16', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '1.5', "aria-hidden": 'true', children: _jsx("path", { d: 'm9 6 6 6-6 6' }) }));
21
+ }
22
+ function AccordionRoot({ className, ...props }) {
23
+ return (_jsx(BaseAccordion.Root, { ...props, className: skin('pui-accordion', className) }));
24
+ }
25
+ const AccordionTrigger = React.forwardRef(function AccordionTrigger({ className, children, indicator, ...props }, ref) {
26
+ return (_jsxs(BaseAccordion.Trigger, { ...props, ref: ref, className: skin('pui-disclosure-trigger', className), children: [_jsx("span", { className: 'pui-disclosure-label', children: children }), indicator === undefined ? _jsx(Chevron, {}) : indicator] }));
27
+ });
28
+ const AccordionPanel = React.forwardRef(function AccordionPanel({ className, children, render, ...props }, ref) {
29
+ return (_jsx(BaseAccordion.Panel, { ...props, ref: ref, className: skin('pui-accordion-panel', className), render: render ??
30
+ ((panelProps, state) => (_jsx("div", { ...panelProps, inert: state.transitionStatus === 'ending' || undefined, "aria-hidden": state.transitionStatus === 'ending' || undefined }))), children: _jsx("div", { className: 'pui-disclosure-body', children: children }) }));
31
+ });
32
+ export const Accordion = {
33
+ ...BaseAccordion,
34
+ Root: AccordionRoot,
35
+ Item: part(BaseAccordion.Item, 'pui-accordion-item'),
36
+ Header: part(BaseAccordion.Header, 'pui-accordion-header'),
37
+ Trigger: AccordionTrigger,
38
+ Panel: AccordionPanel,
39
+ };
40
+ const CollapsibleTrigger = React.forwardRef(function CollapsibleTrigger({ className, children, indicator, ...props }, ref) {
41
+ return (_jsxs(BaseCollapsible.Trigger, { ...props, ref: ref, className: skin('pui-disclosure-trigger', className), children: [_jsx("span", { className: 'pui-disclosure-label', children: children }), indicator === undefined ? _jsx(Chevron, {}) : indicator] }));
42
+ });
43
+ const CollapsiblePanel = React.forwardRef(function CollapsiblePanel({ className, children, ...props }, ref) {
44
+ return (_jsx(BaseCollapsible.Panel, { ...props, ref: ref, className: skin('pui-collapsible-panel', className), children: _jsx("div", { className: 'pui-disclosure-body', children: children }) }));
45
+ });
46
+ export const Collapsible = {
47
+ ...BaseCollapsible,
48
+ Root: part(BaseCollapsible.Root, 'pui-collapsible'),
49
+ Trigger: CollapsibleTrigger,
50
+ Panel: CollapsiblePanel,
51
+ };
52
+ const AvatarRoot = React.forwardRef(function AvatarRoot({ size, className, ...props }, ref) {
53
+ const scheme = useComponentSize(size);
54
+ return (_jsx(BaseAvatar.Root, { ...props, ref: ref, "data-size": size, "data-ui-size": scheme, className: skin('pui-avatar', className) }));
55
+ });
56
+ function Person() {
57
+ return (_jsxs("svg", { width: '18', height: '18', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: '1.5', "aria-hidden": 'true', children: [_jsx("circle", { cx: '12', cy: '8', r: '4' }), _jsx("path", { d: 'M4 21v-2a8 8 0 0 1 16 0v2' })] }));
58
+ }
59
+ const AvatarFallback = React.forwardRef(function AvatarFallback({ children, className, ...props }, ref) {
60
+ return (_jsx(BaseAvatar.Fallback, { ...props, ref: ref, className: skin('pui-avatar-fallback', className), children: children ?? _jsx(Person, {}) }));
61
+ });
62
+ export const Avatar = {
63
+ ...BaseAvatar,
64
+ Root: AvatarRoot,
65
+ Status: part('span', 'pui-avatar-status'),
66
+ Fallback: AvatarFallback,
67
+ Image: part(BaseAvatar.Image, 'pui-avatar-image'),
68
+ };
69
+ export const Separator = React.forwardRef(function Separator({ inset = false, className, ...props }, ref) {
70
+ return (_jsx(BaseSeparator, { ...props, ref: ref, "data-inset": inset || undefined, className: skin('pui-separator', className) }));
71
+ });
72
+ export const Link = React.forwardRef(function Link({ className, ...props }, ref) {
73
+ return (_jsx("a", { ...props, ref: ref, className: ['pui-link', className].filter(Boolean).join(' ') }));
74
+ });
75
+ const BreadcrumbRoot = React.forwardRef(function BreadcrumbRoot({ className, 'aria-label': label = 'Breadcrumb', ...props }, ref) {
76
+ return (_jsx("nav", { ...props, ref: ref, "aria-label": label, className: ['pui-breadcrumbs', className].filter(Boolean).join(' ') }));
77
+ });
78
+ const BreadcrumbList = React.forwardRef(function BreadcrumbList({ className, role = 'list', ...props }, ref) {
79
+ return (_jsx("ol", { ...props, role: role, ref: ref, className: ['pui-breadcrumb-list', className].filter(Boolean).join(' ') }));
80
+ });
81
+ const BreadcrumbItem = React.forwardRef(function BreadcrumbItem({ className, ...props }, ref) {
82
+ return (_jsx("li", { ...props, ref: ref, className: ['pui-breadcrumb-item', className].filter(Boolean).join(' ') }));
83
+ });
84
+ function BreadcrumbSeparator({ className, ...props }) {
85
+ return (_jsx("span", { ...props, className: ['pui-breadcrumb-separator', className]
86
+ .filter(Boolean)
87
+ .join(' '), "aria-hidden": 'true', children: _jsx(Chevron, {}) }));
88
+ }
89
+ function BreadcrumbCurrent({ className, ...props }) {
90
+ return (_jsx("span", { ...props, className: ['pui-breadcrumb-current', className]
91
+ .filter(Boolean)
92
+ .join(' '), "aria-current": 'page' }));
93
+ }
94
+ export const Breadcrumbs = {
95
+ Root: BreadcrumbRoot,
96
+ List: BreadcrumbList,
97
+ Item: BreadcrumbItem,
98
+ Link,
99
+ Separator: BreadcrumbSeparator,
100
+ Current: BreadcrumbCurrent,
101
+ };
102
+ // Flat names for React Server Components, which cannot dot into client exports.
103
+ export { AccordionPanel, AccordionRoot, AccordionTrigger, AvatarFallback, AvatarRoot, CollapsiblePanel, CollapsibleTrigger, };
104
+ export const { Header: AccordionHeader, Item: AccordionItem } = Accordion;
105
+ export const { Image: AvatarImage, Status: AvatarStatus } = Avatar;
106
+ export const { Root: BreadcrumbsRoot, List: BreadcrumbsList, Item: BreadcrumbsItem, Link: BreadcrumbsLink, Separator: BreadcrumbsSeparator, Current: BreadcrumbsCurrent, } = Breadcrumbs;
107
+ export const { Root: CollapsibleRoot } = Collapsible;
108
+ export const { Indicator: TabsIndicator, List: TabsList, Panel: TabsPanel, Root: TabsRoot, Tab: TabsTab, } = Tabs;
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ export declare const OTPField: {
3
+ Root: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/otp-field").OTPFieldRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
4
+ Input: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/otp-field").OTPFieldInputProps, "ref"> & React.RefAttributes<HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>;
5
+ Group: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
6
+ size?: import("./sizing.js").ComponentSize;
7
+ } & React.RefAttributes<HTMLDivElement>>;
8
+ Separator: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react").SeparatorProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
9
+ };
10
+ export declare const OTPFieldInput: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/otp-field").OTPFieldInputProps, "ref"> & React.RefAttributes<HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>, OTPFieldRoot: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/otp-field").OTPFieldRootProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>, OTPFieldSeparator: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react").SeparatorProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>, OTPFieldGroup: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "size"> & {
11
+ size?: import("./sizing.js").ComponentSize;
12
+ } & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,46 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useRender } from '@base-ui/react/use-render';
5
+ import { OTPField as BaseOTPField } from '@base-ui/react/otp-field';
6
+ import { part, skin } from './parts.js';
7
+ import { useResetValue, useRootRef } from './form-state.js';
8
+ const Root = React.forwardRef(function Root({ value, defaultValue = '', form, onValueChange, className, ...props }, forwardedRef) {
9
+ const [element, ref] = useRootRef(forwardedRef);
10
+ const [local, setLocal, revision] = useResetValue(value, defaultValue, element, form);
11
+ return (_jsx(BaseOTPField.Root, { ...props, ref: ref, form: form, value: local, className: skin('pui-otp-field', className), onValueChange: (next, event) => {
12
+ onValueChange?.(next, event);
13
+ if (value === undefined && !event.isCanceled)
14
+ setLocal(next);
15
+ } }, revision));
16
+ });
17
+ const Separator = React.forwardRef(function Separator({ className, ...props }, ref) {
18
+ return (_jsx(BaseOTPField.Separator, { "aria-hidden": 'true', ...props, ref: ref, className: skin('pui-otp-separator', className) }));
19
+ });
20
+ // Preserve Base UI's DOM refs and user render composition while fixing native-validation ARIA.
21
+ function SlotElement({ domProps, state, render, }) {
22
+ const { ref, ...props } = domProps;
23
+ return useRender({
24
+ defaultTagName: 'input',
25
+ ref,
26
+ render: typeof render === 'function'
27
+ ? (nextProps) => render(nextProps, state)
28
+ : render,
29
+ props: {
30
+ ...props,
31
+ 'aria-invalid': !state.disabled && state.valid === false ? true : props['aria-invalid'],
32
+ },
33
+ });
34
+ }
35
+ const Input = React.forwardRef(function Input({ render, className, ...props }, ref) {
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
+ });
38
+ export const OTPField = {
39
+ ...BaseOTPField,
40
+ Root,
41
+ Input,
42
+ Group: part('div', 'pui-otp-group'),
43
+ Separator,
44
+ };
45
+ // Flat names for React Server Components, which cannot dot into client exports.
46
+ export const { Input: OTPFieldInput, Root: OTPFieldRoot, Separator: OTPFieldSeparator, Group: OTPFieldGroup, } = OTPField;
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ type CommonPaginationProps = Omit<React.ComponentPropsWithoutRef<'nav'>, 'children'> & {
3
+ page: number;
4
+ pageCount: number;
5
+ siblings?: 0 | 1 | 2;
6
+ disabled?: boolean;
7
+ labels?: {
8
+ previous?: string;
9
+ next?: string;
10
+ page?: (page: number) => string;
11
+ more?: string;
12
+ summary?: (page: number, pageCount: number) => string;
13
+ };
14
+ };
15
+ export type PaginationProps = CommonPaginationProps & ({
16
+ getPageHref: (page: number) => string;
17
+ onPageChange?: never;
18
+ } | {
19
+ getPageHref?: never;
20
+ onPageChange: (page: number) => void;
21
+ });
22
+ export declare const Pagination: React.ForwardRefExoticComponent<PaginationProps & React.RefAttributes<HTMLElement>>;
23
+ export {};
@@ -0,0 +1,44 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ 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) {
9
+ const count = Number.isFinite(pageCount)
10
+ ? Math.min(Number.MAX_SAFE_INTEGER, Math.max(0, Math.floor(pageCount)))
11
+ : 0;
12
+ if (count < 2)
13
+ return null;
14
+ const current = Math.min(count, Math.max(1, Number.isFinite(page) ? Math.floor(page) : 1));
15
+ const reach = Math.min(2, Math.max(0, Math.floor(siblings)));
16
+ const pages = new Set([1, count]);
17
+ for (let n = Math.max(1, current - reach); n <= Math.min(count, current + reach); n++)
18
+ pages.add(n);
19
+ const sorted = [...pages].sort((a, b) => a - b), items = [];
20
+ sorted.forEach((n, i) => {
21
+ const previous = sorted[i - 1];
22
+ if (i > 0 && n - previous === 2)
23
+ items.push(previous + 1);
24
+ else if (i > 0 && n - previous > 2)
25
+ items.push(`gap-${previous}`);
26
+ items.push(n);
27
+ });
28
+ function control(target, name, children, boundary = false) {
29
+ const inactive = disabled || boundary;
30
+ const currentPage = !boundary && target === current && typeof children === 'number';
31
+ const attributes = {
32
+ className: 'pui-pagination-control',
33
+ 'aria-label': name,
34
+ 'aria-current': currentPage ? 'page' : undefined,
35
+ };
36
+ if (getPageHref)
37
+ return inactive ? (_jsx("span", { ...attributes, "aria-disabled": 'true', children: children })) : (_jsx("a", { ...attributes, href: getPageHref(target), children: children }));
38
+ return (_jsx(Button, { ...attributes, variant: 'ghost', type: 'button', disabled: inactive, onClick: () => {
39
+ if (target !== current)
40
+ onPageChange?.(target);
41
+ }, children: children }));
42
+ }
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)] }));
44
+ });
@@ -0,0 +1,66 @@
1
+ import * as React from 'react';
2
+ import { type ComponentSizeAlias } from './sizing.js';
3
+ import { Dialog as BaseDialog } from '@base-ui/react/dialog';
4
+ 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;
13
+ declare function DrawerRoot({ side, modal, ...props }: Omit<React.ComponentProps<typeof BaseDrawer.Root>, 'swipeDirection'> & {
14
+ side?: PanelSide;
15
+ }): 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
+ 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
+ declare function DrawerTitle({ className, ...props }: React.ComponentProps<typeof BaseDrawer.Title>): React.JSX.Element;
23
+ 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
+ export declare const Drawer: {
42
+ Root: typeof DrawerRoot;
43
+ Content: React.ForwardRefExoticComponent<Omit<Omit<import("@base-ui/react/drawer").DrawerPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>, "ref"> & PanelOptions & React.RefAttributes<HTMLDivElement>>;
44
+ PrimitiveContent: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerContentProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
45
+ Header: typeof Header;
46
+ Body: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
47
+ Footer: typeof Footer;
48
+ Title: typeof DrawerTitle;
49
+ Description: typeof DrawerDescription;
50
+ Backdrop: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerBackdropProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
51
+ Close: BaseDrawer.Close;
52
+ Indent: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerIndentProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
53
+ IndentBackground: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerIndentBackgroundProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
54
+ Popup: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
55
+ Portal: BaseDrawer.Portal;
56
+ Provider: typeof BaseDrawer.Provider;
57
+ SwipeArea: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerSwipeAreaProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
58
+ Trigger: BaseDrawer.Trigger;
59
+ Viewport: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/drawer").DrawerViewportProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
60
+ VirtualKeyboardProvider: typeof BaseDrawer.VirtualKeyboardProvider;
61
+ createHandle: typeof BaseDrawer.createHandle;
62
+ Handle: typeof BaseDrawer.Handle;
63
+ };
64
+ export { DrawerContent, DrawerDescription, DrawerRoot, DrawerTitle, SheetDescription, SheetRoot, SheetTitle, SheetContent, };
65
+ 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;
package/dist/panels.js ADDED
@@ -0,0 +1,99 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { useComponentSize, normalizeSize, } from './sizing.js';
5
+ import { Dialog as BaseDialog } from '@base-ui/react/dialog';
6
+ import { Drawer as BaseDrawer } from '@base-ui/react/drawer';
7
+ const SheetSide = React.createContext({
8
+ side: 'right',
9
+ modal: true,
10
+ });
11
+ const DrawerSide = React.createContext({
12
+ side: 'bottom',
13
+ modal: true,
14
+ });
15
+ const cx = (...values) => values.filter(Boolean).join(' ');
16
+ function CloseIcon() {
17
+ return (_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' }) }));
18
+ }
19
+ function SheetRoot({ side = 'right', modal = true, ...props }) {
20
+ return (_jsx(SheetSide.Provider, { value: { side, modal }, children: _jsx(BaseDialog.Root, { ...props, modal: modal }) }));
21
+ }
22
+ function DrawerRoot({ side = 'bottom', modal = true, ...props }) {
23
+ const direction = {
24
+ left: 'left',
25
+ right: 'right',
26
+ top: 'up',
27
+ bottom: 'down',
28
+ };
29
+ return (_jsx(DrawerSide.Provider, { value: { side, modal }, children: _jsx(BaseDrawer.Root, { ...props, modal: modal, swipeDirection: direction[side] }) }));
30
+ }
31
+ const SheetContent = React.forwardRef(function SheetContent({ size, closeLabel = 'Close panel', className, children, ...props }, ref) {
32
+ const scheme = useComponentSize(size);
33
+ const { side, modal } = React.useContext(SheetSide);
34
+ return (_jsx(BaseDialog.Portal, { children: _jsxs("div", { className: 'pui-panel-layer', "data-ui-size": scheme, children: [modal === true && (_jsx(BaseDialog.Backdrop, { className: 'pui-panel-backdrop' })), _jsx("div", { className: 'pui-panel-viewport', "data-side": side, children: _jsxs(BaseDialog.Popup, { ...props, ref: ref, className: cx('pui-panel', typeof className === 'string' ? className : undefined), "data-side": side, "data-size": size
35
+ ? normalizeSize(size) === 'small'
36
+ ? 'sm'
37
+ : normalizeSize(size) === 'large'
38
+ ? 'lg'
39
+ : 'md'
40
+ : 'md', children: [_jsx(BaseDialog.Close, { className: 'pui-panel-close pui-icon-button', "aria-label": closeLabel, children: _jsx(CloseIcon, {}) }), children] }) })] }) }));
41
+ });
42
+ const DrawerContent = React.forwardRef(function DrawerContent({ size, closeLabel = 'Close panel', className, children, ...props }, ref) {
43
+ const scheme = useComponentSize(size);
44
+ const { side, modal } = React.useContext(DrawerSide);
45
+ const KeyboardProvider = side === 'bottom' ? BaseDrawer.VirtualKeyboardProvider : React.Fragment;
46
+ 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, children: _jsxs(BaseDrawer.Popup, { ...props, ref: ref, className: cx('pui-panel pui-drawer', typeof className === 'string' ? className : undefined), "data-side": side, "data-size": size
47
+ ? normalizeSize(size) === 'small'
48
+ ? 'sm'
49
+ : normalizeSize(size) === 'large'
50
+ ? 'lg'
51
+ : 'md'
52
+ : 'lg', 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(CloseIcon, {}) }), _jsx(BaseDrawer.Content, { className: 'pui-panel-content', children: children })] }) })] }) }) }));
53
+ });
54
+ function Header({ className, ...props }) {
55
+ return _jsx("div", { ...props, className: cx('pui-panel-header', className) });
56
+ }
57
+ const Body = React.forwardRef(function Body({ className, ...props }, ref) {
58
+ return (_jsx("div", { ...props, ref: ref, className: cx('pui-panel-body', className) }));
59
+ });
60
+ function Footer({ className, ...props }) {
61
+ return _jsx("div", { ...props, className: cx('pui-panel-footer', className) });
62
+ }
63
+ function SheetTitle({ className, ...props }) {
64
+ return (_jsx(BaseDialog.Title, { ...props, className: cx('pui-panel-title', typeof className === 'string' ? className : undefined) }));
65
+ }
66
+ function SheetDescription({ className, ...props }) {
67
+ return (_jsx(BaseDialog.Description, { ...props, className: cx('pui-panel-description', typeof className === 'string' ? className : undefined) }));
68
+ }
69
+ function DrawerTitle({ className, ...props }) {
70
+ return (_jsx(BaseDrawer.Title, { ...props, className: cx('pui-panel-title', typeof className === 'string' ? className : undefined) }));
71
+ }
72
+ function DrawerDescription({ className, ...props }) {
73
+ return (_jsx(BaseDrawer.Description, { ...props, className: cx('pui-panel-description', typeof className === 'string' ? className : undefined) }));
74
+ }
75
+ export const Sheet = {
76
+ ...BaseDialog,
77
+ Root: SheetRoot,
78
+ Content: SheetContent,
79
+ Header,
80
+ Body,
81
+ Footer,
82
+ Title: SheetTitle,
83
+ Description: SheetDescription,
84
+ };
85
+ export const Drawer = {
86
+ ...BaseDrawer,
87
+ Root: DrawerRoot,
88
+ Content: DrawerContent,
89
+ PrimitiveContent: BaseDrawer.Content,
90
+ Header,
91
+ Body,
92
+ Footer,
93
+ Title: DrawerTitle,
94
+ Description: DrawerDescription,
95
+ };
96
+ // Flat names for React Server Components, which cannot dot into client exports.
97
+ export { DrawerContent, DrawerDescription, DrawerRoot, DrawerTitle, SheetDescription, SheetRoot, SheetTitle, SheetContent, };
98
+ 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;
99
+ export const { Backdrop: SheetBackdrop, Close: SheetClose, Handle: SheetHandle, Popup: SheetPopup, Portal: SheetPortal, Trigger: SheetTrigger, Viewport: SheetViewport, Header: SheetHeader, Body: SheetBody, Footer: SheetFooter, } = Sheet;
@@ -0,0 +1,9 @@
1
+ import { type ComponentSize } from './sizing.js';
2
+ import * as React from 'react';
3
+ /** Preserve Base UI's state-dependent className contract when adding a skin. */
4
+ export declare function skin<State>(base: string, custom?: string | ((state: State) => string | undefined)): string | ((state: State) => string);
5
+ export declare function part<Element extends HTMLElement, Props extends {
6
+ className?: unknown;
7
+ }>(Component: React.ElementType, base: string): React.ForwardRefExoticComponent<React.PropsWithoutRef<Omit<Props, "size"> & {
8
+ size?: ComponentSize;
9
+ }> & React.RefAttributes<Element>>;
package/dist/parts.js ADDED
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { ComponentSizeContext, useComponentSize, } from './sizing.js';
3
+ import * as React from 'react';
4
+ /** Preserve Base UI's state-dependent className contract when adding a skin. */
5
+ export function skin(base, custom) {
6
+ if (typeof custom === 'function')
7
+ return (state) => [base, custom(state)].filter(Boolean).join(' ');
8
+ return [base, custom].filter(Boolean).join(' ');
9
+ }
10
+ export function part(Component, base) {
11
+ return React.forwardRef(function ThemedPart(props, ref) {
12
+ const { className, size, ...rest } = props;
13
+ const scheme = useComponentSize(size);
14
+ const portal = /positioner|popup|^pui-menu$|navigation-menu-viewport/.test(base);
15
+ const classes = typeof className === 'function'
16
+ ? (state) => [base, className(state)].filter(Boolean).join(' ')
17
+ : [base, className].filter(Boolean).join(' ');
18
+ const element = (_jsx(Component, { ...rest, ref: ref, className: classes, "data-ui-size": size ? scheme : portal ? scheme : undefined }));
19
+ // Keep the React subtree stable when size changes from omitted to explicit.
20
+ return (_jsx(ComponentSizeContext.Provider, { value: scheme, children: element }));
21
+ });
22
+ }
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ import { Popover as BasePopover } from '@base-ui/react/popover';
3
+ declare function PopoverContent({ side, align, sideOffset, collisionPadding, className, ...props }: React.ComponentProps<typeof BasePopover.Popup> & Pick<React.ComponentProps<typeof BasePopover.Positioner>, 'side' | 'align' | 'sideOffset' | 'collisionPadding'>): React.JSX.Element;
4
+ export declare const Popover: {
5
+ Content: typeof PopoverContent;
6
+ Root: typeof BasePopover.Root;
7
+ Trigger: BasePopover.Trigger;
8
+ Portal: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
9
+ Positioner: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverPositionerProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
+ Popup: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
11
+ Arrow: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
+ Backdrop: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverBackdropProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
+ Title: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverTitleProps, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
14
+ Description: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverDescriptionProps, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
15
+ Close: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverCloseProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
16
+ Viewport: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverViewportProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
17
+ createHandle: typeof BasePopover.createHandle;
18
+ Handle: typeof BasePopover.Handle;
19
+ };
20
+ export { PopoverContent };
21
+ export declare const PopoverArrow: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>, PopoverBackdrop: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverBackdropProps, "ref"> & React.RefAttributes<HTMLDivElement>>, PopoverClose: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverCloseProps, "ref"> & React.RefAttributes<HTMLButtonElement>>, PopoverDescription: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverDescriptionProps, "ref"> & React.RefAttributes<HTMLParagraphElement>>, PopoverHandle: typeof BasePopover.Handle, PopoverPopup: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>, PopoverPortal: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverPortalProps, "ref"> & React.RefAttributes<HTMLDivElement>>, PopoverPositioner: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverPositionerProps, "ref"> & React.RefAttributes<HTMLDivElement>>, PopoverRoot: typeof BasePopover.Root, PopoverTitle: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverTitleProps, "ref"> & React.RefAttributes<HTMLHeadingElement>>, PopoverTrigger: BasePopover.Trigger, PopoverViewport: React.ForwardRefExoticComponent<Omit<import("@base-ui/react/popover").PopoverViewportProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useComponentSize } from './sizing.js';
4
+ import { Popover as BasePopover } from '@base-ui/react/popover';
5
+ const cx = (...v) => v.filter(Boolean).join(' ');
6
+ function PopoverContent({ side = 'bottom', align = 'start', sideOffset = 8, collisionPadding = 12, className, ...props }) {
7
+ const scheme = useComponentSize();
8
+ return (_jsx(BasePopover.Positioner, { side: side, align: align, sideOffset: sideOffset, collisionPadding: collisionPadding, className: 'pui-positioner', children: _jsx(BasePopover.Popup, { "data-ui-size": scheme, ...props, className: cx('pui-popover', typeof className === 'string' && className) }) }));
9
+ }
10
+ export const Popover = { ...BasePopover, Content: PopoverContent };
11
+ // Flat names for React Server Components, which cannot dot into client exports.
12
+ export { PopoverContent };
13
+ export const { Arrow: PopoverArrow, Backdrop: PopoverBackdrop, Close: PopoverClose, Description: PopoverDescription, Handle: PopoverHandle, Popup: PopoverPopup, Portal: PopoverPortal, Positioner: PopoverPositioner, Root: PopoverRoot, Title: PopoverTitle, Trigger: PopoverTrigger, Viewport: PopoverViewport, } = Popover;
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ export declare const ScrollArea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
3
+ label?: string;
4
+ rootClassName?: string;
5
+ rootStyle?: React.CSSProperties;
6
+ orientation?: "horizontal" | "vertical" | "both";
7
+ scrollChain?: "auto" | "contain";
8
+ } & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { ScrollArea as BaseScrollArea } from '@base-ui/react/scroll-area';
5
+ export const ScrollArea = React.forwardRef(function ScrollArea({ label, orientation = 'horizontal', scrollChain = 'auto', style, rootClassName, rootStyle, tabIndex = label ? 0 : undefined, role = label ? 'region' : undefined, className, children, ...props }, ref) {
6
+ const dragPointer = React.useRef(null);
7
+ const clearDrag = (event) => {
8
+ if (dragPointer.current !== event.pointerId)
9
+ return;
10
+ dragPointer.current = null;
11
+ event.currentTarget.removeAttribute('data-scroll-dragging');
12
+ };
13
+ return (_jsxs(BaseScrollArea.Root, { className: ['pui-scroll-root', rootClassName].filter(Boolean).join(' '), style: rootStyle, onPointerMoveCapture: (event) => {
14
+ if (event.pointerType === 'touch')
15
+ return;
16
+ const root = event.currentTarget;
17
+ const bounds = root.getBoundingClientRect();
18
+ root.toggleAttribute('data-scroll-near-x', bounds.bottom - event.clientY <= 24 && event.clientY <= bounds.bottom);
19
+ root.toggleAttribute('data-scroll-near-y', bounds.right - event.clientX <= 24 && event.clientX <= bounds.right);
20
+ }, onPointerLeave: (event) => {
21
+ event.currentTarget.removeAttribute('data-scroll-near-x');
22
+ event.currentTarget.removeAttribute('data-scroll-near-y');
23
+ }, onPointerDownCapture: (event) => {
24
+ const target = event.target;
25
+ const bar = target.closest('.pui-scrollbar');
26
+ if (event.button === 0 && bar?.parentElement === event.currentTarget) {
27
+ dragPointer.current = event.pointerId;
28
+ event.currentTarget.setAttribute('data-scroll-dragging', bar.getAttribute('data-orientation') ?? '');
29
+ }
30
+ }, onPointerUpCapture: clearDrag, onPointerCancelCapture: clearDrag, onLostPointerCapture: clearDrag, children: [_jsx(BaseScrollArea.Viewport, { ...props, ref: ref, className: ['pui-scroll-viewport scroll-area', className]
31
+ .filter(Boolean)
32
+ .join(' '), role: role, "aria-label": label, tabIndex: tabIndex, "data-scroll-orientation": orientation, style: {
33
+ overflowX: orientation === 'vertical' ? 'hidden' : 'auto',
34
+ overflowY: orientation === 'horizontal' ? 'hidden' : 'auto',
35
+ overscrollBehaviorX: orientation === 'vertical' ? 'auto' : scrollChain,
36
+ overscrollBehaviorY: orientation === 'horizontal' ? 'auto' : scrollChain,
37
+ ...style,
38
+ }, children: _jsx(BaseScrollArea.Content, { className: 'pui-scroll-content', style: orientation === 'vertical' ? { minWidth: 0 } : undefined, children: children }) }), orientation !== 'vertical' && (_jsx(BaseScrollArea.Scrollbar, { orientation: 'horizontal', className: 'pui-scrollbar', children: _jsx(BaseScrollArea.Thumb, { className: 'pui-scroll-thumb' }) })), orientation !== 'horizontal' && (_jsx(BaseScrollArea.Scrollbar, { orientation: 'vertical', className: 'pui-scrollbar', children: _jsx(BaseScrollArea.Thumb, { className: 'pui-scroll-thumb' }) })), _jsx(BaseScrollArea.Corner, {})] }));
39
+ });
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import { type ComponentSizeAlias } from './sizing.js';
3
+ export type SelectOption = {
4
+ value: string;
5
+ label: React.ReactNode;
6
+ disabled?: boolean;
7
+ };
8
+ export type SelectProps = {
9
+ options: SelectOption[];
10
+ value?: string;
11
+ defaultValue?: string;
12
+ onValueChange?: (value: string) => void;
13
+ name?: string;
14
+ form?: string;
15
+ required?: boolean;
16
+ disabled?: boolean;
17
+ id?: string;
18
+ className?: string;
19
+ inputRef?: React.Ref<HTMLInputElement>;
20
+ triggerRef?: React.Ref<HTMLButtonElement>;
21
+ size?: ComponentSizeAlias;
22
+ 'aria-label'?: string;
23
+ 'aria-labelledby'?: string;
24
+ 'aria-describedby'?: string;
25
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
26
+ };
27
+ export declare function Select({ options, value, defaultValue, onValueChange, className, inputRef, triggerRef, size, ...props }: SelectProps): React.JSX.Element;
28
+ /** Transitional HTML-option adapter. Submitted values use Base UI's native hidden input. */
29
+ export declare const NativeSelect: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.SelectHTMLAttributes<HTMLSelectElement>, HTMLSelectElement>, "ref">, "size" | "multiple"> & {
30
+ size?: ComponentSizeAlias;
31
+ } & React.RefAttributes<HTMLButtonElement>>;
32
+ export declare function NativeSelectOption(props: React.ComponentProps<'option'>): React.JSX.Element;
33
+ export declare function NativeSelectOptGroup(props: React.ComponentProps<'optgroup'>): React.JSX.Element;