@ponti-studios/ui 2.0.1 → 3.0.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 +36 -3
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.js +3 -0
- package/dist/components/data-display/accordion.d.ts +10 -0
- package/dist/components/data-display/accordion.js +53 -0
- package/{src/components/data-display/index.ts → dist/components/data-display/index.d.ts} +1 -10
- package/dist/components/data-display/index.js +8 -0
- package/dist/components/data-display/metric-card.d.ts +9 -0
- package/dist/components/data-display/metric-card.js +25 -0
- package/dist/components/data-display/sort-controls.d.ts +13 -0
- package/dist/components/data-display/sort-controls.js +57 -0
- package/dist/components/data-display/sort-row.d.ts +10 -0
- package/dist/components/data-display/sort-row.js +52 -0
- package/dist/components/data-display/table.d.ts +10 -0
- package/dist/components/data-display/table.js +57 -0
- package/dist/components/feedback/alert.d.ts +9 -0
- package/dist/components/feedback/alert.js +38 -0
- package/dist/components/feedback/empty-state.d.ts +18 -0
- package/dist/components/feedback/empty-state.js +36 -0
- package/{src/components/feedback/index.ts → dist/components/feedback/index.d.ts} +2 -0
- package/dist/components/feedback/index.js +7 -0
- package/dist/components/feedback/progress.d.ts +6 -0
- package/dist/components/feedback/progress.js +25 -0
- package/dist/components/feedback/skeleton.d.ts +2 -0
- package/dist/components/feedback/skeleton.js +11 -0
- package/dist/components/feedback/spinner.d.ts +14 -0
- package/dist/components/feedback/spinner.js +27 -0
- package/dist/components/feedback/update-guard.d.ts +13 -0
- package/dist/components/feedback/update-guard.js +38 -0
- package/dist/components/filters/active-filters-bar.d.ts +14 -0
- package/dist/components/filters/active-filters-bar.js +44 -0
- package/dist/components/filters/filter-chip.d.ts +11 -0
- package/dist/components/filters/filter-chip.js +33 -0
- package/dist/components/filters/filter-select.d.ts +17 -0
- package/dist/components/filters/filter-select.js +46 -0
- package/dist/components/filters/index.js +4 -0
- package/dist/components/forms/checkbox.d.ts +4 -0
- package/dist/components/forms/checkbox.js +24 -0
- package/dist/components/forms/date-month-select.d.ts +11 -0
- package/dist/components/forms/date-month-select.js +47 -0
- package/dist/components/forms/date-picker.d.ts +60 -0
- package/dist/components/forms/date-picker.js +193 -0
- package/dist/components/forms/date-utils.d.ts +14 -0
- package/dist/components/forms/date-utils.js +18 -0
- package/dist/components/forms/drop-zone.d.ts +42 -0
- package/dist/components/forms/drop-zone.js +184 -0
- package/{src/components/forms/index.ts → dist/components/forms/index.d.ts} +3 -9
- package/dist/components/forms/index.js +17 -0
- package/dist/components/forms/input.d.ts +3 -0
- package/dist/components/forms/input.js +15 -0
- package/dist/components/forms/label.d.ts +3 -0
- package/dist/components/forms/label.js +14 -0
- package/dist/components/forms/passkey-management.d.ts +14 -0
- package/dist/components/forms/passkey-management.js +132 -0
- package/dist/components/forms/radio-group.d.ts +6 -0
- package/dist/components/forms/radio-group.js +28 -0
- package/dist/components/forms/select.d.ts +18 -0
- package/dist/components/forms/select.js +103 -0
- package/dist/components/forms/slider.d.ts +9 -0
- package/dist/components/forms/slider.js +25 -0
- package/dist/components/forms/stepper.d.ts +15 -0
- package/dist/components/forms/stepper.js +41 -0
- package/dist/components/forms/switch.d.ts +6 -0
- package/dist/components/forms/switch.js +21 -0
- package/dist/components/forms/text-field.d.ts +15 -0
- package/dist/components/forms/text-field.js +46 -0
- package/dist/components/forms/text-field.types.d.ts +8 -0
- package/dist/components/forms/textarea.d.ts +3 -0
- package/dist/components/forms/textarea.js +14 -0
- package/dist/components/layout/index.js +5 -0
- package/dist/components/layout/particle-background.d.ts +19 -0
- package/dist/components/layout/particle-background.js +171 -0
- package/dist/components/layout/scroll-area.d.ts +9 -0
- package/dist/components/layout/scroll-area.js +35 -0
- package/dist/components/layout/section-intro.d.ts +12 -0
- package/dist/components/layout/section-intro.js +28 -0
- package/dist/components/layout/surface-panel.d.ts +7 -0
- package/dist/components/layout/surface-panel.js +11 -0
- package/dist/components/navigation/app-navigation.d.ts +67 -0
- package/dist/components/navigation/app-navigation.js +106 -0
- package/{src/components/navigation/index.ts → dist/components/navigation/index.d.ts} +1 -7
- package/dist/components/navigation/index.js +4 -0
- package/dist/components/navigation/pagination-controls.d.ts +7 -0
- package/dist/components/navigation/pagination-controls.js +50 -0
- package/dist/components/navigation/tabs.d.ts +7 -0
- package/dist/components/navigation/tabs.js +35 -0
- package/dist/components/overlays/bottom-sheet.d.ts +20 -0
- package/dist/components/overlays/bottom-sheet.js +101 -0
- package/dist/components/overlays/command.d.ts +29 -0
- package/dist/components/overlays/command.js +123 -0
- package/dist/components/overlays/dialog.d.ts +30 -0
- package/dist/components/overlays/dialog.js +105 -0
- package/dist/components/overlays/dropdown-menu.d.ts +29 -0
- package/dist/components/overlays/dropdown-menu.js +128 -0
- package/dist/components/overlays/index.d.ts +7 -0
- package/dist/components/overlays/index.js +8 -0
- package/dist/components/overlays/popover.d.ts +14 -0
- package/dist/components/overlays/popover.js +56 -0
- package/dist/components/overlays/sheet.d.ts +27 -0
- package/dist/components/overlays/sheet.js +81 -0
- package/dist/components/overlays/tooltip.d.ts +10 -0
- package/dist/components/overlays/tooltip.js +23 -0
- package/dist/components/primitives/avatar.d.ts +14 -0
- package/dist/components/primitives/avatar.js +72 -0
- package/dist/components/primitives/badge.d.ts +7 -0
- package/dist/components/primitives/badge.js +27 -0
- package/dist/components/primitives/button.d.ts +13 -0
- package/dist/components/primitives/button.js +113 -0
- package/{src/components/primitives/button.types.ts → dist/components/primitives/button.types.d.ts} +4 -6
- package/dist/components/primitives/card.d.ts +9 -0
- package/dist/components/primitives/card.js +56 -0
- package/{src/components/primitives/index.ts → dist/components/primitives/index.d.ts} +1 -9
- package/dist/components/primitives/index.js +7 -0
- package/dist/components/primitives/segmented-control.d.ts +20 -0
- package/dist/components/primitives/segmented-control.js +27 -0
- package/dist/components/primitives/separator.d.ts +4 -0
- package/dist/components/primitives/separator.js +16 -0
- package/dist/constants/chart-colors.d.ts +33 -0
- package/dist/constants/chart-colors.js +31 -0
- package/dist/hooks/index.js +9 -0
- package/{src/hooks/sort.types.ts → dist/hooks/sort.types.d.ts} +2 -4
- package/dist/hooks/use-api-client.d.ts +30 -0
- package/dist/hooks/use-api-client.js +106 -0
- package/dist/hooks/use-debounced-value.d.ts +1 -0
- package/dist/hooks/use-debounced-value.js +12 -0
- package/dist/hooks/use-derived-filter-state.d.ts +20 -0
- package/dist/hooks/use-derived-filter-state.js +39 -0
- package/dist/hooks/use-filter-state.d.ts +12 -0
- package/dist/hooks/use-filter-state.js +37 -0
- package/dist/hooks/use-media-query.d.ts +6 -0
- package/dist/hooks/use-media-query.js +27 -0
- package/dist/hooks/use-mobile.d.ts +1 -0
- package/dist/hooks/use-mobile.js +14 -0
- package/dist/hooks/use-sort.d.ts +11 -0
- package/dist/hooks/use-sort.js +14 -0
- package/{src/index.ts → dist/index.d.ts} +4 -32
- package/dist/index.js +15 -0
- package/dist/integrations/service-worker.d.ts +2 -0
- package/dist/integrations/service-worker.js +2 -0
- package/dist/lib/auth.d.ts +2 -0
- package/dist/lib/auth.js +7 -0
- package/dist/lib/clipboard.d.ts +1 -0
- package/dist/lib/clipboard.js +10 -0
- package/dist/lib/index.js +4 -0
- package/{src/lib/slot.tsx → dist/lib/slot.d.ts} +2 -15
- package/dist/lib/slot.js +14 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +8 -0
- package/dist/native/components.d.ts +41 -0
- package/dist/native/components.js +135 -0
- package/dist/native/index.js +3 -0
- package/dist/native/theme.d.ts +19 -0
- package/dist/native/theme.js +58 -0
- package/dist/styles/tokens/css-vars.d.ts +7 -0
- package/dist/styles/tokens/css-vars.js +5 -0
- package/dist/styles/tokens/generated/dark.colors.generated.d.ts +40 -0
- package/dist/styles/tokens/generated/dark.colors.generated.js +39 -0
- package/dist/styles/tokens/generated/foundations.generated.d.ts +323 -0
- package/dist/styles/tokens/generated/foundations.generated.js +453 -0
- package/dist/styles/tokens/generated/light.colors.generated.d.ts +40 -0
- package/dist/styles/tokens/generated/light.colors.generated.js +39 -0
- package/dist/styles/tokens/index.d.ts +317 -0
- package/dist/styles/tokens/index.js +14 -0
- package/dist/styles.css +1 -1
- package/dist/translations/en.d.ts +34 -0
- package/dist/translations/index.d.ts +39 -0
- package/dist/translations/ui-provider.d.ts +9 -0
- package/dist/translations/ui-provider.js +16 -0
- package/dist/types/upload.d.ts +36 -0
- package/package.json +50 -33
- package/src/components/data-display/accordion.stories.tsx +0 -57
- package/src/components/data-display/accordion.tsx +0 -86
- package/src/components/data-display/metric-card.stories.tsx +0 -48
- package/src/components/data-display/metric-card.tsx +0 -20
- package/src/components/data-display/sort-controls.stories.tsx +0 -45
- package/src/components/data-display/sort-controls.tsx +0 -96
- package/src/components/data-display/sort-row.tsx +0 -88
- package/src/components/data-display/table.stories.tsx +0 -75
- package/src/components/data-display/table.tsx +0 -80
- package/src/components/feedback/alert.stories.tsx +0 -51
- package/src/components/feedback/alert.tsx +0 -64
- package/src/components/feedback/empty-state.tsx +0 -76
- package/src/components/feedback/progress.stories.tsx +0 -54
- package/src/components/feedback/progress.tsx +0 -41
- package/src/components/feedback/skeleton.stories.tsx +0 -36
- package/src/components/feedback/skeleton.tsx +0 -7
- package/src/components/feedback/spinner.stories.tsx +0 -52
- package/src/components/feedback/spinner.tsx +0 -47
- package/src/components/feedback/update-guard.stories.tsx +0 -28
- package/src/components/feedback/update-guard.tsx +0 -57
- package/src/components/filters/active-filters-bar.stories.tsx +0 -114
- package/src/components/filters/active-filters-bar.tsx +0 -61
- package/src/components/filters/filter-chip.tsx +0 -57
- package/src/components/filters/filter-select.stories.tsx +0 -71
- package/src/components/filters/filter-select.tsx +0 -68
- package/src/components/forms/checkbox.stories.tsx +0 -35
- package/src/components/forms/checkbox.tsx +0 -38
- package/src/components/forms/date-month-select.stories.tsx +0 -26
- package/src/components/forms/date-month-select.tsx +0 -79
- package/src/components/forms/date-picker.stories.tsx +0 -188
- package/src/components/forms/date-picker.tsx +0 -303
- package/src/components/forms/date-utils.ts +0 -37
- package/src/components/forms/drop-zone.stories.tsx +0 -140
- package/src/components/forms/drop-zone.tsx +0 -298
- package/src/components/forms/input.stories.tsx +0 -47
- package/src/components/forms/input.tsx +0 -24
- package/src/components/forms/label.stories.tsx +0 -16
- package/src/components/forms/label.tsx +0 -25
- package/src/components/forms/passkey-management.stories.tsx +0 -85
- package/src/components/forms/passkey-management.tsx +0 -168
- package/src/components/forms/radio-group.stories.tsx +0 -46
- package/src/components/forms/radio-group.tsx +0 -44
- package/src/components/forms/select.stories.tsx +0 -207
- package/src/components/forms/select.tsx +0 -182
- package/src/components/forms/slider.stories.tsx +0 -70
- package/src/components/forms/slider.tsx +0 -50
- package/src/components/forms/stepper.stories.tsx +0 -111
- package/src/components/forms/stepper.tsx +0 -66
- package/src/components/forms/switch.stories.tsx +0 -144
- package/src/components/forms/switch.tsx +0 -39
- package/src/components/forms/text-field.stories.tsx +0 -87
- package/src/components/forms/text-field.tsx +0 -75
- package/src/components/forms/text-field.types.ts +0 -9
- package/src/components/forms/textarea.stories.tsx +0 -150
- package/src/components/forms/textarea.tsx +0 -22
- package/src/components/layout/particle-background.stories.tsx +0 -38
- package/src/components/layout/particle-background.tsx +0 -378
- package/src/components/layout/scroll-area.stories.tsx +0 -91
- package/src/components/layout/scroll-area.tsx +0 -79
- package/src/components/layout/section-intro.stories.tsx +0 -29
- package/src/components/layout/section-intro.tsx +0 -31
- package/src/components/layout/surface-panel.stories.tsx +0 -32
- package/src/components/layout/surface-panel.tsx +0 -23
- package/src/components/navigation/app-navigation.stories.tsx +0 -217
- package/src/components/navigation/app-navigation.tsx +0 -234
- package/src/components/navigation/pagination-controls.stories.tsx +0 -41
- package/src/components/navigation/pagination-controls.tsx +0 -46
- package/src/components/navigation/tabs.stories.tsx +0 -48
- package/src/components/navigation/tabs.tsx +0 -52
- package/src/components/overlays/bottom-sheet.stories.tsx +0 -52
- package/src/components/overlays/bottom-sheet.tsx +0 -179
- package/src/components/overlays/command.stories.tsx +0 -65
- package/src/components/overlays/command.tsx +0 -227
- package/src/components/overlays/dialog.stories.tsx +0 -148
- package/src/components/overlays/dialog.tsx +0 -203
- package/src/components/overlays/dropdown-menu.stories.tsx +0 -74
- package/src/components/overlays/dropdown-menu.tsx +0 -236
- package/src/components/overlays/index.ts +0 -56
- package/src/components/overlays/popover.stories.tsx +0 -51
- package/src/components/overlays/popover.tsx +0 -78
- package/src/components/overlays/sheet.stories.tsx +0 -68
- package/src/components/overlays/sheet.tsx +0 -155
- package/src/components/overlays/tooltip.stories.tsx +0 -29
- package/src/components/overlays/tooltip.tsx +0 -41
- package/src/components/primitives/avatar-placeholder.svg +0 -13
- package/src/components/primitives/avatar.stories.tsx +0 -72
- package/src/components/primitives/avatar.tsx +0 -136
- package/src/components/primitives/badge.stories.tsx +0 -43
- package/src/components/primitives/badge.tsx +0 -43
- package/src/components/primitives/button.stories.tsx +0 -113
- package/src/components/primitives/button.tsx +0 -131
- package/src/components/primitives/card.stories.tsx +0 -59
- package/src/components/primitives/card.tsx +0 -66
- package/src/components/primitives/segmented-control.stories.tsx +0 -54
- package/src/components/primitives/segmented-control.tsx +0 -73
- package/src/components/primitives/separator.stories.tsx +0 -34
- package/src/components/primitives/separator.tsx +0 -27
- package/src/constants/chart-colors.ts +0 -39
- package/src/env.d.ts +0 -9
- package/src/hooks/use-api-client.ts +0 -122
- package/src/hooks/use-debounced-value.ts +0 -12
- package/src/hooks/use-derived-filter-state.ts +0 -70
- package/src/hooks/use-filter-state.ts +0 -66
- package/src/hooks/use-media-query.ts +0 -69
- package/src/hooks/use-mobile.tsx +0 -19
- package/src/hooks/use-sort.ts +0 -20
- package/src/lib/auth.ts +0 -5
- package/src/lib/clipboard.ts +0 -8
- package/src/lib/utils.ts +0 -6
- package/src/native/components.tsx +0 -198
- package/src/native/theme.tsx +0 -69
- package/src/storybook/controls.ts +0 -117
- package/src/storybook/options.ts +0 -52
- package/src/styles/build.ts +0 -1
- package/src/styles/index.css +0 -423
- package/src/styles/nokia.css +0 -36
- package/src/styles/package.css +0 -3
- package/src/styles/tokens/chart-colors.stories.tsx +0 -189
- package/src/styles/tokens/color-systems.stories.tsx +0 -190
- package/src/styles/tokens/css-vars.ts +0 -15
- package/src/styles/tokens/generated/dark-class.css +0 -39
- package/src/styles/tokens/generated/dark.colors.generated.ts +0 -39
- package/src/styles/tokens/generated/dark.css +0 -39
- package/src/styles/tokens/generated/foundations.css +0 -149
- package/src/styles/tokens/generated/foundations.generated.ts +0 -454
- package/src/styles/tokens/generated/light.colors.generated.ts +0 -39
- package/src/styles/tokens/generated/light.css +0 -39
- package/src/styles/tokens/index.ts +0 -70
- package/src/styles/tokens/layout.stories.tsx +0 -50
- package/src/styles/tokens/scripts/check-foundations.mjs +0 -126
- package/src/styles/tokens/scripts/check-source.mjs +0 -53
- package/src/styles/tokens/source/dark.tokens.json +0 -138
- package/src/styles/tokens/source/foundations.tokens.json +0 -344
- package/src/styles/tokens/source/light.tokens.json +0 -138
- package/src/styles/tokens/style-dictionary.dark-class.json +0 -16
- package/src/styles/tokens/style-dictionary.dark-storybook.json +0 -16
- package/src/styles/tokens/style-dictionary.dark.json +0 -21
- package/src/styles/tokens/style-dictionary.foundations.json +0 -21
- package/src/styles/tokens/style-dictionary.light-storybook.json +0 -16
- package/src/styles/tokens/style-dictionary.light.json +0 -21
- package/src/styles/tokens/typography.stories.tsx +0 -157
- package/src/translations/en.ts +0 -34
- package/src/translations/index.ts +0 -32
- package/src/types/upload.ts +0 -42
- /package/{src/components/filters/index.ts → dist/components/filters/index.d.ts} +0 -0
- /package/{src/components/layout/index.ts → dist/components/layout/index.d.ts} +0 -0
- /package/{src/hooks/index.ts → dist/hooks/index.d.ts} +0 -0
- /package/{src/lib/index.ts → dist/lib/index.d.ts} +0 -0
- /package/{src/native/index.ts → dist/native/index.d.ts} +0 -0
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { AlertDialog as BaseAlertDialog } from "@base-ui/react/alert-dialog";
|
|
4
|
-
import { Dialog as BaseDialog } from "@base-ui/react/dialog";
|
|
5
|
-
import { XIcon } from "lucide-react";
|
|
6
|
-
import * as React from "react";
|
|
7
|
-
|
|
8
|
-
import { cn } from "../../lib/utils";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Whether the nearest ancestor `<Dialog alert>` is in alert mode. Every part
|
|
12
|
-
* below (`DialogContent`, etc.) reads this instead of taking its own `alert`
|
|
13
|
-
* prop, so the mode only has to be set once, at the root.
|
|
14
|
-
*/
|
|
15
|
-
const DialogAlertContext = React.createContext(false);
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* `alert: true` swaps the root primitive for Base UI's `AlertDialog.Root`:
|
|
19
|
-
* `role="alertdialog"`, forced `modal`, and no dismiss via outside click or
|
|
20
|
-
* Escape — for confirmations that need explicit acknowledgment. Every other
|
|
21
|
-
* part (`Trigger`, `Popup`, `Close`, `Title`, `Description`, ...) is a plain
|
|
22
|
-
* re-export shared by both Base UI primitives, so only the root needs to
|
|
23
|
-
* branch; `DialogContent` reads `DialogAlertContext` to default its close
|
|
24
|
-
* button off in alert mode.
|
|
25
|
-
*/
|
|
26
|
-
function Dialog({
|
|
27
|
-
alert = false,
|
|
28
|
-
modal,
|
|
29
|
-
disablePointerDismissal,
|
|
30
|
-
...props
|
|
31
|
-
}: Omit<React.ComponentProps<typeof BaseDialog.Root>, "handle"> & { alert?: boolean }) {
|
|
32
|
-
return (
|
|
33
|
-
<DialogAlertContext value={alert}>
|
|
34
|
-
{alert ? (
|
|
35
|
-
<BaseAlertDialog.Root {...props} />
|
|
36
|
-
) : (
|
|
37
|
-
<BaseDialog.Root
|
|
38
|
-
modal={modal}
|
|
39
|
-
disablePointerDismissal={disablePointerDismissal}
|
|
40
|
-
{...props}
|
|
41
|
-
/>
|
|
42
|
-
)}
|
|
43
|
-
</DialogAlertContext>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function DialogTrigger({
|
|
48
|
-
asChild,
|
|
49
|
-
children,
|
|
50
|
-
...props
|
|
51
|
-
}: React.ComponentProps<typeof BaseDialog.Trigger> & { asChild?: boolean }) {
|
|
52
|
-
if (asChild && React.isValidElement(children)) {
|
|
53
|
-
return (
|
|
54
|
-
<BaseDialog.Trigger
|
|
55
|
-
data-slot="dialog-trigger"
|
|
56
|
-
render={(triggerProps) =>
|
|
57
|
-
React.cloneElement(children as React.ReactElement<unknown>, triggerProps)
|
|
58
|
-
}
|
|
59
|
-
{...props}
|
|
60
|
-
/>
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
return (
|
|
64
|
-
<BaseDialog.Trigger data-slot="dialog-trigger" {...props}>
|
|
65
|
-
{children}
|
|
66
|
-
</BaseDialog.Trigger>
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function DialogPortal({ ...props }: React.ComponentProps<typeof BaseDialog.Portal>) {
|
|
71
|
-
return <BaseDialog.Portal data-slot="dialog-portal" {...props} />;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function DialogClose({
|
|
75
|
-
asChild,
|
|
76
|
-
children,
|
|
77
|
-
...props
|
|
78
|
-
}: React.ComponentProps<typeof BaseDialog.Close> & { asChild?: boolean }) {
|
|
79
|
-
if (asChild && React.isValidElement(children)) {
|
|
80
|
-
return (
|
|
81
|
-
<BaseDialog.Close
|
|
82
|
-
data-slot="dialog-close"
|
|
83
|
-
render={(closeProps) =>
|
|
84
|
-
React.cloneElement(children as React.ReactElement<unknown>, closeProps)
|
|
85
|
-
}
|
|
86
|
-
{...props}
|
|
87
|
-
/>
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
return (
|
|
91
|
-
<BaseDialog.Close data-slot="dialog-close" {...props}>
|
|
92
|
-
{children}
|
|
93
|
-
</BaseDialog.Close>
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function DialogOverlay({ className, ...props }: React.ComponentProps<typeof BaseDialog.Backdrop>) {
|
|
98
|
-
return (
|
|
99
|
-
<BaseDialog.Backdrop
|
|
100
|
-
data-slot="dialog-overlay"
|
|
101
|
-
className={cn("fixed inset-0 z-50 bg-black/80", className)}
|
|
102
|
-
{...props}
|
|
103
|
-
/>
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Flush to the bottom edge as a sheet on mobile, centered as a card from
|
|
109
|
-
* `sm` up. Animation (slide-up on mobile, fade/zoom on desktop) is driven by
|
|
110
|
-
* [data-slot="dialog-content"] rules in animations.css, not by this class.
|
|
111
|
-
*/
|
|
112
|
-
const dialogContentClassName =
|
|
113
|
-
"bg-popover text-popover-foreground fixed inset-x-0 bottom-0 z-50 grid max-h-[90dvh] w-full gap-6 overflow-y-auto rounded-t-xl border p-4 outline-none sm:top-[50%] sm:bottom-auto sm:left-[50%] sm:w-[calc(100%-2rem)] sm:max-w-[30rem] sm:-translate-x-1/2 sm:-translate-y-1/2 sm:rounded-xl sm:p-6";
|
|
114
|
-
|
|
115
|
-
function DialogContent({
|
|
116
|
-
className,
|
|
117
|
-
children,
|
|
118
|
-
showCloseButton,
|
|
119
|
-
...props
|
|
120
|
-
}: React.ComponentProps<typeof BaseDialog.Popup> & {
|
|
121
|
-
showCloseButton?: boolean;
|
|
122
|
-
}) {
|
|
123
|
-
const isAlert = React.useContext(DialogAlertContext);
|
|
124
|
-
const shouldShowClose = showCloseButton ?? !isAlert;
|
|
125
|
-
|
|
126
|
-
return (
|
|
127
|
-
<BaseDialog.Portal data-slot="dialog-portal">
|
|
128
|
-
<DialogOverlay />
|
|
129
|
-
<BaseDialog.Popup
|
|
130
|
-
data-slot="dialog-content"
|
|
131
|
-
className={cn(dialogContentClassName, className)}
|
|
132
|
-
{...props}
|
|
133
|
-
>
|
|
134
|
-
{children}
|
|
135
|
-
{shouldShowClose && (
|
|
136
|
-
<BaseDialog.Close
|
|
137
|
-
data-slot="dialog-close"
|
|
138
|
-
className="text-muted-foreground hover:bg-muted hover:text-muted-foreground focus-visible:outline-ring absolute top-3 right-3 inline-flex size-9 items-center justify-center rounded-md border border-transparent opacity-100 transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 disabled:pointer-events-none sm:top-4 sm:right-4 [&_svg]:pointer-events-none [&_svg]:size-4.5 [&_svg]:shrink-0"
|
|
139
|
-
>
|
|
140
|
-
<XIcon />
|
|
141
|
-
<span className="sr-only">Close</span>
|
|
142
|
-
</BaseDialog.Close>
|
|
143
|
-
)}
|
|
144
|
-
</BaseDialog.Popup>
|
|
145
|
-
</BaseDialog.Portal>
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
|
|
150
|
-
return (
|
|
151
|
-
<div
|
|
152
|
-
data-slot="dialog-header"
|
|
153
|
-
className={cn("flex flex-col gap-2 text-left", className)}
|
|
154
|
-
{...props}
|
|
155
|
-
/>
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
function DialogFooter({ className, ...props }: React.ComponentProps<"div">) {
|
|
160
|
-
return (
|
|
161
|
-
<div
|
|
162
|
-
data-slot="dialog-footer"
|
|
163
|
-
className={cn("flex flex-col-reverse gap-3 sm:flex-row sm:justify-end", className)}
|
|
164
|
-
{...props}
|
|
165
|
-
/>
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function DialogTitle({ className, ...props }: React.ComponentProps<typeof BaseDialog.Title>) {
|
|
170
|
-
return (
|
|
171
|
-
<BaseDialog.Title
|
|
172
|
-
data-slot="dialog-title"
|
|
173
|
-
className={cn("text-lg leading-none font-semibold tracking-tight", className)}
|
|
174
|
-
{...props}
|
|
175
|
-
/>
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
function DialogDescription({
|
|
180
|
-
className,
|
|
181
|
-
...props
|
|
182
|
-
}: React.ComponentProps<typeof BaseDialog.Description>) {
|
|
183
|
-
return (
|
|
184
|
-
<BaseDialog.Description
|
|
185
|
-
data-slot="dialog-description"
|
|
186
|
-
className={cn("text-muted-foreground max-w-prose text-sm", className)}
|
|
187
|
-
{...props}
|
|
188
|
-
/>
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export {
|
|
193
|
-
Dialog,
|
|
194
|
-
DialogClose,
|
|
195
|
-
DialogContent,
|
|
196
|
-
DialogDescription,
|
|
197
|
-
DialogFooter,
|
|
198
|
-
DialogHeader,
|
|
199
|
-
DialogOverlay,
|
|
200
|
-
DialogPortal,
|
|
201
|
-
DialogTitle,
|
|
202
|
-
DialogTrigger,
|
|
203
|
-
};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
-
import { CreditCard, LogOut, Settings, User } from "lucide-react";
|
|
3
|
-
|
|
4
|
-
import { Button } from "../primitives/button";
|
|
5
|
-
import {
|
|
6
|
-
DropdownMenu,
|
|
7
|
-
DropdownMenuContent,
|
|
8
|
-
DropdownMenuGroup,
|
|
9
|
-
DropdownMenuItem,
|
|
10
|
-
DropdownMenuLabel,
|
|
11
|
-
DropdownMenuSeparator,
|
|
12
|
-
DropdownMenuShortcut,
|
|
13
|
-
DropdownMenuTrigger,
|
|
14
|
-
} from "./dropdown-menu";
|
|
15
|
-
|
|
16
|
-
const meta = {
|
|
17
|
-
title: "Overlays/DropdownMenu",
|
|
18
|
-
component: DropdownMenu,
|
|
19
|
-
tags: ["autodocs"],
|
|
20
|
-
argTypes: {
|
|
21
|
-
open: {
|
|
22
|
-
control: "boolean",
|
|
23
|
-
description: "Controls whether the dropdown menu is open",
|
|
24
|
-
},
|
|
25
|
-
defaultOpen: {
|
|
26
|
-
control: "boolean",
|
|
27
|
-
description: "Whether the dropdown menu is open by default (uncontrolled)",
|
|
28
|
-
},
|
|
29
|
-
modal: {
|
|
30
|
-
control: "boolean",
|
|
31
|
-
description: "When true, interaction outside the menu is disabled while open",
|
|
32
|
-
table: { defaultValue: { summary: "true" } },
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
} satisfies Meta<typeof DropdownMenu>;
|
|
36
|
-
|
|
37
|
-
export default meta;
|
|
38
|
-
type Story = StoryObj<typeof meta>;
|
|
39
|
-
|
|
40
|
-
export const Default: Story = {
|
|
41
|
-
render: () => (
|
|
42
|
-
<DropdownMenu>
|
|
43
|
-
<DropdownMenuTrigger asChild>
|
|
44
|
-
<Button variant="outline">Open Menu</Button>
|
|
45
|
-
</DropdownMenuTrigger>
|
|
46
|
-
<DropdownMenuContent className="w-56">
|
|
47
|
-
<DropdownMenuGroup>
|
|
48
|
-
<DropdownMenuLabel>My Account</DropdownMenuLabel>
|
|
49
|
-
<DropdownMenuSeparator />
|
|
50
|
-
<DropdownMenuItem>
|
|
51
|
-
<User className="mr-2 size-4" />
|
|
52
|
-
<span>Profile</span>
|
|
53
|
-
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
|
|
54
|
-
</DropdownMenuItem>
|
|
55
|
-
<DropdownMenuItem>
|
|
56
|
-
<CreditCard className="mr-2 size-4" />
|
|
57
|
-
<span>Billing</span>
|
|
58
|
-
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
|
|
59
|
-
</DropdownMenuItem>
|
|
60
|
-
<DropdownMenuItem>
|
|
61
|
-
<Settings className="mr-2 size-4" />
|
|
62
|
-
<span>Settings</span>
|
|
63
|
-
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
|
|
64
|
-
</DropdownMenuItem>
|
|
65
|
-
</DropdownMenuGroup>
|
|
66
|
-
<DropdownMenuSeparator />
|
|
67
|
-
<DropdownMenuItem variant="destructive">
|
|
68
|
-
<LogOut className="mr-2 size-4" />
|
|
69
|
-
<span>Log out</span>
|
|
70
|
-
</DropdownMenuItem>
|
|
71
|
-
</DropdownMenuContent>
|
|
72
|
-
</DropdownMenu>
|
|
73
|
-
),
|
|
74
|
-
};
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { Menu as DropdownMenuPrimitive } from "@base-ui/react/menu";
|
|
2
|
-
import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
|
-
import { cn } from "../../lib/utils";
|
|
6
|
-
|
|
7
|
-
function DropdownMenu(props: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
|
|
8
|
-
return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function DropdownMenuPortal(props: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
|
|
12
|
-
return <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function DropdownMenuTrigger({
|
|
16
|
-
asChild,
|
|
17
|
-
children,
|
|
18
|
-
...props
|
|
19
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger> & { asChild?: boolean }) {
|
|
20
|
-
return (
|
|
21
|
-
<DropdownMenuPrimitive.Trigger
|
|
22
|
-
data-slot="dropdown-menu-trigger"
|
|
23
|
-
{...(asChild && React.isValidElement(children)
|
|
24
|
-
? { render: children as React.ReactElement }
|
|
25
|
-
: {})}
|
|
26
|
-
{...props}
|
|
27
|
-
>
|
|
28
|
-
{!asChild && children}
|
|
29
|
-
</DropdownMenuPrimitive.Trigger>
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function DropdownMenuContent({
|
|
34
|
-
className,
|
|
35
|
-
sideOffset = 4,
|
|
36
|
-
children,
|
|
37
|
-
...props
|
|
38
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Popup> & { sideOffset?: number }) {
|
|
39
|
-
return (
|
|
40
|
-
<DropdownMenuPrimitive.Portal>
|
|
41
|
-
<DropdownMenuPrimitive.Backdrop className="ui-mobile-sheet-backdrop" />
|
|
42
|
-
<DropdownMenuPrimitive.Positioner
|
|
43
|
-
className="ui-mobile-sheet-positioner"
|
|
44
|
-
sideOffset={sideOffset}
|
|
45
|
-
>
|
|
46
|
-
<DropdownMenuPrimitive.Popup
|
|
47
|
-
data-slot="dropdown-menu-content"
|
|
48
|
-
className={cn(
|
|
49
|
-
"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 z-50 max-h-(--available-height) min-w-[8rem] origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 outline-none ui-mobile-sheet-popup",
|
|
50
|
-
className,
|
|
51
|
-
)}
|
|
52
|
-
{...props}
|
|
53
|
-
>
|
|
54
|
-
{children}
|
|
55
|
-
</DropdownMenuPrimitive.Popup>
|
|
56
|
-
</DropdownMenuPrimitive.Positioner>
|
|
57
|
-
</DropdownMenuPrimitive.Portal>
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function DropdownMenuGroup(props: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
|
|
62
|
-
return <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function DropdownMenuLabel({
|
|
66
|
-
className,
|
|
67
|
-
inset,
|
|
68
|
-
...props
|
|
69
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.GroupLabel> & { inset?: boolean }) {
|
|
70
|
-
return (
|
|
71
|
-
<DropdownMenuPrimitive.GroupLabel
|
|
72
|
-
data-slot="dropdown-menu-label"
|
|
73
|
-
data-inset={inset}
|
|
74
|
-
className={cn("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8", className)}
|
|
75
|
-
{...props}
|
|
76
|
-
/>
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function DropdownMenuItem({
|
|
81
|
-
className,
|
|
82
|
-
inset,
|
|
83
|
-
variant = "default",
|
|
84
|
-
...props
|
|
85
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
|
|
86
|
-
inset?: boolean;
|
|
87
|
-
variant?: "default" | "destructive";
|
|
88
|
-
}) {
|
|
89
|
-
return (
|
|
90
|
-
<DropdownMenuPrimitive.Item
|
|
91
|
-
data-slot="dropdown-menu-item"
|
|
92
|
-
data-inset={inset}
|
|
93
|
-
data-variant={variant}
|
|
94
|
-
className={cn(
|
|
95
|
-
"data-highlighted:bg-muted data-highlighted:text-muted-foreground data-[variant=destructive]:text-destructive-text data-[variant=destructive]:data-highlighted:bg-destructive/10 relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none data-disabled:pointer-events-none data-disabled:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
96
|
-
className,
|
|
97
|
-
)}
|
|
98
|
-
{...props}
|
|
99
|
-
/>
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function DropdownMenuCheckboxItem({
|
|
104
|
-
className,
|
|
105
|
-
children,
|
|
106
|
-
checked,
|
|
107
|
-
...props
|
|
108
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
|
|
109
|
-
return (
|
|
110
|
-
<DropdownMenuPrimitive.CheckboxItem
|
|
111
|
-
data-slot="dropdown-menu-checkbox-item"
|
|
112
|
-
className={cn(
|
|
113
|
-
"data-highlighted:bg-muted data-highlighted:text-muted-foreground relative flex cursor-default items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none select-none data-disabled:pointer-events-none data-disabled:opacity-50",
|
|
114
|
-
className,
|
|
115
|
-
)}
|
|
116
|
-
checked={checked}
|
|
117
|
-
{...props}
|
|
118
|
-
>
|
|
119
|
-
<span className="absolute left-2 flex size-3.5 items-center justify-center">
|
|
120
|
-
<DropdownMenuPrimitive.CheckboxItemIndicator>
|
|
121
|
-
<CheckIcon className="size-4" />
|
|
122
|
-
</DropdownMenuPrimitive.CheckboxItemIndicator>
|
|
123
|
-
</span>
|
|
124
|
-
{children}
|
|
125
|
-
</DropdownMenuPrimitive.CheckboxItem>
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
function DropdownMenuRadioGroup(
|
|
130
|
-
props: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>,
|
|
131
|
-
) {
|
|
132
|
-
return <DropdownMenuPrimitive.RadioGroup data-slot="dropdown-menu-radio-group" {...props} />;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function DropdownMenuRadioItem({
|
|
136
|
-
className,
|
|
137
|
-
children,
|
|
138
|
-
...props
|
|
139
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
|
|
140
|
-
return (
|
|
141
|
-
<DropdownMenuPrimitive.RadioItem
|
|
142
|
-
data-slot="dropdown-menu-radio-item"
|
|
143
|
-
className={cn(
|
|
144
|
-
"data-highlighted:bg-muted data-highlighted:text-muted-foreground relative flex cursor-default items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none select-none data-disabled:pointer-events-none data-disabled:opacity-50",
|
|
145
|
-
className,
|
|
146
|
-
)}
|
|
147
|
-
{...props}
|
|
148
|
-
>
|
|
149
|
-
<span className="absolute left-2 flex size-3.5 items-center justify-center">
|
|
150
|
-
<DropdownMenuPrimitive.RadioItemIndicator>
|
|
151
|
-
<CircleIcon className="size-2 fill-current" />
|
|
152
|
-
</DropdownMenuPrimitive.RadioItemIndicator>
|
|
153
|
-
</span>
|
|
154
|
-
{children}
|
|
155
|
-
</DropdownMenuPrimitive.RadioItem>
|
|
156
|
-
);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
function DropdownMenuSeparator({
|
|
160
|
-
className,
|
|
161
|
-
...props
|
|
162
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
|
|
163
|
-
return (
|
|
164
|
-
<DropdownMenuPrimitive.Separator
|
|
165
|
-
data-slot="dropdown-menu-separator"
|
|
166
|
-
className={cn("bg-border -mx-1 my-1 h-px", className)}
|
|
167
|
-
{...props}
|
|
168
|
-
/>
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<"span">) {
|
|
173
|
-
return (
|
|
174
|
-
<span className={cn("ml-auto text-xs tracking-widest opacity-60", className)} {...props} />
|
|
175
|
-
);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
function DropdownMenuSub(props: React.ComponentProps<typeof DropdownMenuPrimitive.SubmenuRoot>) {
|
|
179
|
-
return <DropdownMenuPrimitive.SubmenuRoot data-slot="dropdown-menu-sub" {...props} />;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function DropdownMenuSubTrigger({
|
|
183
|
-
className,
|
|
184
|
-
inset,
|
|
185
|
-
children,
|
|
186
|
-
...props
|
|
187
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.SubmenuTrigger> & { inset?: boolean }) {
|
|
188
|
-
return (
|
|
189
|
-
<DropdownMenuPrimitive.SubmenuTrigger
|
|
190
|
-
data-slot="dropdown-menu-sub-trigger"
|
|
191
|
-
data-inset={inset}
|
|
192
|
-
className={cn(
|
|
193
|
-
"data-highlighted:bg-muted data-highlighted:text-muted-foreground data-open:bg-muted data-open:text-muted-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[inset]:pl-8",
|
|
194
|
-
className,
|
|
195
|
-
)}
|
|
196
|
-
{...props}
|
|
197
|
-
>
|
|
198
|
-
{children}
|
|
199
|
-
<ChevronRightIcon className="ml-auto size-4" />
|
|
200
|
-
</DropdownMenuPrimitive.SubmenuTrigger>
|
|
201
|
-
);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function DropdownMenuSubContent({
|
|
205
|
-
className,
|
|
206
|
-
...props
|
|
207
|
-
}: React.ComponentProps<typeof DropdownMenuPrimitive.Popup>) {
|
|
208
|
-
return (
|
|
209
|
-
<DropdownMenuPrimitive.Popup
|
|
210
|
-
data-slot="dropdown-menu-sub-content"
|
|
211
|
-
className={cn(
|
|
212
|
-
"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-lg outline-none",
|
|
213
|
-
className,
|
|
214
|
-
)}
|
|
215
|
-
{...props}
|
|
216
|
-
/>
|
|
217
|
-
);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
export {
|
|
221
|
-
DropdownMenu,
|
|
222
|
-
DropdownMenuCheckboxItem,
|
|
223
|
-
DropdownMenuContent,
|
|
224
|
-
DropdownMenuGroup,
|
|
225
|
-
DropdownMenuItem,
|
|
226
|
-
DropdownMenuLabel,
|
|
227
|
-
DropdownMenuPortal,
|
|
228
|
-
DropdownMenuRadioGroup,
|
|
229
|
-
DropdownMenuRadioItem,
|
|
230
|
-
DropdownMenuSeparator,
|
|
231
|
-
DropdownMenuShortcut,
|
|
232
|
-
DropdownMenuSub,
|
|
233
|
-
DropdownMenuSubContent,
|
|
234
|
-
DropdownMenuSubTrigger,
|
|
235
|
-
DropdownMenuTrigger,
|
|
236
|
-
};
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
Command,
|
|
3
|
-
CommandDialog,
|
|
4
|
-
CommandEmpty,
|
|
5
|
-
CommandGroup,
|
|
6
|
-
CommandInput,
|
|
7
|
-
CommandItem,
|
|
8
|
-
CommandList,
|
|
9
|
-
CommandListLoading,
|
|
10
|
-
CommandSeparator,
|
|
11
|
-
CommandShortcut,
|
|
12
|
-
} from "./command";
|
|
13
|
-
export {
|
|
14
|
-
Dialog,
|
|
15
|
-
DialogClose,
|
|
16
|
-
DialogContent,
|
|
17
|
-
DialogDescription,
|
|
18
|
-
DialogFooter,
|
|
19
|
-
DialogHeader,
|
|
20
|
-
DialogOverlay,
|
|
21
|
-
DialogPortal,
|
|
22
|
-
DialogTitle,
|
|
23
|
-
DialogTrigger,
|
|
24
|
-
} from "./dialog";
|
|
25
|
-
export {
|
|
26
|
-
DropdownMenu,
|
|
27
|
-
DropdownMenuCheckboxItem,
|
|
28
|
-
DropdownMenuContent,
|
|
29
|
-
DropdownMenuGroup,
|
|
30
|
-
DropdownMenuItem,
|
|
31
|
-
DropdownMenuLabel,
|
|
32
|
-
DropdownMenuPortal,
|
|
33
|
-
DropdownMenuRadioGroup,
|
|
34
|
-
DropdownMenuRadioItem,
|
|
35
|
-
DropdownMenuSeparator,
|
|
36
|
-
DropdownMenuShortcut,
|
|
37
|
-
DropdownMenuSub,
|
|
38
|
-
DropdownMenuSubContent,
|
|
39
|
-
DropdownMenuSubTrigger,
|
|
40
|
-
DropdownMenuTrigger,
|
|
41
|
-
} from "./dropdown-menu";
|
|
42
|
-
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "./popover";
|
|
43
|
-
export { BottomSheet, type BottomSheetProps } from "./bottom-sheet";
|
|
44
|
-
export { Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger } from "./tooltip";
|
|
45
|
-
export {
|
|
46
|
-
Sheet,
|
|
47
|
-
SheetClose,
|
|
48
|
-
SheetContent,
|
|
49
|
-
SheetDescription,
|
|
50
|
-
SheetFooter,
|
|
51
|
-
SheetHeader,
|
|
52
|
-
SheetOverlay,
|
|
53
|
-
SheetPortal,
|
|
54
|
-
SheetTitle,
|
|
55
|
-
SheetTrigger,
|
|
56
|
-
} from "./sheet";
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from "@storybook/react-vite";
|
|
2
|
-
|
|
3
|
-
import { Button } from "../primitives/button";
|
|
4
|
-
import { Popover, PopoverContent, PopoverTrigger } from "./popover";
|
|
5
|
-
|
|
6
|
-
const meta = {
|
|
7
|
-
title: "Overlays/Popover",
|
|
8
|
-
component: Popover,
|
|
9
|
-
tags: ["autodocs"],
|
|
10
|
-
} satisfies Meta<typeof Popover>;
|
|
11
|
-
|
|
12
|
-
export default meta;
|
|
13
|
-
type Story = StoryObj<typeof meta>;
|
|
14
|
-
|
|
15
|
-
export const Default: Story = {
|
|
16
|
-
render: () => (
|
|
17
|
-
<Popover>
|
|
18
|
-
<PopoverTrigger asChild>
|
|
19
|
-
<Button variant="outline">Open Popover</Button>
|
|
20
|
-
</PopoverTrigger>
|
|
21
|
-
<PopoverContent>
|
|
22
|
-
<div className="grid gap-1.5">
|
|
23
|
-
<h4 className="text-foreground leading-none font-medium">Dimensions</h4>
|
|
24
|
-
<p className="text-muted-foreground text-sm">Set the dimensions for the layer.</p>
|
|
25
|
-
</div>
|
|
26
|
-
<div className="grid gap-4 pt-4">
|
|
27
|
-
<div className="grid grid-cols-3 items-center gap-4">
|
|
28
|
-
<label htmlFor="popover-width" className="text-sm">
|
|
29
|
-
Width
|
|
30
|
-
</label>
|
|
31
|
-
<input
|
|
32
|
-
id="popover-width"
|
|
33
|
-
className="col-span-2 h-8 rounded border px-2 text-sm"
|
|
34
|
-
defaultValue="100%"
|
|
35
|
-
/>
|
|
36
|
-
</div>
|
|
37
|
-
<div className="grid grid-cols-3 items-center gap-4">
|
|
38
|
-
<label htmlFor="popover-height" className="text-sm">
|
|
39
|
-
Height
|
|
40
|
-
</label>
|
|
41
|
-
<input
|
|
42
|
-
id="popover-height"
|
|
43
|
-
className="col-span-2 h-8 rounded border px-2 text-sm"
|
|
44
|
-
defaultValue="25px"
|
|
45
|
-
/>
|
|
46
|
-
</div>
|
|
47
|
-
</div>
|
|
48
|
-
</PopoverContent>
|
|
49
|
-
</Popover>
|
|
50
|
-
),
|
|
51
|
-
};
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
|
|
2
|
-
import { XIcon } from "lucide-react";
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
|
-
import { useIsMobile } from "../../hooks/use-mobile";
|
|
6
|
-
import { cn } from "../../lib/utils";
|
|
7
|
-
|
|
8
|
-
function Popover({ modal, ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {
|
|
9
|
-
const isMobile = useIsMobile();
|
|
10
|
-
return <PopoverPrimitive.Root data-slot="popover" modal={modal ?? isMobile} {...props} />;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function PopoverTrigger({
|
|
14
|
-
asChild,
|
|
15
|
-
children,
|
|
16
|
-
...props
|
|
17
|
-
}: React.ComponentProps<typeof PopoverPrimitive.Trigger> & { asChild?: boolean }) {
|
|
18
|
-
return (
|
|
19
|
-
<PopoverPrimitive.Trigger
|
|
20
|
-
data-slot="popover-trigger"
|
|
21
|
-
{...(asChild && React.isValidElement(children)
|
|
22
|
-
? { render: children as React.ReactElement }
|
|
23
|
-
: {})}
|
|
24
|
-
{...props}
|
|
25
|
-
>
|
|
26
|
-
{!asChild && children}
|
|
27
|
-
</PopoverPrimitive.Trigger>
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function PopoverContent({
|
|
32
|
-
className,
|
|
33
|
-
align = "center",
|
|
34
|
-
sideOffset = 4,
|
|
35
|
-
children,
|
|
36
|
-
side = "bottom",
|
|
37
|
-
avoidCollisions = true,
|
|
38
|
-
...props
|
|
39
|
-
}: React.ComponentProps<typeof PopoverPrimitive.Popup> & {
|
|
40
|
-
align?: "start" | "center" | "end";
|
|
41
|
-
sideOffset?: number;
|
|
42
|
-
side?: "top" | "right" | "bottom" | "left";
|
|
43
|
-
avoidCollisions?: boolean;
|
|
44
|
-
}) {
|
|
45
|
-
return (
|
|
46
|
-
<PopoverPrimitive.Portal>
|
|
47
|
-
<PopoverPrimitive.Backdrop className="ui-mobile-sheet-backdrop" />
|
|
48
|
-
<PopoverPrimitive.Positioner
|
|
49
|
-
className="ui-mobile-sheet-positioner"
|
|
50
|
-
align={align}
|
|
51
|
-
side={side}
|
|
52
|
-
sideOffset={sideOffset}
|
|
53
|
-
collisionAvoidance={avoidCollisions ? undefined : { side: "none", align: "none" }}
|
|
54
|
-
>
|
|
55
|
-
<PopoverPrimitive.Popup
|
|
56
|
-
data-slot="popover-content"
|
|
57
|
-
className={cn(
|
|
58
|
-
"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 relative z-50 w-72 origin-(--transform-origin) rounded-md border p-4 outline-hidden ui-mobile-sheet-popup ui-mobile-popover-popup",
|
|
59
|
-
className,
|
|
60
|
-
)}
|
|
61
|
-
{...props}
|
|
62
|
-
>
|
|
63
|
-
{children}
|
|
64
|
-
<PopoverPrimitive.Close className="ui-mobile-sheet-close">
|
|
65
|
-
<XIcon aria-hidden="true" />
|
|
66
|
-
<span className="sr-only">Close</span>
|
|
67
|
-
</PopoverPrimitive.Close>
|
|
68
|
-
</PopoverPrimitive.Popup>
|
|
69
|
-
</PopoverPrimitive.Positioner>
|
|
70
|
-
</PopoverPrimitive.Portal>
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {
|
|
75
|
-
return <PopoverPrimitive.Trigger data-slot="popover-anchor" {...props} />;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };
|