@duestel/ui 0.1.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.
- package/README.md +110 -0
- package/dist/components/accordion/Accordion.d.ts +34 -0
- package/dist/components/accordion/Accordion.js +54 -0
- package/dist/components/accordion/Accordion.js.map +1 -0
- package/dist/components/accordion/index.d.ts +1 -0
- package/dist/components/accordion/index.js +2 -0
- package/dist/components/alert-dialog/AlertDialog.d.ts +53 -0
- package/dist/components/alert-dialog/AlertDialog.js +69 -0
- package/dist/components/alert-dialog/AlertDialog.js.map +1 -0
- package/dist/components/alert-dialog/index.d.ts +1 -0
- package/dist/components/alert-dialog/index.js +2 -0
- package/dist/components/autocomplete/Autocomplete.d.ts +90 -0
- package/dist/components/autocomplete/Autocomplete.js +137 -0
- package/dist/components/autocomplete/Autocomplete.js.map +1 -0
- package/dist/components/autocomplete/index.d.ts +1 -0
- package/dist/components/autocomplete/index.js +2 -0
- package/dist/components/avatar/Avatar.d.ts +44 -0
- package/dist/components/avatar/Avatar.js +45 -0
- package/dist/components/avatar/Avatar.js.map +1 -0
- package/dist/components/avatar/index.d.ts +2 -0
- package/dist/components/avatar/index.js +2 -0
- package/dist/components/badge/Badge.d.ts +43 -0
- package/dist/components/badge/Badge.js +32 -0
- package/dist/components/badge/Badge.js.map +1 -0
- package/dist/components/badge/index.d.ts +2 -0
- package/dist/components/badge/index.js +2 -0
- package/dist/components/button/Button.d.ts +60 -0
- package/dist/components/button/Button.js +61 -0
- package/dist/components/button/Button.js.map +1 -0
- package/dist/components/button/index.d.ts +1 -0
- package/dist/components/button/index.js +2 -0
- package/dist/components/carousel/Carousel.d.ts +32 -0
- package/dist/components/carousel/Carousel.js +113 -0
- package/dist/components/carousel/Carousel.js.map +1 -0
- package/dist/components/carousel/index.d.ts +1 -0
- package/dist/components/carousel/index.js +2 -0
- package/dist/components/checkbox/Checkbox.d.ts +64 -0
- package/dist/components/checkbox/Checkbox.js +59 -0
- package/dist/components/checkbox/Checkbox.js.map +1 -0
- package/dist/components/checkbox/index.d.ts +1 -0
- package/dist/components/checkbox/index.js +2 -0
- package/dist/components/collapsible/Collapsible.d.ts +28 -0
- package/dist/components/collapsible/Collapsible.js +40 -0
- package/dist/components/collapsible/Collapsible.js.map +1 -0
- package/dist/components/collapsible/index.d.ts +1 -0
- package/dist/components/collapsible/index.js +2 -0
- package/dist/components/combobox/Combobox.d.ts +113 -0
- package/dist/components/combobox/Combobox.js +189 -0
- package/dist/components/combobox/Combobox.js.map +1 -0
- package/dist/components/combobox/index.d.ts +1 -0
- package/dist/components/combobox/index.js +2 -0
- package/dist/components/command/Command.d.ts +37 -0
- package/dist/components/command/Command.js +90 -0
- package/dist/components/command/Command.js.map +1 -0
- package/dist/components/command/index.d.ts +1 -0
- package/dist/components/command/index.js +2 -0
- package/dist/components/context-menu/ContextMenu.d.ts +76 -0
- package/dist/components/context-menu/ContextMenu.js +132 -0
- package/dist/components/context-menu/ContextMenu.js.map +1 -0
- package/dist/components/context-menu/index.d.ts +1 -0
- package/dist/components/context-menu/index.js +2 -0
- package/dist/components/data-table/DataTable.d.ts +32 -0
- package/dist/components/data-table/DataTable.js +102 -0
- package/dist/components/data-table/DataTable.js.map +1 -0
- package/dist/components/data-table/Table.d.ts +51 -0
- package/dist/components/data-table/Table.js +69 -0
- package/dist/components/data-table/Table.js.map +1 -0
- package/dist/components/data-table/index.d.ts +3 -0
- package/dist/components/data-table/index.js +3 -0
- package/dist/components/date-picker/DatePicker.d.ts +63 -0
- package/dist/components/date-picker/DatePicker.js +247 -0
- package/dist/components/date-picker/DatePicker.js.map +1 -0
- package/dist/components/date-picker/index.d.ts +2 -0
- package/dist/components/date-picker/index.js +2 -0
- package/dist/components/dialog/Dialog.d.ts +59 -0
- package/dist/components/dialog/Dialog.js +71 -0
- package/dist/components/dialog/Dialog.js.map +1 -0
- package/dist/components/dialog/index.d.ts +1 -0
- package/dist/components/dialog/index.js +2 -0
- package/dist/components/drawer/Drawer.d.ts +93 -0
- package/dist/components/drawer/Drawer.js +106 -0
- package/dist/components/drawer/Drawer.js.map +1 -0
- package/dist/components/drawer/index.d.ts +1 -0
- package/dist/components/drawer/index.js +2 -0
- package/dist/components/form/Field.d.ts +52 -0
- package/dist/components/form/Field.js +54 -0
- package/dist/components/form/Field.js.map +1 -0
- package/dist/components/form/Fieldset.d.ts +24 -0
- package/dist/components/form/Fieldset.js +24 -0
- package/dist/components/form/Fieldset.js.map +1 -0
- package/dist/components/form/Form.d.ts +18 -0
- package/dist/components/form/Form.js +14 -0
- package/dist/components/form/Form.js.map +1 -0
- package/dist/components/form/Input.d.ts +33 -0
- package/dist/components/form/Input.js +99 -0
- package/dist/components/form/Input.js.map +1 -0
- package/dist/components/form/app-form.d.ts +71 -0
- package/dist/components/form/app-form.js +95 -0
- package/dist/components/form/app-form.js.map +1 -0
- package/dist/components/form/index.d.ts +5 -0
- package/dist/components/form/index.js +6 -0
- package/dist/components/hotkeys/Kbd.d.ts +20 -0
- package/dist/components/hotkeys/Kbd.js +31 -0
- package/dist/components/hotkeys/Kbd.js.map +1 -0
- package/dist/components/hotkeys/hotkeys.d.ts +14 -0
- package/dist/components/hotkeys/hotkeys.js +2 -0
- package/dist/components/hotkeys/index.d.ts +2 -0
- package/dist/components/hotkeys/index.js +3 -0
- package/dist/components/menu/Menu.d.ts +84 -0
- package/dist/components/menu/Menu.js +142 -0
- package/dist/components/menu/Menu.js.map +1 -0
- package/dist/components/menu/index.d.ts +1 -0
- package/dist/components/menu/index.js +2 -0
- package/dist/components/menubar/Menubar.d.ts +87 -0
- package/dist/components/menubar/Menubar.js +142 -0
- package/dist/components/menubar/Menubar.js.map +1 -0
- package/dist/components/menubar/index.d.ts +1 -0
- package/dist/components/menubar/index.js +2 -0
- package/dist/components/meter/Meter.d.ts +33 -0
- package/dist/components/meter/Meter.js +45 -0
- package/dist/components/meter/Meter.js.map +1 -0
- package/dist/components/meter/index.d.ts +1 -0
- package/dist/components/meter/index.js +2 -0
- package/dist/components/navigation-menu/NavigationMenu.d.ts +81 -0
- package/dist/components/navigation-menu/NavigationMenu.js +112 -0
- package/dist/components/navigation-menu/NavigationMenu.js.map +1 -0
- package/dist/components/navigation-menu/index.d.ts +1 -0
- package/dist/components/navigation-menu/index.js +2 -0
- package/dist/components/number-field/NumberField.d.ts +53 -0
- package/dist/components/number-field/NumberField.js +72 -0
- package/dist/components/number-field/NumberField.js.map +1 -0
- package/dist/components/number-field/index.d.ts +1 -0
- package/dist/components/number-field/index.js +2 -0
- package/dist/components/otp-field/OtpField.d.ts +33 -0
- package/dist/components/otp-field/OtpField.js +31 -0
- package/dist/components/otp-field/OtpField.js.map +1 -0
- package/dist/components/otp-field/index.d.ts +1 -0
- package/dist/components/otp-field/index.js +2 -0
- package/dist/components/pagination/Pagination.d.ts +17 -0
- package/dist/components/pagination/Pagination.js +75 -0
- package/dist/components/pagination/Pagination.js.map +1 -0
- package/dist/components/pagination/index.d.ts +1 -0
- package/dist/components/pagination/index.js +2 -0
- package/dist/components/popover/Popover.d.ts +73 -0
- package/dist/components/popover/Popover.js +97 -0
- package/dist/components/popover/Popover.js.map +1 -0
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/index.js +2 -0
- package/dist/components/preview-card/PreviewCard.d.ts +60 -0
- package/dist/components/preview-card/PreviewCard.js +83 -0
- package/dist/components/preview-card/PreviewCard.js.map +1 -0
- package/dist/components/preview-card/index.d.ts +1 -0
- package/dist/components/preview-card/index.js +2 -0
- package/dist/components/progress/Progress.d.ts +36 -0
- package/dist/components/progress/Progress.js +45 -0
- package/dist/components/progress/Progress.js.map +1 -0
- package/dist/components/progress/index.d.ts +1 -0
- package/dist/components/progress/index.js +2 -0
- package/dist/components/radio/Radio.d.ts +39 -0
- package/dist/components/radio/Radio.js +39 -0
- package/dist/components/radio/Radio.js.map +1 -0
- package/dist/components/radio/index.d.ts +1 -0
- package/dist/components/radio/index.js +2 -0
- package/dist/components/resizable/Resizable.d.ts +35 -0
- package/dist/components/resizable/Resizable.js +38 -0
- package/dist/components/resizable/Resizable.js.map +1 -0
- package/dist/components/resizable/index.d.ts +1 -0
- package/dist/components/resizable/index.js +2 -0
- package/dist/components/scroll-area/ScrollArea.d.ts +37 -0
- package/dist/components/scroll-area/ScrollArea.js +52 -0
- package/dist/components/scroll-area/ScrollArea.js.map +1 -0
- package/dist/components/scroll-area/index.d.ts +1 -0
- package/dist/components/scroll-area/index.js +2 -0
- package/dist/components/select/Select.d.ts +94 -0
- package/dist/components/select/Select.js +151 -0
- package/dist/components/select/Select.js.map +1 -0
- package/dist/components/select/index.d.ts +1 -0
- package/dist/components/select/index.js +2 -0
- package/dist/components/separator/Separator.d.ts +29 -0
- package/dist/components/separator/Separator.js +20 -0
- package/dist/components/separator/Separator.js.map +1 -0
- package/dist/components/separator/index.d.ts +1 -0
- package/dist/components/separator/index.js +2 -0
- package/dist/components/slider/Slider.d.ts +53 -0
- package/dist/components/slider/Slider.js +70 -0
- package/dist/components/slider/Slider.js.map +1 -0
- package/dist/components/slider/index.d.ts +1 -0
- package/dist/components/slider/index.js +2 -0
- package/dist/components/switch/Switch.d.ts +28 -0
- package/dist/components/switch/Switch.js +31 -0
- package/dist/components/switch/Switch.js.map +1 -0
- package/dist/components/switch/index.d.ts +1 -0
- package/dist/components/switch/index.js +2 -0
- package/dist/components/tabs/Tabs.d.ts +41 -0
- package/dist/components/tabs/Tabs.js +45 -0
- package/dist/components/tabs/Tabs.js.map +1 -0
- package/dist/components/tabs/index.d.ts +1 -0
- package/dist/components/tabs/index.js +2 -0
- package/dist/components/toast/Toast.d.ts +70 -0
- package/dist/components/toast/Toast.js +95 -0
- package/dist/components/toast/Toast.js.map +1 -0
- package/dist/components/toast/index.d.ts +1 -0
- package/dist/components/toast/index.js +2 -0
- package/dist/components/toggle/Toggle.d.ts +38 -0
- package/dist/components/toggle/Toggle.js +30 -0
- package/dist/components/toggle/Toggle.js.map +1 -0
- package/dist/components/toggle/index.d.ts +1 -0
- package/dist/components/toggle/index.js +2 -0
- package/dist/components/toolbar/Toolbar.d.ts +50 -0
- package/dist/components/toolbar/Toolbar.js +59 -0
- package/dist/components/toolbar/Toolbar.js.map +1 -0
- package/dist/components/toolbar/index.d.ts +1 -0
- package/dist/components/toolbar/index.js +2 -0
- package/dist/components/tooltip/Tooltip.d.ts +58 -0
- package/dist/components/tooltip/Tooltip.js +57 -0
- package/dist/components/tooltip/Tooltip.js.map +1 -0
- package/dist/components/tooltip/index.d.ts +1 -0
- package/dist/components/tooltip/index.js +2 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.js +48 -0
- package/dist/lib/cn.d.ts +3 -0
- package/dist/lib/cn.js +29 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/theme.css +109 -0
- package/package.json +131 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Toast as BaseToast } from '@base-ui/react/toast';
|
|
2
|
+
import { ComponentProps, ComponentType } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Toast — Material 3 "snackbar" styled wrapper over Base UI's headless Toast.
|
|
5
|
+
* Behaviour/accessibility (manager, stacking, swipe-to-dismiss, F6 landmark):
|
|
6
|
+
* Base UI (https://base-ui.com/react/components/toast).
|
|
7
|
+
* Visuals: M3 snackbar anatomy — inverse-surface container, small (8px) corner,
|
|
8
|
+
* inverse-on-surface body-medium text, inverse-primary text-button action,
|
|
9
|
+
* optional inverse-on-surface close icon, elevation 3.
|
|
10
|
+
* Design ref: port/core/ui/components/snackbar (see CLAUDE.md).
|
|
11
|
+
*
|
|
12
|
+
* Compound API mirrors Base UI:
|
|
13
|
+
* <Toast.Provider>
|
|
14
|
+
* <App /> // call Toast.useToastManager().add({ description, ... })
|
|
15
|
+
* <Toast.Portal>
|
|
16
|
+
* <Toast.Viewport>
|
|
17
|
+
* {toasts.map((toast) => (
|
|
18
|
+
* <Toast.Root key={toast.id} toast={toast}>
|
|
19
|
+
* <Toast.Content>
|
|
20
|
+
* <Toast.Title />
|
|
21
|
+
* <Toast.Description />
|
|
22
|
+
* </Toast.Content>
|
|
23
|
+
* <Toast.Action>Undo</Toast.Action>
|
|
24
|
+
* <Toast.Close />
|
|
25
|
+
* </Toast.Root>
|
|
26
|
+
* ))}
|
|
27
|
+
* </Toast.Viewport>
|
|
28
|
+
* </Toast.Portal>
|
|
29
|
+
* </Toast.Provider>
|
|
30
|
+
*/
|
|
31
|
+
declare const Provider: import('react').FC<import('@base-ui/react').ToastProviderProps>;
|
|
32
|
+
declare const Portal: ComponentType<BaseToast.Portal.Props>;
|
|
33
|
+
declare const useToastManager: typeof BaseToast.useToastManager;
|
|
34
|
+
declare const createToastManager: typeof BaseToast.createToastManager;
|
|
35
|
+
/** Fixed region the toast stack renders into (M3: bottom-centered). */
|
|
36
|
+
declare function Viewport({ className, ...props }: ComponentProps<typeof BaseToast.Viewport>): import("react").JSX.Element;
|
|
37
|
+
/**
|
|
38
|
+
* One snackbar. Toasts stack absolutely inside the viewport: collapsed they
|
|
39
|
+
* scale down behind the frontmost one (via --toast-index), and on
|
|
40
|
+
* hover/focus ([data-expanded]) they fan out using --toast-offset-y.
|
|
41
|
+
*/
|
|
42
|
+
declare function Root({ className, ...props }: ComponentProps<typeof BaseToast.Root>): import("react").JSX.Element;
|
|
43
|
+
/** Text block; fades out while behind the frontmost toast in the stack. */
|
|
44
|
+
declare function Content({ className, ...props }: ComponentProps<typeof BaseToast.Content>): import("react").JSX.Element;
|
|
45
|
+
declare function Title({ className, ...props }: ComponentProps<typeof BaseToast.Title>): import("react").JSX.Element;
|
|
46
|
+
declare function Description({ className, ...props }: ComponentProps<typeof BaseToast.Description>): import("react").JSX.Element;
|
|
47
|
+
/** Snackbar action: M3 text button in the inverse-primary role. */
|
|
48
|
+
declare function Action({ className, ...props }: ComponentProps<typeof BaseToast.Action>): import("react").JSX.Element;
|
|
49
|
+
/** Dismiss icon button (defaults to an X glyph). */
|
|
50
|
+
declare function Close({ className, children, ...props }: ComponentProps<typeof BaseToast.Close>): import("react").JSX.Element;
|
|
51
|
+
/** Positions an anchored toast against an element (rare; default flow is the viewport stack). */
|
|
52
|
+
declare function Positioner({ className, ...props }: ComponentProps<typeof BaseToast.Positioner>): import("react").JSX.Element;
|
|
53
|
+
/** Arrow for anchored toasts. */
|
|
54
|
+
declare function Arrow({ className, children, ...props }: ComponentProps<typeof BaseToast.Arrow>): import("react").JSX.Element;
|
|
55
|
+
export declare const Toast: {
|
|
56
|
+
Provider: import('react').FC<import('@base-ui/react').ToastProviderProps>;
|
|
57
|
+
Portal: ComponentType<import('@base-ui/react').ToastPortalProps>;
|
|
58
|
+
Viewport: typeof Viewport;
|
|
59
|
+
Root: typeof Root;
|
|
60
|
+
Content: typeof Content;
|
|
61
|
+
Title: typeof Title;
|
|
62
|
+
Description: typeof Description;
|
|
63
|
+
Action: typeof Action;
|
|
64
|
+
Close: typeof Close;
|
|
65
|
+
Positioner: typeof Positioner;
|
|
66
|
+
Arrow: typeof Arrow;
|
|
67
|
+
useToastManager: typeof BaseToast.useToastManager;
|
|
68
|
+
createToastManager: typeof BaseToast.createToastManager;
|
|
69
|
+
};
|
|
70
|
+
export { Provider, Portal, Viewport, Root, Content, Title, Description, Action, Close, Positioner, Arrow, useToastManager, createToastManager, };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { cn as e } from "../../lib/cn.js";
|
|
2
|
+
import { X as t } from "lucide-react";
|
|
3
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
+
import { Toast as r } from "@base-ui/react/toast";
|
|
5
|
+
//#region src/components/toast/Toast.tsx
|
|
6
|
+
var i = r.Provider, a = r.Portal, o = r.useToastManager, s = r.createToastManager;
|
|
7
|
+
function c({ className: t, ...i }) {
|
|
8
|
+
return /* @__PURE__ */ n(r.Viewport, {
|
|
9
|
+
className: e("fixed bottom-4 left-1/2 z-50 w-[calc(100vw-2rem)] max-w-[560px] -translate-x-1/2", t),
|
|
10
|
+
...i
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function l({ className: t, ...i }) {
|
|
14
|
+
return /* @__PURE__ */ n(r.Root, {
|
|
15
|
+
className: e("absolute right-0 bottom-0 left-0 z-[calc(1000-var(--toast-index))] mx-auto w-full select-none", "flex min-h-12 items-center gap-1 py-1 pr-2 pl-4", "rounded-small bg-inverse-surface text-inverse-on-surface shadow-mm-3", "[transition-property:transform,opacity] duration-300 ease-out", "[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(min(var(--toast-index),10)*-0.5rem)))_scale(max(0,calc(1-(var(--toast-index)*0.05))))]", "data-[expanded]:[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc((var(--toast-offset-y)*-1)+(var(--toast-index)*-0.75rem)+var(--toast-swipe-movement-y)))]", "data-[starting-style]:opacity-0 data-[starting-style]:[transform:translateY(150%)]", "data-[ending-style]:opacity-0 data-[ending-style]:[transform:translateY(150%)]", "data-[limited]:opacity-0", t),
|
|
16
|
+
...i
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function u({ className: t, ...i }) {
|
|
20
|
+
return /* @__PURE__ */ n(r.Content, {
|
|
21
|
+
className: e("flex min-w-0 flex-1 flex-col gap-0.5 py-2", "transition-opacity duration-300 data-[behind]:opacity-0", t),
|
|
22
|
+
...i
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function d({ className: t, ...i }) {
|
|
26
|
+
return /* @__PURE__ */ n(r.Title, {
|
|
27
|
+
className: e("m-0 text-label-large text-inverse-on-surface", t),
|
|
28
|
+
...i
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function f({ className: t, ...i }) {
|
|
32
|
+
return /* @__PURE__ */ n(r.Description, {
|
|
33
|
+
className: e("m-0 text-body-medium text-inverse-on-surface", t),
|
|
34
|
+
...i
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function p({ className: t, ...i }) {
|
|
38
|
+
return /* @__PURE__ */ n(r.Action, {
|
|
39
|
+
className: e("inline-flex h-9 shrink-0 cursor-pointer items-center justify-center rounded-full px-3", "text-label-large text-inverse-primary transition-colors", "hover:bg-inverse-primary/[0.08]", "focus-visible:outline-2 focus-visible:outline-inverse-primary", "disabled:cursor-not-allowed disabled:opacity-[0.38]", t),
|
|
40
|
+
...i
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function m({ className: i, children: a, ...o }) {
|
|
44
|
+
return /* @__PURE__ */ n(r.Close, {
|
|
45
|
+
"aria-label": "Close",
|
|
46
|
+
className: e("inline-flex size-9 shrink-0 cursor-pointer items-center justify-center rounded-full", "text-inverse-on-surface transition-colors", "hover:bg-inverse-on-surface/[0.08]", "focus-visible:outline-2 focus-visible:outline-inverse-primary", "disabled:cursor-not-allowed disabled:opacity-[0.38]", i),
|
|
47
|
+
...o,
|
|
48
|
+
children: a ?? /* @__PURE__ */ n(t, {
|
|
49
|
+
"aria-hidden": !0,
|
|
50
|
+
className: "size-4"
|
|
51
|
+
})
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function h({ className: t, ...i }) {
|
|
55
|
+
return /* @__PURE__ */ n(r.Positioner, {
|
|
56
|
+
className: e("z-50", t),
|
|
57
|
+
...i
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function g({ className: t, children: i, ...a }) {
|
|
61
|
+
return /* @__PURE__ */ n(r.Arrow, {
|
|
62
|
+
className: e("data-[side=bottom]:-top-2 data-[side=top]:-bottom-2 data-[side=top]:rotate-180", "data-[side=left]:-right-[13px] data-[side=left]:rotate-90", "data-[side=right]:-left-[13px] data-[side=right]:-rotate-90", t),
|
|
63
|
+
...a,
|
|
64
|
+
children: i ?? /* @__PURE__ */ n("svg", {
|
|
65
|
+
width: "20",
|
|
66
|
+
height: "10",
|
|
67
|
+
viewBox: "0 0 20 10",
|
|
68
|
+
fill: "none",
|
|
69
|
+
"aria-hidden": !0,
|
|
70
|
+
children: /* @__PURE__ */ n("path", {
|
|
71
|
+
d: "M9.66437 2.60207L4.80758 6.97318C4.07308 7.63423 3.11989 8 2.13172 8H0V10H20V8H18.5349C17.5468 8 16.5936 7.63423 15.8591 6.97318L11.0023 2.60207C10.622 2.2598 10.0447 2.25979 9.66437 2.60207Z",
|
|
72
|
+
className: "fill-inverse-surface"
|
|
73
|
+
})
|
|
74
|
+
})
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
var _ = {
|
|
78
|
+
Provider: i,
|
|
79
|
+
Portal: a,
|
|
80
|
+
Viewport: c,
|
|
81
|
+
Root: l,
|
|
82
|
+
Content: u,
|
|
83
|
+
Title: d,
|
|
84
|
+
Description: f,
|
|
85
|
+
Action: p,
|
|
86
|
+
Close: m,
|
|
87
|
+
Positioner: h,
|
|
88
|
+
Arrow: g,
|
|
89
|
+
useToastManager: o,
|
|
90
|
+
createToastManager: s
|
|
91
|
+
};
|
|
92
|
+
//#endregion
|
|
93
|
+
export { p as Action, g as Arrow, m as Close, u as Content, f as Description, a as Portal, h as Positioner, i as Provider, l as Root, d as Title, _ as Toast, c as Viewport, s as createToastManager, o as useToastManager };
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=Toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.js","names":[],"sources":["../../../src/components/toast/Toast.tsx"],"sourcesContent":["import { Toast as BaseToast } from '@base-ui/react/toast'\nimport { X } from 'lucide-react'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps, ComponentType } from 'react'\n\n/**\n * Toast — Material 3 \"snackbar\" styled wrapper over Base UI's headless Toast.\n * Behaviour/accessibility (manager, stacking, swipe-to-dismiss, F6 landmark):\n * Base UI (https://base-ui.com/react/components/toast).\n * Visuals: M3 snackbar anatomy — inverse-surface container, small (8px) corner,\n * inverse-on-surface body-medium text, inverse-primary text-button action,\n * optional inverse-on-surface close icon, elevation 3.\n * Design ref: port/core/ui/components/snackbar (see CLAUDE.md).\n *\n * Compound API mirrors Base UI:\n * <Toast.Provider>\n * <App /> // call Toast.useToastManager().add({ description, ... })\n * <Toast.Portal>\n * <Toast.Viewport>\n * {toasts.map((toast) => (\n * <Toast.Root key={toast.id} toast={toast}>\n * <Toast.Content>\n * <Toast.Title />\n * <Toast.Description />\n * </Toast.Content>\n * <Toast.Action>Undo</Toast.Action>\n * <Toast.Close />\n * </Toast.Root>\n * ))}\n * </Toast.Viewport>\n * </Toast.Portal>\n * </Toast.Provider>\n */\n\nconst Provider = BaseToast.Provider\n// Base UI's Portal component type inlines an internal `FloatingPortalLite.Props`\n// that the package doesn't re-export, so its inferred type isn't nameable in the\n// emitted .d.ts (TS2883). Re-type via the public `Portal.Props` namespace alias,\n// which IS exported, so the declaration stays portable.\nconst Portal = BaseToast.Portal as ComponentType<BaseToast.Portal.Props>\nconst useToastManager = BaseToast.useToastManager\nconst createToastManager = BaseToast.createToastManager\n\n/** Fixed region the toast stack renders into (M3: bottom-centered). */\nfunction Viewport({ className, ...props }: ComponentProps<typeof BaseToast.Viewport>) {\n return (\n <BaseToast.Viewport\n className={cn(\n 'fixed bottom-4 left-1/2 z-50 w-[calc(100vw-2rem)] max-w-[560px] -translate-x-1/2',\n className,\n )}\n {...props}\n />\n )\n}\n\n/**\n * One snackbar. Toasts stack absolutely inside the viewport: collapsed they\n * scale down behind the frontmost one (via --toast-index), and on\n * hover/focus ([data-expanded]) they fan out using --toast-offset-y.\n */\nfunction Root({ className, ...props }: ComponentProps<typeof BaseToast.Root>) {\n return (\n <BaseToast.Root\n className={cn(\n 'absolute right-0 bottom-0 left-0 z-[calc(1000-var(--toast-index))] mx-auto w-full select-none',\n 'flex min-h-12 items-center gap-1 py-1 pr-2 pl-4',\n 'rounded-small bg-inverse-surface text-inverse-on-surface shadow-mm-3',\n '[transition-property:transform,opacity] duration-300 ease-out',\n // Collapsed stack: peek each older toast up and scale it down.\n '[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(min(var(--toast-index),10)*-0.5rem)))_scale(max(0,calc(1-(var(--toast-index)*0.05))))]',\n // Expanded stack: fan out by measured offset + 0.75rem gap per toast.\n 'data-[expanded]:[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc((var(--toast-offset-y)*-1)+(var(--toast-index)*-0.75rem)+var(--toast-swipe-movement-y)))]',\n 'data-[starting-style]:opacity-0 data-[starting-style]:[transform:translateY(150%)]',\n 'data-[ending-style]:opacity-0 data-[ending-style]:[transform:translateY(150%)]',\n 'data-[limited]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Text block; fades out while behind the frontmost toast in the stack. */\nfunction Content({ className, ...props }: ComponentProps<typeof BaseToast.Content>) {\n return (\n <BaseToast.Content\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-0.5 py-2',\n 'transition-opacity duration-300 data-[behind]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction Title({ className, ...props }: ComponentProps<typeof BaseToast.Title>) {\n return (\n <BaseToast.Title\n className={cn('m-0 text-label-large text-inverse-on-surface', className)}\n {...props}\n />\n )\n}\n\nfunction Description({ className, ...props }: ComponentProps<typeof BaseToast.Description>) {\n return (\n <BaseToast.Description\n className={cn('m-0 text-body-medium text-inverse-on-surface', className)}\n {...props}\n />\n )\n}\n\n/** Snackbar action: M3 text button in the inverse-primary role. */\nfunction Action({ className, ...props }: ComponentProps<typeof BaseToast.Action>) {\n return (\n <BaseToast.Action\n className={cn(\n 'inline-flex h-9 shrink-0 cursor-pointer items-center justify-center rounded-full px-3',\n 'text-label-large text-inverse-primary transition-colors',\n 'hover:bg-inverse-primary/[0.08]',\n 'focus-visible:outline-2 focus-visible:outline-inverse-primary',\n 'disabled:cursor-not-allowed disabled:opacity-[0.38]',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Dismiss icon button (defaults to an X glyph). */\nfunction Close({ className, children, ...props }: ComponentProps<typeof BaseToast.Close>) {\n return (\n <BaseToast.Close\n aria-label=\"Close\"\n className={cn(\n 'inline-flex size-9 shrink-0 cursor-pointer items-center justify-center rounded-full',\n 'text-inverse-on-surface transition-colors',\n 'hover:bg-inverse-on-surface/[0.08]',\n 'focus-visible:outline-2 focus-visible:outline-inverse-primary',\n 'disabled:cursor-not-allowed disabled:opacity-[0.38]',\n className,\n )}\n {...props}\n >\n {children ?? <X aria-hidden className=\"size-4\" />}\n </BaseToast.Close>\n )\n}\n\n/** Positions an anchored toast against an element (rare; default flow is the viewport stack). */\nfunction Positioner({ className, ...props }: ComponentProps<typeof BaseToast.Positioner>) {\n return <BaseToast.Positioner className={cn('z-50', className)} {...props} />\n}\n\n/** Arrow for anchored toasts. */\nfunction Arrow({ className, children, ...props }: ComponentProps<typeof BaseToast.Arrow>) {\n return (\n <BaseToast.Arrow\n className={cn(\n 'data-[side=bottom]:-top-2 data-[side=top]:-bottom-2 data-[side=top]:rotate-180',\n 'data-[side=left]:-right-[13px] data-[side=left]:rotate-90',\n 'data-[side=right]:-left-[13px] data-[side=right]:-rotate-90',\n className,\n )}\n {...props}\n >\n {children ?? (\n <svg width=\"20\" height=\"10\" viewBox=\"0 0 20 10\" fill=\"none\" aria-hidden>\n <path\n d=\"M9.66437 2.60207L4.80758 6.97318C4.07308 7.63423 3.11989 8 2.13172 8H0V10H20V8H18.5349C17.5468 8 16.5936 7.63423 15.8591 6.97318L11.0023 2.60207C10.622 2.2598 10.0447 2.25979 9.66437 2.60207Z\"\n className=\"fill-inverse-surface\"\n />\n </svg>\n )}\n </BaseToast.Arrow>\n )\n}\n\nexport const Toast = {\n Provider,\n Portal,\n Viewport,\n Root,\n Content,\n Title,\n Description,\n Action,\n Close,\n Positioner,\n Arrow,\n useToastManager,\n createToastManager,\n}\nexport {\n Provider,\n Portal,\n Viewport,\n Root,\n Content,\n Title,\n Description,\n Action,\n Close,\n Positioner,\n Arrow,\n useToastManager,\n createToastManager,\n}\n"],"mappings":";;;;;AAmCA,IAAM,IAAW,EAAU,UAKrB,IAAS,EAAU,QACnB,IAAkB,EAAU,iBAC5B,IAAqB,EAAU;AAGrC,SAAS,EAAS,EAAE,cAAW,GAAG,KAAoD;CACpF,OACE,kBAAC,EAAU,UAAX;EACE,WAAW,EACT,oFACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAOA,SAAS,EAAK,EAAE,cAAW,GAAG,KAAgD;CAC5E,OACE,kBAAC,EAAU,MAAX;EACE,WAAW,EACT,iGACA,mDACA,wEACA,iEAEA,8LAEA,kLACA,sFACA,kFACA,4BACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAQ,EAAE,cAAW,GAAG,KAAmD;CAClF,OACE,kBAAC,EAAU,SAAX;EACE,WAAW,EACT,6CACA,2DACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAiD;CAC9E,OACE,kBAAC,EAAU,OAAX;EACE,WAAW,EAAG,gDAAgD,CAAS;EACvE,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAY,EAAE,cAAW,GAAG,KAAuD;CAC1F,OACE,kBAAC,EAAU,aAAX;EACE,WAAW,EAAG,gDAAgD,CAAS;EACvE,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAO,EAAE,cAAW,GAAG,KAAkD;CAChF,OACE,kBAAC,EAAU,QAAX;EACE,WAAW,EACT,yFACA,2DACA,mCACA,iEACA,uDACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAM,EAAE,cAAW,aAAU,GAAG,KAAiD;CACxF,OACE,kBAAC,EAAU,OAAX;EACE,cAAW;EACX,WAAW,EACT,uFACA,6CACA,sCACA,iEACA,uDACA,CACF;EACA,GAAI;YAEH,KAAY,kBAAC,GAAD;GAAG,eAAA;GAAY,WAAU;EAAU,CAAA;CACjC,CAAA;AAErB;AAGA,SAAS,EAAW,EAAE,cAAW,GAAG,KAAsD;CACxF,OAAO,kBAAC,EAAU,YAAX;EAAsB,WAAW,EAAG,QAAQ,CAAS;EAAG,GAAI;CAAQ,CAAA;AAC7E;AAGA,SAAS,EAAM,EAAE,cAAW,aAAU,GAAG,KAAiD;CACxF,OACE,kBAAC,EAAU,OAAX;EACE,WAAW,EACT,kFACA,6DACA,+DACA,CACF;EACA,GAAI;YAEH,KACC,kBAAC,OAAD;GAAK,OAAM;GAAK,QAAO;GAAK,SAAQ;GAAY,MAAK;GAAO,eAAA;aAC1D,kBAAC,QAAD;IACE,GAAE;IACF,WAAU;GACX,CAAA;EACE,CAAA;CAEQ,CAAA;AAErB;AAEA,IAAa,IAAQ;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Toast, Provider, Portal, Viewport, Root, Content, Title, Description, Action, Close, Positioner, Arrow, useToastManager, createToastManager, } from './Toast';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Action as e, Arrow as t, Close as n, Content as r, Description as i, Portal as a, Positioner as o, Provider as s, Root as c, Title as l, Toast as u, Viewport as d, createToastManager as f, useToastManager as p } from "./Toast.js";
|
|
2
|
+
export { e as Action, t as Arrow, n as Close, r as Content, i as Description, a as Portal, o as Positioner, s as Provider, c as Root, l as Title, u as Toast, d as Viewport, f as createToastManager, p as useToastManager };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Toggle as BaseToggle } from '@base-ui/react/toggle';
|
|
2
|
+
import { ToggleGroup as BaseToggleGroup } from '@base-ui/react/toggle-group';
|
|
3
|
+
import { ComponentProps, ReactNode } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* Toggle — Material 3 styled wrapper over Base UI's headless Toggle +
|
|
6
|
+
* Toggle Group.
|
|
7
|
+
* Behaviour/accessibility (aria-pressed two-state button, roving focus and
|
|
8
|
+
* single/multiple selection in a group): Base UI
|
|
9
|
+
* (https://base-ui.com/react/components/toggle and
|
|
10
|
+
* https://base-ui.com/react/components/toggle-group).
|
|
11
|
+
* Visuals: M3 segmented button anatomy — 40px outlined full-round container,
|
|
12
|
+
* label-large segments separated by outline dividers, selected segment fills
|
|
13
|
+
* secondary-container with an 18px leading checkmark; standalone toggles
|
|
14
|
+
* render as outlined toggle buttons with the same selected treatment.
|
|
15
|
+
* Design ref: port/core/ui/components/button/segmented-button (see CLAUDE.md).
|
|
16
|
+
*
|
|
17
|
+
* Compound API mirrors Base UI:
|
|
18
|
+
* <Toggle.Group defaultValue={['week']}>
|
|
19
|
+
* <Toggle.Root value="day">Day</Toggle.Root>
|
|
20
|
+
* <Toggle.Root value="week">Week</Toggle.Root>
|
|
21
|
+
* <Toggle.Root value="month">Month</Toggle.Root>
|
|
22
|
+
* </Toggle.Group>
|
|
23
|
+
*/
|
|
24
|
+
type RootProps = ComponentProps<typeof BaseToggle> & {
|
|
25
|
+
/**
|
|
26
|
+
* Replace the leading checkmark (shown while pressed inside a Toggle.Group)
|
|
27
|
+
* with a custom node, or `null` to hide it.
|
|
28
|
+
*/
|
|
29
|
+
icon?: ReactNode;
|
|
30
|
+
};
|
|
31
|
+
declare function Root({ className, children, icon, ...props }: RootProps): import("react").JSX.Element;
|
|
32
|
+
/** Series of toggles sharing pressed state — M3 segmented button container. */
|
|
33
|
+
declare function Group({ className, ...props }: ComponentProps<typeof BaseToggleGroup>): import("react").JSX.Element;
|
|
34
|
+
export declare const Toggle: {
|
|
35
|
+
Root: typeof Root;
|
|
36
|
+
Group: typeof Group;
|
|
37
|
+
};
|
|
38
|
+
export { Root, Group };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { cn as e } from "../../lib/cn.js";
|
|
2
|
+
import { Check as t } from "lucide-react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { Toggle as i } from "@base-ui/react/toggle";
|
|
5
|
+
import { ToggleGroup as a } from "@base-ui/react/toggle-group";
|
|
6
|
+
//#region src/components/toggle/Toggle.tsx
|
|
7
|
+
function o({ className: a, children: o, icon: s, ...c }) {
|
|
8
|
+
return /* @__PURE__ */ r(i, {
|
|
9
|
+
className: e("group relative inline-flex h-10 cursor-pointer items-center justify-center gap-2", "rounded-full border border-outline px-4 text-label-large text-on-surface", "transition-colors duration-150", "before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:transition-colors", "hover:before:bg-on-surface/[0.08]", "data-[pressed]:bg-secondary-container data-[pressed]:text-on-secondary-container", "data-[pressed]:hover:before:bg-on-secondary-container/[0.08]", "focus-visible:z-10 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-primary", "disabled:cursor-not-allowed disabled:opacity-[0.38]", "in-data-[orientation]:rounded-none in-data-[orientation]:border-0", a),
|
|
10
|
+
...c,
|
|
11
|
+
children: [s === void 0 ? /* @__PURE__ */ n(t, {
|
|
12
|
+
"aria-hidden": !0,
|
|
13
|
+
className: "hidden size-4.5 shrink-0 in-data-[orientation]:group-data-[pressed]:block"
|
|
14
|
+
}) : s, o]
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function s({ className: t, ...r }) {
|
|
18
|
+
return /* @__PURE__ */ n(a, {
|
|
19
|
+
className: e("inline-flex w-fit overflow-hidden rounded-full border border-outline", "divide-x divide-outline", "data-[orientation=vertical]:flex-col data-[orientation=vertical]:divide-x-0 data-[orientation=vertical]:divide-y", t),
|
|
20
|
+
...r
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
var c = {
|
|
24
|
+
Root: o,
|
|
25
|
+
Group: s
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
export { s as Group, o as Root, c as Toggle };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=Toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.js","names":[],"sources":["../../../src/components/toggle/Toggle.tsx"],"sourcesContent":["import { Toggle as BaseToggle } from '@base-ui/react/toggle'\nimport { ToggleGroup as BaseToggleGroup } from '@base-ui/react/toggle-group'\nimport { Check } from 'lucide-react'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps, ReactNode } from 'react'\n\n/**\n * Toggle — Material 3 styled wrapper over Base UI's headless Toggle +\n * Toggle Group.\n * Behaviour/accessibility (aria-pressed two-state button, roving focus and\n * single/multiple selection in a group): Base UI\n * (https://base-ui.com/react/components/toggle and\n * https://base-ui.com/react/components/toggle-group).\n * Visuals: M3 segmented button anatomy — 40px outlined full-round container,\n * label-large segments separated by outline dividers, selected segment fills\n * secondary-container with an 18px leading checkmark; standalone toggles\n * render as outlined toggle buttons with the same selected treatment.\n * Design ref: port/core/ui/components/button/segmented-button (see CLAUDE.md).\n *\n * Compound API mirrors Base UI:\n * <Toggle.Group defaultValue={['week']}>\n * <Toggle.Root value=\"day\">Day</Toggle.Root>\n * <Toggle.Root value=\"week\">Week</Toggle.Root>\n * <Toggle.Root value=\"month\">Month</Toggle.Root>\n * </Toggle.Group>\n */\n\ntype RootProps = ComponentProps<typeof BaseToggle> & {\n /**\n * Replace the leading checkmark (shown while pressed inside a Toggle.Group)\n * with a custom node, or `null` to hide it.\n */\n icon?: ReactNode\n}\n\nfunction Root({ className, children, icon, ...props }: RootProps) {\n return (\n <BaseToggle\n className={cn(\n 'group relative inline-flex h-10 cursor-pointer items-center justify-center gap-2',\n 'rounded-full border border-outline px-4 text-label-large text-on-surface',\n 'transition-colors duration-150',\n // M3 state layer (composites over the segment fill).\n 'before:pointer-events-none before:absolute before:inset-0 before:rounded-[inherit] before:transition-colors',\n 'hover:before:bg-on-surface/[0.08]',\n // Selected: M3 segmented button fills secondary-container.\n 'data-[pressed]:bg-secondary-container data-[pressed]:text-on-secondary-container',\n 'data-[pressed]:hover:before:bg-on-secondary-container/[0.08]',\n 'focus-visible:z-10 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-primary',\n 'disabled:cursor-not-allowed disabled:opacity-[0.38]',\n // Inside a Toggle.Group the container owns the outline + dividers.\n 'in-data-[orientation]:rounded-none in-data-[orientation]:border-0',\n className,\n )}\n {...props}\n >\n {icon === undefined ? (\n <Check\n aria-hidden\n // M3 selected-segment checkmark: only inside a group, only while pressed.\n className=\"hidden size-4.5 shrink-0 in-data-[orientation]:group-data-[pressed]:block\"\n />\n ) : (\n icon\n )}\n {children}\n </BaseToggle>\n )\n}\n\n/** Series of toggles sharing pressed state — M3 segmented button container. */\nfunction Group({ className, ...props }: ComponentProps<typeof BaseToggleGroup>) {\n return (\n <BaseToggleGroup\n className={cn(\n 'inline-flex w-fit overflow-hidden rounded-full border border-outline',\n 'divide-x divide-outline',\n 'data-[orientation=vertical]:flex-col data-[orientation=vertical]:divide-x-0 data-[orientation=vertical]:divide-y',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport const Toggle = { Root, Group }\nexport { Root, Group }\n"],"mappings":";;;;;;AAoCA,SAAS,EAAK,EAAE,cAAW,aAAU,SAAM,GAAG,KAAoB;CAChE,OACE,kBAAC,GAAD;EACE,WAAW,EACT,oFACA,4EACA,kCAEA,+GACA,qCAEA,oFACA,gEACA,4GACA,uDAEA,qEACA,CACF;EACA,GAAI;YAjBN,CAmBG,MAAS,KAAA,IACR,kBAAC,GAAD;GACE,eAAA;GAEA,WAAU;EACX,CAAA,IAED,GAED,CACS;;AAEhB;AAGA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAiD;CAC9E,OACE,kBAAC,GAAD;EACE,WAAW,EACT,wEACA,2BACA,oHACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,IAAS;CAAE;CAAM;AAAM"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Toggle, Root, Group } from './Toggle';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Toolbar as BaseToolbar } from '@base-ui/react/toolbar';
|
|
2
|
+
import { ComponentProps } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Toolbar — Material 3 styled wrapper over Base UI's headless Toolbar.
|
|
5
|
+
* Behaviour/accessibility (role="toolbar", roving tabindex, arrow-key
|
|
6
|
+
* navigation): Base UI (https://base-ui.com/react/components/toolbar).
|
|
7
|
+
* Visuals: M3 top/bottom app bar anatomy — surface-container fill, 64px row,
|
|
8
|
+
* title-large title, 40px round icon/text actions with state layers.
|
|
9
|
+
* Design refs: port/core/ui/components/top-app-bar and
|
|
10
|
+
* port/core/ui/components/bottom-app-bar (see CLAUDE.md).
|
|
11
|
+
*
|
|
12
|
+
* Compound API mirrors Base UI (Title is a local M3 app-bar addition):
|
|
13
|
+
* <Toolbar.Root>
|
|
14
|
+
* <Toolbar.Button aria-label="Open menu"><Menu /></Toolbar.Button>
|
|
15
|
+
* <Toolbar.Title>Inbox</Toolbar.Title>
|
|
16
|
+
* <Toolbar.Group>
|
|
17
|
+
* <Toolbar.Button aria-label="Search"><Search /></Toolbar.Button>
|
|
18
|
+
* </Toolbar.Group>
|
|
19
|
+
* <Toolbar.Separator />
|
|
20
|
+
* <Toolbar.Input aria-label="Filter" placeholder="Filter…" />
|
|
21
|
+
* <Toolbar.Link href="#">Help</Toolbar.Link>
|
|
22
|
+
* </Toolbar.Root>
|
|
23
|
+
*/
|
|
24
|
+
declare function Root({ className, ...props }: ComponentProps<typeof BaseToolbar.Root>): import("react").JSX.Element;
|
|
25
|
+
/** Groups several toolbar items or toggles (e.g. an app bar's trailing actions). */
|
|
26
|
+
declare function Group({ className, ...props }: ComponentProps<typeof BaseToolbar.Group>): import("react").JSX.Element;
|
|
27
|
+
/**
|
|
28
|
+
* M3 standard icon/text button (40px state-layer pill). Icon-only usage needs
|
|
29
|
+
* an `aria-label`. When rendering a Toggle, `aria-pressed` gets the M3
|
|
30
|
+
* selected treatment (secondary-container).
|
|
31
|
+
*/
|
|
32
|
+
declare function Button({ className, ...props }: ComponentProps<typeof BaseToolbar.Button>): import("react").JSX.Element;
|
|
33
|
+
/** Navigation item styled as an M3 text button in the primary role. */
|
|
34
|
+
declare function Link({ className, ...props }: ComponentProps<typeof BaseToolbar.Link>): import("react").JSX.Element;
|
|
35
|
+
/** Native input integrated with toolbar arrow-key navigation; M3 search-bar fill. */
|
|
36
|
+
declare function Input({ className, ...props }: ComponentProps<typeof BaseToolbar.Input>): import("react").JSX.Element;
|
|
37
|
+
/** Screen-reader-accessible divider between toolbar groups. */
|
|
38
|
+
declare function Separator({ className, ...props }: ComponentProps<typeof BaseToolbar.Separator>): import("react").JSX.Element;
|
|
39
|
+
/** M3 app-bar headline (title-large, fills the space between nav icon and actions). */
|
|
40
|
+
declare function Title({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
|
|
41
|
+
export declare const Toolbar: {
|
|
42
|
+
Root: typeof Root;
|
|
43
|
+
Group: typeof Group;
|
|
44
|
+
Button: typeof Button;
|
|
45
|
+
Link: typeof Link;
|
|
46
|
+
Input: typeof Input;
|
|
47
|
+
Separator: typeof Separator;
|
|
48
|
+
Title: typeof Title;
|
|
49
|
+
};
|
|
50
|
+
export { Root, Group, Button, Link, Input, Separator, Title };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { cn as e } from "../../lib/cn.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
import { Toolbar as n } from "@base-ui/react/toolbar";
|
|
4
|
+
//#region src/components/toolbar/Toolbar.tsx
|
|
5
|
+
function r({ className: r, ...i }) {
|
|
6
|
+
return /* @__PURE__ */ t(n.Root, {
|
|
7
|
+
className: e("flex min-h-16 w-full items-center gap-1 bg-surface-container px-2 py-1.5 text-on-surface", "data-[orientation=vertical]:min-h-0 data-[orientation=vertical]:w-auto data-[orientation=vertical]:min-w-16", "data-[orientation=vertical]:flex-col data-[orientation=vertical]:px-1.5 data-[orientation=vertical]:py-2", r),
|
|
8
|
+
...i
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function i({ className: r, ...i }) {
|
|
12
|
+
return /* @__PURE__ */ t(n.Group, {
|
|
13
|
+
className: e("flex items-center gap-1 data-[orientation=vertical]:flex-col", r),
|
|
14
|
+
...i
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function a({ className: r, ...i }) {
|
|
18
|
+
return /* @__PURE__ */ t(n.Button, {
|
|
19
|
+
className: e("inline-flex h-10 min-w-10 shrink-0 cursor-pointer items-center justify-center gap-2", "rounded-full px-2.5 text-label-large text-on-surface-variant transition-colors", "hover:bg-on-surface/[0.08]", "focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-primary", "aria-pressed:bg-secondary-container aria-pressed:text-on-secondary-container", "disabled:cursor-not-allowed disabled:opacity-[0.38]", r),
|
|
20
|
+
...i
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function o({ className: r, ...i }) {
|
|
24
|
+
return /* @__PURE__ */ t(n.Link, {
|
|
25
|
+
className: e("inline-flex h-10 shrink-0 cursor-pointer items-center rounded-full px-3", "text-label-large text-primary no-underline transition-colors", "hover:bg-primary/[0.08]", "focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-primary", r),
|
|
26
|
+
...i
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function s({ className: r, ...i }) {
|
|
30
|
+
return /* @__PURE__ */ t(n.Input, {
|
|
31
|
+
className: e("h-10 w-48 rounded-full bg-surface-container-highest px-4", "text-body-large text-on-surface placeholder:text-on-surface-variant", "focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-primary", "disabled:cursor-not-allowed disabled:opacity-[0.38]", r),
|
|
32
|
+
...i
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function c({ className: r, ...i }) {
|
|
36
|
+
return /* @__PURE__ */ t(n.Separator, {
|
|
37
|
+
className: e("shrink-0 bg-outline-variant", "data-[orientation=vertical]:mx-1 data-[orientation=vertical]:h-6 data-[orientation=vertical]:w-px", "data-[orientation=horizontal]:my-1 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-6", r),
|
|
38
|
+
...i
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function l({ className: n, ...r }) {
|
|
42
|
+
return /* @__PURE__ */ t("div", {
|
|
43
|
+
className: e("min-w-0 flex-1 truncate px-1 text-title-large text-on-surface", n),
|
|
44
|
+
...r
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
var u = {
|
|
48
|
+
Root: r,
|
|
49
|
+
Group: i,
|
|
50
|
+
Button: a,
|
|
51
|
+
Link: o,
|
|
52
|
+
Input: s,
|
|
53
|
+
Separator: c,
|
|
54
|
+
Title: l
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
export { a as Button, i as Group, s as Input, o as Link, r as Root, c as Separator, l as Title, u as Toolbar };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.js","names":[],"sources":["../../../src/components/toolbar/Toolbar.tsx"],"sourcesContent":["import { Toolbar as BaseToolbar } from '@base-ui/react/toolbar'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * Toolbar — Material 3 styled wrapper over Base UI's headless Toolbar.\n * Behaviour/accessibility (role=\"toolbar\", roving tabindex, arrow-key\n * navigation): Base UI (https://base-ui.com/react/components/toolbar).\n * Visuals: M3 top/bottom app bar anatomy — surface-container fill, 64px row,\n * title-large title, 40px round icon/text actions with state layers.\n * Design refs: port/core/ui/components/top-app-bar and\n * port/core/ui/components/bottom-app-bar (see CLAUDE.md).\n *\n * Compound API mirrors Base UI (Title is a local M3 app-bar addition):\n * <Toolbar.Root>\n * <Toolbar.Button aria-label=\"Open menu\"><Menu /></Toolbar.Button>\n * <Toolbar.Title>Inbox</Toolbar.Title>\n * <Toolbar.Group>\n * <Toolbar.Button aria-label=\"Search\"><Search /></Toolbar.Button>\n * </Toolbar.Group>\n * <Toolbar.Separator />\n * <Toolbar.Input aria-label=\"Filter\" placeholder=\"Filter…\" />\n * <Toolbar.Link href=\"#\">Help</Toolbar.Link>\n * </Toolbar.Root>\n */\n\nfunction Root({ className, ...props }: ComponentProps<typeof BaseToolbar.Root>) {\n return (\n <BaseToolbar.Root\n className={cn(\n 'flex min-h-16 w-full items-center gap-1 bg-surface-container px-2 py-1.5 text-on-surface',\n 'data-[orientation=vertical]:min-h-0 data-[orientation=vertical]:w-auto data-[orientation=vertical]:min-w-16',\n 'data-[orientation=vertical]:flex-col data-[orientation=vertical]:px-1.5 data-[orientation=vertical]:py-2',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Groups several toolbar items or toggles (e.g. an app bar's trailing actions). */\nfunction Group({ className, ...props }: ComponentProps<typeof BaseToolbar.Group>) {\n return (\n <BaseToolbar.Group\n className={cn('flex items-center gap-1 data-[orientation=vertical]:flex-col', className)}\n {...props}\n />\n )\n}\n\n/**\n * M3 standard icon/text button (40px state-layer pill). Icon-only usage needs\n * an `aria-label`. When rendering a Toggle, `aria-pressed` gets the M3\n * selected treatment (secondary-container).\n */\nfunction Button({ className, ...props }: ComponentProps<typeof BaseToolbar.Button>) {\n return (\n <BaseToolbar.Button\n className={cn(\n 'inline-flex h-10 min-w-10 shrink-0 cursor-pointer items-center justify-center gap-2',\n 'rounded-full px-2.5 text-label-large text-on-surface-variant transition-colors',\n 'hover:bg-on-surface/[0.08]',\n 'focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-primary',\n 'aria-pressed:bg-secondary-container aria-pressed:text-on-secondary-container',\n 'disabled:cursor-not-allowed disabled:opacity-[0.38]',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Navigation item styled as an M3 text button in the primary role. */\nfunction Link({ className, ...props }: ComponentProps<typeof BaseToolbar.Link>) {\n return (\n <BaseToolbar.Link\n className={cn(\n 'inline-flex h-10 shrink-0 cursor-pointer items-center rounded-full px-3',\n 'text-label-large text-primary no-underline transition-colors',\n 'hover:bg-primary/[0.08]',\n 'focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-primary',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Native input integrated with toolbar arrow-key navigation; M3 search-bar fill. */\nfunction Input({ className, ...props }: ComponentProps<typeof BaseToolbar.Input>) {\n return (\n <BaseToolbar.Input\n className={cn(\n 'h-10 w-48 rounded-full bg-surface-container-highest px-4',\n 'text-body-large text-on-surface placeholder:text-on-surface-variant',\n 'focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-primary',\n 'disabled:cursor-not-allowed disabled:opacity-[0.38]',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Screen-reader-accessible divider between toolbar groups. */\nfunction Separator({ className, ...props }: ComponentProps<typeof BaseToolbar.Separator>) {\n return (\n <BaseToolbar.Separator\n className={cn(\n 'shrink-0 bg-outline-variant',\n 'data-[orientation=vertical]:mx-1 data-[orientation=vertical]:h-6 data-[orientation=vertical]:w-px',\n 'data-[orientation=horizontal]:my-1 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-6',\n className,\n )}\n {...props}\n />\n )\n}\n\n/** M3 app-bar headline (title-large, fills the space between nav icon and actions). */\nfunction Title({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n className={cn('min-w-0 flex-1 truncate px-1 text-title-large text-on-surface', className)}\n {...props}\n />\n )\n}\n\nexport const Toolbar = { Root, Group, Button, Link, Input, Separator, Title }\nexport { Root, Group, Button, Link, Input, Separator, Title }\n"],"mappings":";;;;AA2BA,SAAS,EAAK,EAAE,cAAW,GAAG,KAAkD;CAC9E,OACE,kBAAC,EAAY,MAAb;EACE,WAAW,EACT,4FACA,+GACA,4GACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAmD;CAChF,OACE,kBAAC,EAAY,OAAb;EACE,WAAW,EAAG,gEAAgE,CAAS;EACvF,GAAI;CACL,CAAA;AAEL;AAOA,SAAS,EAAO,EAAE,cAAW,GAAG,KAAoD;CAClF,OACE,kBAAC,EAAY,QAAb;EACE,WAAW,EACT,uFACA,kFACA,8BACA,yFACA,gFACA,uDACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAK,EAAE,cAAW,GAAG,KAAkD;CAC9E,OACE,kBAAC,EAAY,MAAb;EACE,WAAW,EACT,2EACA,gEACA,2BACA,yFACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAmD;CAChF,OACE,kBAAC,EAAY,OAAb;EACE,WAAW,EACT,4DACA,uEACA,yFACA,uDACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAU,EAAE,cAAW,GAAG,KAAuD;CACxF,OACE,kBAAC,EAAY,WAAb;EACE,WAAW,EACT,+BACA,qGACA,2GACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAGA,SAAS,EAAM,EAAE,cAAW,GAAG,KAAgC;CAC7D,OACE,kBAAC,OAAD;EACE,WAAW,EAAG,iEAAiE,CAAS;EACxF,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,IAAU;CAAE;CAAM;CAAO;CAAQ;CAAM;CAAO;CAAW;AAAM"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Toolbar, Root, Group, Button, Link, Input, Separator, Title } from './Toolbar';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';
|
|
2
|
+
import { ComponentProps } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Tooltip — Material 3 styled wrapper over Base UI's headless Tooltip.
|
|
5
|
+
* Behaviour/accessibility (hover/focus open, delay grouping via Provider,
|
|
6
|
+
* positioning, `role="tooltip"`): Base UI
|
|
7
|
+
* (https://base-ui.com/react/components/tooltip).
|
|
8
|
+
* Visuals: M3 plain tooltip anatomy — inverse-surface container,
|
|
9
|
+
* inverse-on-surface body-small label, extra-small corner, 4dp offset.
|
|
10
|
+
* Design ref: port/core/ui/components/tooltips (see CLAUDE.md).
|
|
11
|
+
*
|
|
12
|
+
* Compound API mirrors Base UI:
|
|
13
|
+
* <Tooltip.Provider>
|
|
14
|
+
* <Tooltip.Root>
|
|
15
|
+
* <Tooltip.Trigger>Hover me</Tooltip.Trigger>
|
|
16
|
+
* <Tooltip.Portal>
|
|
17
|
+
* <Tooltip.Positioner>
|
|
18
|
+
* <Tooltip.Popup>
|
|
19
|
+
* <Tooltip.Arrow />
|
|
20
|
+
* Label
|
|
21
|
+
* </Tooltip.Popup>
|
|
22
|
+
* </Tooltip.Positioner>
|
|
23
|
+
* </Tooltip.Portal>
|
|
24
|
+
* </Tooltip.Root>
|
|
25
|
+
* </Tooltip.Provider>
|
|
26
|
+
*/
|
|
27
|
+
declare const Provider: import('react').FC<import('@base-ui/react').TooltipProviderProps>;
|
|
28
|
+
declare const Root: <Payload>(props: BaseTooltip.Root.Props<Payload>) => import("react").JSX.Element;
|
|
29
|
+
declare const Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').TooltipPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
|
|
30
|
+
declare const Handle: typeof BaseTooltip.Handle;
|
|
31
|
+
declare const createHandle: typeof BaseTooltip.createHandle;
|
|
32
|
+
declare function Trigger({ className, ...props }: ComponentProps<typeof BaseTooltip.Trigger>): import("react").JSX.Element;
|
|
33
|
+
declare function Positioner({ className, sideOffset, ...props }: ComponentProps<typeof BaseTooltip.Positioner>): import("react").JSX.Element;
|
|
34
|
+
declare function Popup({ className, ...props }: ComponentProps<typeof BaseTooltip.Popup>): import("react").JSX.Element;
|
|
35
|
+
/**
|
|
36
|
+
* Optional pointing arrow (M3 plain tooltips usually omit it). Renders a small
|
|
37
|
+
* inverse-surface diamond that Base UI positions on the popup edge facing the
|
|
38
|
+
* anchor.
|
|
39
|
+
*/
|
|
40
|
+
declare function Arrow({ className, children, ...props }: ComponentProps<typeof BaseTooltip.Arrow>): import("react").JSX.Element;
|
|
41
|
+
/**
|
|
42
|
+
* Transition container for content changes when one tooltip is shared by
|
|
43
|
+
* multiple triggers — only needed for animated trigger-to-trigger switching.
|
|
44
|
+
*/
|
|
45
|
+
declare function Viewport({ className, ...props }: ComponentProps<typeof BaseTooltip.Viewport>): import("react").JSX.Element;
|
|
46
|
+
export declare const Tooltip: {
|
|
47
|
+
Provider: import('react').FC<import('@base-ui/react').TooltipProviderProps>;
|
|
48
|
+
Root: <Payload>(props: BaseTooltip.Root.Props<Payload>) => import("react").JSX.Element;
|
|
49
|
+
Trigger: typeof Trigger;
|
|
50
|
+
Portal: import('react').ForwardRefExoticComponent<Omit<import('@base-ui/react').TooltipPortalProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
|
|
51
|
+
Positioner: typeof Positioner;
|
|
52
|
+
Popup: typeof Popup;
|
|
53
|
+
Arrow: typeof Arrow;
|
|
54
|
+
Viewport: typeof Viewport;
|
|
55
|
+
Handle: typeof BaseTooltip.Handle;
|
|
56
|
+
createHandle: typeof BaseTooltip.createHandle;
|
|
57
|
+
};
|
|
58
|
+
export { Provider, Root, Trigger, Portal, Positioner, Popup, Arrow, Viewport, Handle, createHandle, };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { cn as e } from "../../lib/cn.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
import { Tooltip as n } from "@base-ui/react/tooltip";
|
|
4
|
+
//#region src/components/tooltip/Tooltip.tsx
|
|
5
|
+
var r = n.Provider, i = n.Root, a = n.Portal, o = n.Handle, s = n.createHandle;
|
|
6
|
+
function c({ className: r, ...i }) {
|
|
7
|
+
return /* @__PURE__ */ t(n.Trigger, {
|
|
8
|
+
className: e(r),
|
|
9
|
+
...i
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function l({ className: r, sideOffset: i = 4, ...a }) {
|
|
13
|
+
return /* @__PURE__ */ t(n.Positioner, {
|
|
14
|
+
className: e("z-50 outline-none", r),
|
|
15
|
+
sideOffset: i,
|
|
16
|
+
...a
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function u({ className: r, ...i }) {
|
|
20
|
+
return /* @__PURE__ */ t(n.Popup, {
|
|
21
|
+
role: "tooltip",
|
|
22
|
+
className: e("flex min-h-6 max-w-[200px] items-center origin-(--transform-origin)", "rounded-extra-small bg-inverse-surface px-2 py-1 text-body-small text-inverse-on-surface", "transition-[opacity,scale] duration-150 ease-out", "data-[starting-style]:scale-90 data-[starting-style]:opacity-0", "data-[ending-style]:scale-90 data-[ending-style]:opacity-0", "data-[instant]:duration-0", r),
|
|
23
|
+
...i
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function d({ className: r, children: i, ...a }) {
|
|
27
|
+
return /* @__PURE__ */ t(n.Arrow, {
|
|
28
|
+
className: e("data-[side=top]:-bottom-1 data-[side=bottom]:-top-1", "data-[side=left]:-right-1 data-[side=right]:-left-1", r),
|
|
29
|
+
...a,
|
|
30
|
+
children: i ?? /* @__PURE__ */ t("div", {
|
|
31
|
+
"aria-hidden": !0,
|
|
32
|
+
className: "size-2 rotate-45 bg-inverse-surface"
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function f({ className: r, ...i }) {
|
|
37
|
+
return /* @__PURE__ */ t(n.Viewport, {
|
|
38
|
+
className: e("relative", r),
|
|
39
|
+
...i
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
var p = {
|
|
43
|
+
Provider: r,
|
|
44
|
+
Root: i,
|
|
45
|
+
Trigger: c,
|
|
46
|
+
Portal: a,
|
|
47
|
+
Positioner: l,
|
|
48
|
+
Popup: u,
|
|
49
|
+
Arrow: d,
|
|
50
|
+
Viewport: f,
|
|
51
|
+
Handle: o,
|
|
52
|
+
createHandle: s
|
|
53
|
+
};
|
|
54
|
+
//#endregion
|
|
55
|
+
export { d as Arrow, o as Handle, u as Popup, a as Portal, l as Positioner, r as Provider, i as Root, p as Tooltip, c as Trigger, f as Viewport, s as createHandle };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=Tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.js","names":[],"sources":["../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import { Tooltip as BaseTooltip } from '@base-ui/react/tooltip'\nimport { cn } from '#/lib/cn'\n\nimport type { ComponentProps } from 'react'\n\n/**\n * Tooltip — Material 3 styled wrapper over Base UI's headless Tooltip.\n * Behaviour/accessibility (hover/focus open, delay grouping via Provider,\n * positioning, `role=\"tooltip\"`): Base UI\n * (https://base-ui.com/react/components/tooltip).\n * Visuals: M3 plain tooltip anatomy — inverse-surface container,\n * inverse-on-surface body-small label, extra-small corner, 4dp offset.\n * Design ref: port/core/ui/components/tooltips (see CLAUDE.md).\n *\n * Compound API mirrors Base UI:\n * <Tooltip.Provider>\n * <Tooltip.Root>\n * <Tooltip.Trigger>Hover me</Tooltip.Trigger>\n * <Tooltip.Portal>\n * <Tooltip.Positioner>\n * <Tooltip.Popup>\n * <Tooltip.Arrow />\n * Label\n * </Tooltip.Popup>\n * </Tooltip.Positioner>\n * </Tooltip.Portal>\n * </Tooltip.Root>\n * </Tooltip.Provider>\n */\n\nconst Provider = BaseTooltip.Provider\nconst Root = BaseTooltip.Root\nconst Portal = BaseTooltip.Portal\nconst Handle = BaseTooltip.Handle\nconst createHandle = BaseTooltip.createHandle\n\nfunction Trigger({\n className,\n ...props\n}: ComponentProps<typeof BaseTooltip.Trigger>) {\n return <BaseTooltip.Trigger className={cn(className)} {...props} />\n}\n\nfunction Positioner({\n className,\n sideOffset = 4,\n ...props\n}: ComponentProps<typeof BaseTooltip.Positioner>) {\n return (\n <BaseTooltip.Positioner\n className={cn('z-50 outline-none', className)}\n sideOffset={sideOffset}\n {...props}\n />\n )\n}\n\nfunction Popup({\n className,\n ...props\n}: ComponentProps<typeof BaseTooltip.Popup>) {\n return (\n <BaseTooltip.Popup\n // Base UI leaves the popup role-less; expose the standard ARIA tooltip\n // role so assistive tech (and role-based queries) can identify it.\n role=\"tooltip\"\n className={cn(\n 'flex min-h-6 max-w-[200px] items-center origin-(--transform-origin)',\n 'rounded-extra-small bg-inverse-surface px-2 py-1 text-body-small text-inverse-on-surface',\n 'transition-[opacity,scale] duration-150 ease-out',\n 'data-[starting-style]:scale-90 data-[starting-style]:opacity-0',\n 'data-[ending-style]:scale-90 data-[ending-style]:opacity-0',\n 'data-[instant]:duration-0',\n className,\n )}\n {...props}\n />\n )\n}\n\n/**\n * Optional pointing arrow (M3 plain tooltips usually omit it). Renders a small\n * inverse-surface diamond that Base UI positions on the popup edge facing the\n * anchor.\n */\nfunction Arrow({\n className,\n children,\n ...props\n}: ComponentProps<typeof BaseTooltip.Arrow>) {\n return (\n <BaseTooltip.Arrow\n className={cn(\n 'data-[side=top]:-bottom-1 data-[side=bottom]:-top-1',\n 'data-[side=left]:-right-1 data-[side=right]:-left-1',\n className,\n )}\n {...props}\n >\n {children ?? (\n <div aria-hidden className=\"size-2 rotate-45 bg-inverse-surface\" />\n )}\n </BaseTooltip.Arrow>\n )\n}\n\n/**\n * Transition container for content changes when one tooltip is shared by\n * multiple triggers — only needed for animated trigger-to-trigger switching.\n */\nfunction Viewport({\n className,\n ...props\n}: ComponentProps<typeof BaseTooltip.Viewport>) {\n return (\n <BaseTooltip.Viewport className={cn('relative', className)} {...props} />\n )\n}\n\nexport const Tooltip = {\n Provider,\n Root,\n Trigger,\n Portal,\n Positioner,\n Popup,\n Arrow,\n Viewport,\n Handle,\n createHandle,\n}\nexport {\n Provider,\n Root,\n Trigger,\n Portal,\n Positioner,\n Popup,\n Arrow,\n Viewport,\n Handle,\n createHandle,\n}\n"],"mappings":";;;;AA8BA,IAAM,IAAW,EAAY,UACvB,IAAO,EAAY,MACnB,IAAS,EAAY,QACrB,IAAS,EAAY,QACrB,IAAe,EAAY;AAEjC,SAAS,EAAQ,EACf,cACA,GAAG,KAC0C;CAC7C,OAAO,kBAAC,EAAY,SAAb;EAAqB,WAAW,EAAG,CAAS;EAAG,GAAI;CAAQ,CAAA;AACpE;AAEA,SAAS,EAAW,EAClB,cACA,gBAAa,GACb,GAAG,KAC6C;CAChD,OACE,kBAAC,EAAY,YAAb;EACE,WAAW,EAAG,qBAAqB,CAAS;EAChC;EACZ,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,EAAM,EACb,cACA,GAAG,KACwC;CAC3C,OACE,kBAAC,EAAY,OAAb;EAGE,MAAK;EACL,WAAW,EACT,uEACA,4FACA,oDACA,kEACA,8DACA,6BACA,CACF;EACA,GAAI;CACL,CAAA;AAEL;AAOA,SAAS,EAAM,EACb,cACA,aACA,GAAG,KACwC;CAC3C,OACE,kBAAC,EAAY,OAAb;EACE,WAAW,EACT,uDACA,uDACA,CACF;EACA,GAAI;YAEH,KACC,kBAAC,OAAD;GAAK,eAAA;GAAY,WAAU;EAAuC,CAAA;CAEnD,CAAA;AAEvB;AAMA,SAAS,EAAS,EAChB,cACA,GAAG,KAC2C;CAC9C,OACE,kBAAC,EAAY,UAAb;EAAsB,WAAW,EAAG,YAAY,CAAS;EAAG,GAAI;CAAQ,CAAA;AAE5E;AAEA,IAAa,IAAU;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Tooltip, Provider, Root, Trigger, Portal, Positioner, Popup, Arrow, Viewport, Handle, createHandle, } from './Tooltip';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Arrow as e, Handle as t, Popup as n, Portal as r, Positioner as i, Provider as a, Root as o, Tooltip as s, Trigger as c, Viewport as l, createHandle as u } from "./Tooltip.js";
|
|
2
|
+
export { e as Arrow, t as Handle, n as Popup, r as Portal, i as Positioner, a as Provider, o as Root, s as Tooltip, c as Trigger, l as Viewport, u as createHandle };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @duestel/ui — Material 3 component library (M3 design guide port).
|
|
3
|
+
*
|
|
4
|
+
* This root barrel re-exports each component's compound *namespace* object
|
|
5
|
+
* (e.g. `Accordion`, `Menu`, `Select`) plus its unique helpers and types.
|
|
6
|
+
* Shared compound parts (`Root`, `Trigger`, `Item`, …) and repeated helpers
|
|
7
|
+
* (`createHandle`, `useFilter`, `Provider`) are intentionally NOT flattened
|
|
8
|
+
* here — they collide across components. Reach them via the component
|
|
9
|
+
* namespace (`<Accordion.Root>`) or the per-component subpath export, which
|
|
10
|
+
* mirrors Base UI: import { Root } from '@duestel/ui/accordion'.
|
|
11
|
+
*
|
|
12
|
+
* Styles: import '@duestel/ui/styles.css' once (zero-config), or, in a
|
|
13
|
+
* Tailwind 4 app, `@import "@duestel/ui/theme.css"` + `@source "@duestel/ui"`.
|
|
14
|
+
*/
|
|
15
|
+
export { cn } from './lib/cn';
|
|
16
|
+
export { Accordion } from './components/accordion';
|
|
17
|
+
export { AlertDialog } from './components/alert-dialog';
|
|
18
|
+
export { Autocomplete } from './components/autocomplete';
|
|
19
|
+
export { Avatar } from './components/avatar';
|
|
20
|
+
export type { AvatarSize } from './components/avatar';
|
|
21
|
+
export { Badge, DotBadge, OnIconBadge } from './components/badge';
|
|
22
|
+
export type { BadgeProps, DotBadgeProps, OnIconBadgeProps } from './components/badge';
|
|
23
|
+
export { Button } from './components/button';
|
|
24
|
+
export type { ButtonVariant, IconButtonVariant, FabVariant } from './components/button';
|
|
25
|
+
export { Carousel } from './components/carousel';
|
|
26
|
+
export { Checkbox } from './components/checkbox';
|
|
27
|
+
export { Collapsible } from './components/collapsible';
|
|
28
|
+
export { Combobox } from './components/combobox';
|
|
29
|
+
export { Command, CommandDialog } from './components/command';
|
|
30
|
+
export { ContextMenu } from './components/context-menu';
|
|
31
|
+
export { DataTable, Table, TextContainer } from './components/data-table';
|
|
32
|
+
export type { ColumnDef } from './components/data-table';
|
|
33
|
+
export { DatePicker, DateRangePicker, Calendar, RangeCalendar } from './components/date-picker';
|
|
34
|
+
export type { DateRange } from './components/date-picker';
|
|
35
|
+
export { Dialog } from './components/dialog';
|
|
36
|
+
export { Drawer } from './components/drawer';
|
|
37
|
+
export { Form, Field, Fieldset, fieldControlClasses, TextField, InputOutlined, InputFilled, TextFieldOutlined, TextFieldFilled, useAppForm, withForm, useFieldContext, useFormContext, } from './components/form';
|
|
38
|
+
export { Kbd, Hotkey, HotkeysProvider, formatForDisplay, useHotkey, useHotkeys, useHotkeySequence, useKeyHold, } from './components/hotkeys';
|
|
39
|
+
export { Menu } from './components/menu';
|
|
40
|
+
export { Menubar } from './components/menubar';
|
|
41
|
+
export { Meter } from './components/meter';
|
|
42
|
+
export { NavigationMenu } from './components/navigation-menu';
|
|
43
|
+
export { NumberField } from './components/number-field';
|
|
44
|
+
export { OtpField } from './components/otp-field';
|
|
45
|
+
export { Pagination } from './components/pagination';
|
|
46
|
+
export { Popover } from './components/popover';
|
|
47
|
+
export { PreviewCard } from './components/preview-card';
|
|
48
|
+
export { Progress } from './components/progress';
|
|
49
|
+
export { Radio } from './components/radio';
|
|
50
|
+
export { Resizable } from './components/resizable';
|
|
51
|
+
export { ScrollArea } from './components/scroll-area';
|
|
52
|
+
export { Select } from './components/select';
|
|
53
|
+
export { Separator } from './components/separator';
|
|
54
|
+
export { Slider } from './components/slider';
|
|
55
|
+
export { Switch } from './components/switch';
|
|
56
|
+
export { Tabs } from './components/tabs';
|
|
57
|
+
export { Toast, useToastManager, createToastManager } from './components/toast';
|
|
58
|
+
export { Toggle } from './components/toggle';
|
|
59
|
+
export { Toolbar } from './components/toolbar';
|
|
60
|
+
export { Tooltip } from './components/tooltip';
|