@c9up/nebula 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/LICENSE +21 -0
- package/README.md +256 -0
- package/dist/adapters/css.d.ts +33 -0
- package/dist/adapters/css.js +67 -0
- package/dist/adapters/index.d.ts +16 -0
- package/dist/adapters/index.js +27 -0
- package/dist/adapters/tailwind.d.ts +25 -0
- package/dist/adapters/tailwind.js +122 -0
- package/dist/adapters/types.d.ts +49 -0
- package/dist/adapters/types.js +21 -0
- package/dist/adapters/unocss.d.ts +17 -0
- package/dist/adapters/unocss.js +107 -0
- package/dist/atoms/AspectRatio.d.ts +17 -0
- package/dist/atoms/AspectRatio.js +19 -0
- package/dist/atoms/Avatar.d.ts +23 -0
- package/dist/atoms/Avatar.js +46 -0
- package/dist/atoms/Badge.d.ts +25 -0
- package/dist/atoms/Badge.js +28 -0
- package/dist/atoms/Button.d.ts +58 -0
- package/dist/atoms/Button.js +67 -0
- package/dist/atoms/Checkbox.d.ts +41 -0
- package/dist/atoms/Checkbox.js +47 -0
- package/dist/atoms/Input.d.ts +36 -0
- package/dist/atoms/Input.js +50 -0
- package/dist/atoms/Kbd.d.ts +14 -0
- package/dist/atoms/Kbd.js +17 -0
- package/dist/atoms/Label.d.ts +24 -0
- package/dist/atoms/Label.js +26 -0
- package/dist/atoms/Marker.d.ts +42 -0
- package/dist/atoms/Marker.js +55 -0
- package/dist/atoms/NativeSelect.d.ts +43 -0
- package/dist/atoms/NativeSelect.js +81 -0
- package/dist/atoms/Progress.d.ts +21 -0
- package/dist/atoms/Progress.js +48 -0
- package/dist/atoms/ScrollArea.d.ts +28 -0
- package/dist/atoms/ScrollArea.js +37 -0
- package/dist/atoms/Separator.d.ts +16 -0
- package/dist/atoms/Separator.js +21 -0
- package/dist/atoms/Skeleton.d.ts +13 -0
- package/dist/atoms/Skeleton.js +18 -0
- package/dist/atoms/Slider.d.ts +30 -0
- package/dist/atoms/Slider.js +40 -0
- package/dist/atoms/Spinner.d.ts +17 -0
- package/dist/atoms/Spinner.js +20 -0
- package/dist/atoms/Switch.d.ts +24 -0
- package/dist/atoms/Switch.js +41 -0
- package/dist/atoms/Textarea.d.ts +28 -0
- package/dist/atoms/Textarea.js +36 -0
- package/dist/atoms/Toggle.d.ts +38 -0
- package/dist/atoms/Toggle.js +45 -0
- package/dist/atoms/index.d.ts +32 -0
- package/dist/atoms/index.js +32 -0
- package/dist/cli/add.d.ts +44 -0
- package/dist/cli/add.js +99 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/registry.d.ts +31 -0
- package/dist/cli/registry.js +83 -0
- package/dist/config.d.ts +81 -0
- package/dist/config.js +43 -0
- package/dist/configure.d.ts +34 -0
- package/dist/configure.js +85 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +41 -0
- package/dist/lib/children.d.ts +28 -0
- package/dist/lib/children.js +27 -0
- package/dist/lib/cn.d.ts +13 -0
- package/dist/lib/cn.js +13 -0
- package/dist/lib/cva.d.ts +83 -0
- package/dist/lib/cva.js +178 -0
- package/dist/lib/icons.d.ts +44 -0
- package/dist/lib/icons.js +79 -0
- package/dist/lib/id.d.ts +31 -0
- package/dist/lib/id.js +41 -0
- package/dist/lib/index.d.ts +12 -0
- package/dist/lib/index.js +12 -0
- package/dist/lib/motion.d.ts +31 -0
- package/dist/lib/motion.js +39 -0
- package/dist/lib/props.d.ts +48 -0
- package/dist/lib/props.js +59 -0
- package/dist/lib/styled.d.ts +31 -0
- package/dist/lib/styled.js +39 -0
- package/dist/molecules/Accordion.d.ts +35 -0
- package/dist/molecules/Accordion.js +117 -0
- package/dist/molecules/Alert.d.ts +30 -0
- package/dist/molecules/Alert.js +35 -0
- package/dist/molecules/Attachment.d.ts +39 -0
- package/dist/molecules/Attachment.js +103 -0
- package/dist/molecules/Breadcrumb.d.ts +29 -0
- package/dist/molecules/Breadcrumb.js +73 -0
- package/dist/molecules/Bubble.d.ts +56 -0
- package/dist/molecules/Bubble.js +92 -0
- package/dist/molecules/ButtonGroup.d.ts +23 -0
- package/dist/molecules/ButtonGroup.js +30 -0
- package/dist/molecules/Card.d.ts +17 -0
- package/dist/molecules/Card.js +17 -0
- package/dist/molecules/Collapsible.d.ts +40 -0
- package/dist/molecules/Collapsible.js +71 -0
- package/dist/molecules/Empty.d.ts +16 -0
- package/dist/molecules/Empty.js +16 -0
- package/dist/molecules/Field.d.ts +54 -0
- package/dist/molecules/Field.js +82 -0
- package/dist/molecules/InputGroup.d.ts +33 -0
- package/dist/molecules/InputGroup.js +35 -0
- package/dist/molecules/InputOTP.d.ts +33 -0
- package/dist/molecules/InputOTP.js +140 -0
- package/dist/molecules/Item.d.ts +41 -0
- package/dist/molecules/Item.js +48 -0
- package/dist/molecules/Message.d.ts +43 -0
- package/dist/molecules/Message.js +82 -0
- package/dist/molecules/Pagination.d.ts +41 -0
- package/dist/molecules/Pagination.js +144 -0
- package/dist/molecules/RadioGroup.d.ts +32 -0
- package/dist/molecules/RadioGroup.js +65 -0
- package/dist/molecules/Resizable.d.ts +37 -0
- package/dist/molecules/Resizable.js +136 -0
- package/dist/molecules/Table.d.ts +37 -0
- package/dist/molecules/Table.js +78 -0
- package/dist/molecules/Tabs.d.ts +37 -0
- package/dist/molecules/Tabs.js +109 -0
- package/dist/molecules/ToggleGroup.d.ts +37 -0
- package/dist/molecules/ToggleGroup.js +68 -0
- package/dist/molecules/Typography.d.ts +26 -0
- package/dist/molecules/Typography.js +67 -0
- package/dist/molecules/index.d.ts +37 -0
- package/dist/molecules/index.js +37 -0
- package/dist/organisms/AlertDialog.d.ts +40 -0
- package/dist/organisms/AlertDialog.js +104 -0
- package/dist/organisms/Calendar.d.ts +96 -0
- package/dist/organisms/Calendar.js +353 -0
- package/dist/organisms/Carousel.d.ts +29 -0
- package/dist/organisms/Carousel.js +128 -0
- package/dist/organisms/Chart.d.ts +55 -0
- package/dist/organisms/Chart.js +189 -0
- package/dist/organisms/Combobox.d.ts +41 -0
- package/dist/organisms/Combobox.js +102 -0
- package/dist/organisms/Command.d.ts +46 -0
- package/dist/organisms/Command.js +171 -0
- package/dist/organisms/CommandDialog.d.ts +42 -0
- package/dist/organisms/CommandDialog.js +116 -0
- package/dist/organisms/ContextMenu.d.ts +29 -0
- package/dist/organisms/ContextMenu.js +102 -0
- package/dist/organisms/DataTable.d.ts +50 -0
- package/dist/organisms/DataTable.js +257 -0
- package/dist/organisms/DatePicker.d.ts +34 -0
- package/dist/organisms/DatePicker.js +115 -0
- package/dist/organisms/DateRangePicker.d.ts +34 -0
- package/dist/organisms/DateRangePicker.js +122 -0
- package/dist/organisms/Dialog.d.ts +50 -0
- package/dist/organisms/Dialog.js +116 -0
- package/dist/organisms/Drawer.d.ts +40 -0
- package/dist/organisms/Drawer.js +131 -0
- package/dist/organisms/DropdownMenu.d.ts +30 -0
- package/dist/organisms/DropdownMenu.js +91 -0
- package/dist/organisms/Form.d.ts +114 -0
- package/dist/organisms/Form.js +151 -0
- package/dist/organisms/HoverCard.d.ts +30 -0
- package/dist/organisms/HoverCard.js +68 -0
- package/dist/organisms/Menubar.d.ts +28 -0
- package/dist/organisms/Menubar.js +147 -0
- package/dist/organisms/MessageScroller.d.ts +36 -0
- package/dist/organisms/MessageScroller.js +124 -0
- package/dist/organisms/NavigationMenu.d.ts +41 -0
- package/dist/organisms/NavigationMenu.js +139 -0
- package/dist/organisms/Popover.d.ts +33 -0
- package/dist/organisms/Popover.js +58 -0
- package/dist/organisms/Questionnaire.d.ts +74 -0
- package/dist/organisms/Questionnaire.js +235 -0
- package/dist/organisms/Select.d.ts +47 -0
- package/dist/organisms/Select.js +250 -0
- package/dist/organisms/Sheet.d.ts +34 -0
- package/dist/organisms/Sheet.js +107 -0
- package/dist/organisms/Sidebar.d.ts +100 -0
- package/dist/organisms/Sidebar.js +228 -0
- package/dist/organisms/Toaster.d.ts +67 -0
- package/dist/organisms/Toaster.js +189 -0
- package/dist/organisms/Tooltip.d.ts +39 -0
- package/dist/organisms/Tooltip.js +94 -0
- package/dist/organisms/index.d.ts +40 -0
- package/dist/organisms/index.js +40 -0
- package/dist/primitives/controllable.d.ts +38 -0
- package/dist/primitives/controllable.js +43 -0
- package/dist/primitives/dismissable.d.ts +53 -0
- package/dist/primitives/dismissable.js +158 -0
- package/dist/primitives/floating.d.ts +116 -0
- package/dist/primitives/floating.js +289 -0
- package/dist/primitives/floatingSurface.d.ts +56 -0
- package/dist/primitives/floatingSurface.js +142 -0
- package/dist/primitives/focusTrap.d.ts +47 -0
- package/dist/primitives/focusTrap.js +101 -0
- package/dist/primitives/focusable.d.ts +53 -0
- package/dist/primitives/focusable.js +109 -0
- package/dist/primitives/index.d.ts +27 -0
- package/dist/primitives/index.js +27 -0
- package/dist/primitives/menu.d.ts +102 -0
- package/dist/primitives/menu.js +356 -0
- package/dist/primitives/modalSurface.d.ts +54 -0
- package/dist/primitives/modalSurface.js +146 -0
- package/dist/primitives/portal.d.ts +34 -0
- package/dist/primitives/portal.js +42 -0
- package/dist/primitives/presence.d.ts +45 -0
- package/dist/primitives/presence.js +152 -0
- package/dist/primitives/rovingFocus.d.ts +47 -0
- package/dist/primitives/rovingFocus.js +176 -0
- package/dist/primitives/scrollLock.d.ts +21 -0
- package/dist/primitives/scrollLock.js +75 -0
- package/dist/primitives/typeahead.d.ts +39 -0
- package/dist/primitives/typeahead.js +123 -0
- package/dist/templates/AppShell.d.ts +30 -0
- package/dist/templates/AppShell.js +42 -0
- package/dist/templates/AuthLayout.d.ts +23 -0
- package/dist/templates/AuthLayout.js +42 -0
- package/dist/templates/SettingsLayout.d.ts +27 -0
- package/dist/templates/SettingsLayout.js +42 -0
- package/dist/templates/index.d.ts +16 -0
- package/dist/templates/index.js +16 -0
- package/nebula.css +2 -0
- package/package.json +92 -0
- package/registry.json +1107 -0
- package/src/adapters/css.ts +75 -0
- package/src/adapters/index.ts +40 -0
- package/src/adapters/tailwind.ts +134 -0
- package/src/adapters/types.ts +53 -0
- package/src/adapters/unocss.ts +116 -0
- package/src/atoms/AspectRatio.ts +28 -0
- package/src/atoms/Avatar.ts +67 -0
- package/src/atoms/Badge.ts +46 -0
- package/src/atoms/Button.ts +96 -0
- package/src/atoms/Checkbox.ts +76 -0
- package/src/atoms/Input.ts +76 -0
- package/src/atoms/Kbd.ts +28 -0
- package/src/atoms/Label.ts +38 -0
- package/src/atoms/Marker.ts +79 -0
- package/src/atoms/NativeSelect.ts +115 -0
- package/src/atoms/Progress.ts +64 -0
- package/src/atoms/ScrollArea.ts +53 -0
- package/src/atoms/Separator.ts +36 -0
- package/src/atoms/Skeleton.ts +24 -0
- package/src/atoms/Slider.ts +65 -0
- package/src/atoms/Spinner.ts +28 -0
- package/src/atoms/Switch.ts +56 -0
- package/src/atoms/Textarea.ts +58 -0
- package/src/atoms/Toggle.ts +67 -0
- package/src/atoms/index.ts +62 -0
- package/src/cli/add.ts +126 -0
- package/src/cli/index.ts +22 -0
- package/src/cli/registry.ts +116 -0
- package/src/config.ts +102 -0
- package/src/configure.ts +127 -0
- package/src/index.ts +53 -0
- package/src/lib/children.ts +43 -0
- package/src/lib/cn.ts +14 -0
- package/src/lib/cva.ts +249 -0
- package/src/lib/icons.ts +138 -0
- package/src/lib/id.ts +44 -0
- package/src/lib/index.ts +21 -0
- package/src/lib/motion.ts +48 -0
- package/src/lib/props.ts +83 -0
- package/src/lib/styled.ts +60 -0
- package/src/molecules/Accordion.ts +161 -0
- package/src/molecules/Alert.ts +58 -0
- package/src/molecules/Attachment.ts +132 -0
- package/src/molecules/Breadcrumb.ts +107 -0
- package/src/molecules/Bubble.ts +134 -0
- package/src/molecules/ButtonGroup.ts +55 -0
- package/src/molecules/Card.ts +42 -0
- package/src/molecules/Collapsible.ts +89 -0
- package/src/molecules/Empty.ts +43 -0
- package/src/molecules/Field.ts +131 -0
- package/src/molecules/InputGroup.ts +62 -0
- package/src/molecules/InputOTP.ts +166 -0
- package/src/molecules/Item.ts +89 -0
- package/src/molecules/Message.ts +127 -0
- package/src/molecules/Pagination.ts +197 -0
- package/src/molecules/RadioGroup.ts +104 -0
- package/src/molecules/Resizable.ts +166 -0
- package/src/molecules/Table.ts +118 -0
- package/src/molecules/Tabs.ts +148 -0
- package/src/molecules/ToggleGroup.ts +109 -0
- package/src/molecules/Typography.ts +94 -0
- package/src/molecules/index.ts +144 -0
- package/src/organisms/AlertDialog.ts +133 -0
- package/src/organisms/Calendar.ts +470 -0
- package/src/organisms/Carousel.ts +161 -0
- package/src/organisms/Chart.ts +257 -0
- package/src/organisms/Combobox.ts +140 -0
- package/src/organisms/Command.ts +211 -0
- package/src/organisms/CommandDialog.ts +149 -0
- package/src/organisms/ContextMenu.ts +125 -0
- package/src/organisms/DataTable.ts +328 -0
- package/src/organisms/DatePicker.ts +141 -0
- package/src/organisms/DateRangePicker.ts +149 -0
- package/src/organisms/Dialog.ts +162 -0
- package/src/organisms/Drawer.ts +167 -0
- package/src/organisms/DropdownMenu.ts +112 -0
- package/src/organisms/Form.ts +217 -0
- package/src/organisms/HoverCard.ts +92 -0
- package/src/organisms/Menubar.ts +167 -0
- package/src/organisms/MessageScroller.ts +145 -0
- package/src/organisms/NavigationMenu.ts +184 -0
- package/src/organisms/Popover.ts +84 -0
- package/src/organisms/Questionnaire.ts +322 -0
- package/src/organisms/Select.ts +286 -0
- package/src/organisms/Sheet.ts +144 -0
- package/src/organisms/Sidebar.ts +336 -0
- package/src/organisms/Toaster.ts +246 -0
- package/src/organisms/Tooltip.ts +124 -0
- package/src/organisms/index.ts +134 -0
- package/src/primitives/controllable.ts +64 -0
- package/src/primitives/dismissable.ts +195 -0
- package/src/primitives/floating.ts +453 -0
- package/src/primitives/floatingSurface.ts +209 -0
- package/src/primitives/focusTrap.ts +132 -0
- package/src/primitives/focusable.ts +108 -0
- package/src/primitives/index.ts +88 -0
- package/src/primitives/menu.ts +491 -0
- package/src/primitives/modalSurface.ts +199 -0
- package/src/primitives/portal.ts +61 -0
- package/src/primitives/presence.ts +185 -0
- package/src/primitives/rovingFocus.ts +212 -0
- package/src/primitives/scrollLock.ts +79 -0
- package/src/primitives/typeahead.ts +156 -0
- package/src/templates/AppShell.ts +56 -0
- package/src/templates/AuthLayout.ts +66 -0
- package/src/templates/SettingsLayout.ts +63 -0
- package/src/templates/index.ts +21 -0
- package/theme.css +151 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Molecules — assemblies of atoms, and small state machines.
|
|
3
|
+
*
|
|
4
|
+
* A component lands here when it composes other nebula components, or owns
|
|
5
|
+
* state that spans more than one element (Accordion's open set, Tabs'
|
|
6
|
+
* selection, InputOTP's characters). What it does *not* do is escape its own
|
|
7
|
+
* DOM position: nothing here portals, traps focus, or floats. Those are
|
|
8
|
+
* organisms.
|
|
9
|
+
*
|
|
10
|
+
* Compound components are data-driven — `Accordion({ items: [...] })`, not
|
|
11
|
+
* `<Accordion><AccordionItem>`. shadcn's compound API is a React-context
|
|
12
|
+
* artifact; Aurora has no context, and the alternatives (a factory returning
|
|
13
|
+
* bound parts, a handle threaded through props) are more machinery for less
|
|
14
|
+
* clarity. The rendered markup is unchanged, so shadcn's CSS and its examples
|
|
15
|
+
* still read across.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
Accordion,
|
|
20
|
+
type AccordionItem,
|
|
21
|
+
type AccordionProps,
|
|
22
|
+
} from "./Accordion.js";
|
|
23
|
+
export {
|
|
24
|
+
Alert,
|
|
25
|
+
AlertDescription,
|
|
26
|
+
type AlertProps,
|
|
27
|
+
AlertTitle,
|
|
28
|
+
type AlertVariants,
|
|
29
|
+
alertVariants,
|
|
30
|
+
} from "./Alert.js";
|
|
31
|
+
export {
|
|
32
|
+
Attachment,
|
|
33
|
+
type AttachmentProps,
|
|
34
|
+
formatBytes,
|
|
35
|
+
} from "./Attachment.js";
|
|
36
|
+
export { Breadcrumb, type BreadcrumbProps, type Crumb } from "./Breadcrumb.js";
|
|
37
|
+
export {
|
|
38
|
+
Bubble,
|
|
39
|
+
type BubbleProps,
|
|
40
|
+
type BubbleReaction,
|
|
41
|
+
type BubbleVariants,
|
|
42
|
+
bubbleVariants,
|
|
43
|
+
} from "./Bubble.js";
|
|
44
|
+
export {
|
|
45
|
+
ButtonGroup,
|
|
46
|
+
type ButtonGroupProps,
|
|
47
|
+
ButtonGroupSeparator,
|
|
48
|
+
ButtonGroupText,
|
|
49
|
+
} from "./ButtonGroup.js";
|
|
50
|
+
export {
|
|
51
|
+
Card,
|
|
52
|
+
CardAction,
|
|
53
|
+
CardContent,
|
|
54
|
+
CardDescription,
|
|
55
|
+
CardFooter,
|
|
56
|
+
CardHeader,
|
|
57
|
+
type CardProps,
|
|
58
|
+
CardTitle,
|
|
59
|
+
} from "./Card.js";
|
|
60
|
+
export { Collapsible, type CollapsibleProps } from "./Collapsible.js";
|
|
61
|
+
export {
|
|
62
|
+
Empty,
|
|
63
|
+
EmptyContent,
|
|
64
|
+
EmptyDescription,
|
|
65
|
+
EmptyHeader,
|
|
66
|
+
EmptyMedia,
|
|
67
|
+
type EmptyProps,
|
|
68
|
+
EmptyTitle,
|
|
69
|
+
} from "./Empty.js";
|
|
70
|
+
export {
|
|
71
|
+
Field,
|
|
72
|
+
FieldGroup,
|
|
73
|
+
type FieldIds,
|
|
74
|
+
type FieldProps,
|
|
75
|
+
FieldSeparator,
|
|
76
|
+
fieldIds,
|
|
77
|
+
} from "./Field.js";
|
|
78
|
+
export {
|
|
79
|
+
InputGroup,
|
|
80
|
+
InputGroupAddon,
|
|
81
|
+
type InputGroupProps,
|
|
82
|
+
inputGroupControlClasses,
|
|
83
|
+
} from "./InputGroup.js";
|
|
84
|
+
export { InputOTP, type InputOTPProps } from "./InputOTP.js";
|
|
85
|
+
export {
|
|
86
|
+
Item,
|
|
87
|
+
ItemActions,
|
|
88
|
+
ItemContent,
|
|
89
|
+
ItemDescription,
|
|
90
|
+
ItemGroup,
|
|
91
|
+
ItemMedia,
|
|
92
|
+
type ItemProps,
|
|
93
|
+
ItemSeparator,
|
|
94
|
+
ItemTitle,
|
|
95
|
+
type ItemVariants,
|
|
96
|
+
itemVariants,
|
|
97
|
+
} from "./Item.js";
|
|
98
|
+
export { Message, type MessageProps } from "./Message.js";
|
|
99
|
+
export {
|
|
100
|
+
type PageSlot,
|
|
101
|
+
Pagination,
|
|
102
|
+
type PaginationProps,
|
|
103
|
+
pageWindow,
|
|
104
|
+
} from "./Pagination.js";
|
|
105
|
+
export {
|
|
106
|
+
RadioGroup,
|
|
107
|
+
type RadioGroupProps,
|
|
108
|
+
type RadioOption,
|
|
109
|
+
} from "./RadioGroup.js";
|
|
110
|
+
export { Resizable, type ResizableProps } from "./Resizable.js";
|
|
111
|
+
export {
|
|
112
|
+
Table,
|
|
113
|
+
TableBody,
|
|
114
|
+
TableCaption,
|
|
115
|
+
TableCell,
|
|
116
|
+
type TableCellProps,
|
|
117
|
+
TableFooter,
|
|
118
|
+
TableHead,
|
|
119
|
+
TableHeader,
|
|
120
|
+
type TableProps,
|
|
121
|
+
TableRow,
|
|
122
|
+
type TableRowProps,
|
|
123
|
+
} from "./Table.js";
|
|
124
|
+
export { type TabItem, Tabs, type TabsProps } from "./Tabs.js";
|
|
125
|
+
export {
|
|
126
|
+
ToggleGroup,
|
|
127
|
+
type ToggleGroupItem,
|
|
128
|
+
type ToggleGroupProps,
|
|
129
|
+
} from "./ToggleGroup.js";
|
|
130
|
+
export {
|
|
131
|
+
Blockquote,
|
|
132
|
+
H1,
|
|
133
|
+
H2,
|
|
134
|
+
H3,
|
|
135
|
+
H4,
|
|
136
|
+
InlineCode,
|
|
137
|
+
Large,
|
|
138
|
+
Lead,
|
|
139
|
+
List,
|
|
140
|
+
Muted,
|
|
141
|
+
P,
|
|
142
|
+
Small,
|
|
143
|
+
type TypographyProps,
|
|
144
|
+
} from "./Typography.js";
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AlertDialog — a modal that interrupts to ask something.
|
|
3
|
+
*
|
|
4
|
+
* The differences from Dialog are all about refusing to be dismissed by
|
|
5
|
+
* accident, because the user is being asked to confirm something they cannot
|
|
6
|
+
* undo:
|
|
7
|
+
*
|
|
8
|
+
* - `role="alertdialog"`, which tells assistive technology this is not merely
|
|
9
|
+
* a window but a message requiring a response.
|
|
10
|
+
* - No close button and no backdrop dismissal. Both are the "click somewhere
|
|
11
|
+
* else and it goes away" gesture, and an accidental dismissal of "delete
|
|
12
|
+
* this?" reads as a cancel — the safe answer — but leaves the user unsure
|
|
13
|
+
* which one they gave.
|
|
14
|
+
* - Escape still closes. It is unambiguous and deliberate, and taking it away
|
|
15
|
+
* would trap a keyboard user in the dialog.
|
|
16
|
+
* - Focus starts on **Cancel**, not the action. The destructive button is the
|
|
17
|
+
* one the user must reach for on purpose.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { component, html } from "@c9up/aurora";
|
|
21
|
+
import { buttonVariants } from "../atoms/Button.js";
|
|
22
|
+
import type { Child } from "../lib/children.js";
|
|
23
|
+
import { type Slot, slot } from "../lib/children.js";
|
|
24
|
+
import { cn } from "../lib/cn.js";
|
|
25
|
+
import { uid } from "../lib/id.js";
|
|
26
|
+
import { fadeInOut, zoomInOut } from "../lib/motion.js";
|
|
27
|
+
import { type Reactive, read } from "../lib/props.js";
|
|
28
|
+
import { controllable } from "../primitives/controllable.js";
|
|
29
|
+
import { modalSurface } from "../primitives/modalSurface.js";
|
|
30
|
+
import { dialogBackdropClasses, dialogPanelClasses } from "./Dialog.js";
|
|
31
|
+
|
|
32
|
+
export interface AlertDialogProps {
|
|
33
|
+
trigger?: Slot;
|
|
34
|
+
title: Child;
|
|
35
|
+
description: Child;
|
|
36
|
+
/** Label for the confirming action. Default `"Continue"`. */
|
|
37
|
+
actionLabel?: Child;
|
|
38
|
+
/** Label for the way out. Default `"Cancel"`. */
|
|
39
|
+
cancelLabel?: Child;
|
|
40
|
+
/** Styles the action as destructive. */
|
|
41
|
+
destructive?: boolean;
|
|
42
|
+
open?: Reactive<boolean>;
|
|
43
|
+
defaultOpen?: boolean;
|
|
44
|
+
onOpenChange?: (open: boolean) => void;
|
|
45
|
+
onConfirm?: () => void;
|
|
46
|
+
onCancel?: () => void;
|
|
47
|
+
triggerClass?: Reactive<string>;
|
|
48
|
+
contentClass?: Reactive<string>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const AlertDialog = component<AlertDialogProps>((props) => {
|
|
52
|
+
const triggerId = uid("alert-dialog-trigger");
|
|
53
|
+
const panelId = uid("alert-dialog-panel");
|
|
54
|
+
const titleId = uid("alert-dialog-title");
|
|
55
|
+
const descriptionId = uid("alert-dialog-description");
|
|
56
|
+
const cancelId = uid("alert-dialog-cancel");
|
|
57
|
+
|
|
58
|
+
const state = controllable<boolean>({
|
|
59
|
+
value: props.open,
|
|
60
|
+
initial: props.defaultOpen ?? false,
|
|
61
|
+
onChange: props.onOpenChange,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
function cancel(): void {
|
|
65
|
+
props.onCancel?.();
|
|
66
|
+
state.set(false);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function confirm(): void {
|
|
70
|
+
props.onConfirm?.();
|
|
71
|
+
state.set(false);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
modalSurface({
|
|
75
|
+
open: () => state.current(),
|
|
76
|
+
onClose: cancel,
|
|
77
|
+
panel: (root) => root.querySelector(`#${CSS.escape(panelId)}`),
|
|
78
|
+
initialFocus: (panel) => panel.querySelector(`#${CSS.escape(cancelId)}`),
|
|
79
|
+
returnFocus: () => document.getElementById(triggerId),
|
|
80
|
+
dismissOnOutside: false,
|
|
81
|
+
content: () =>
|
|
82
|
+
html`<div data-slot="alert-dialog-overlay" class="${cn("fixed inset-0 z-50", fadeInOut)}">
|
|
83
|
+
<div class="${dialogBackdropClasses}"></div>
|
|
84
|
+
<div
|
|
85
|
+
data-slot="alert-dialog-content"
|
|
86
|
+
id="${panelId}"
|
|
87
|
+
role="alertdialog"
|
|
88
|
+
aria-modal="true"
|
|
89
|
+
aria-labelledby="${titleId}"
|
|
90
|
+
aria-describedby="${descriptionId}"
|
|
91
|
+
tabindex="-1"
|
|
92
|
+
class="${cn(dialogPanelClasses, zoomInOut, read(props.contentClass))}"
|
|
93
|
+
>
|
|
94
|
+
<div class="flex flex-col gap-2 text-center sm:text-left">
|
|
95
|
+
<h2 id="${titleId}" class="text-lg font-semibold">${props.title}</h2>
|
|
96
|
+
<p id="${descriptionId}" class="text-muted-foreground text-sm">
|
|
97
|
+
${props.description}
|
|
98
|
+
</p>
|
|
99
|
+
</div>
|
|
100
|
+
<div class="flex flex-col-reverse gap-2 sm:flex-row sm:justify-end">
|
|
101
|
+
<button
|
|
102
|
+
type="button"
|
|
103
|
+
id="${cancelId}"
|
|
104
|
+
data-slot="alert-dialog-cancel"
|
|
105
|
+
class="${buttonVariants({ variant: "outline" })}"
|
|
106
|
+
@click="${cancel}"
|
|
107
|
+
>${props.cancelLabel ?? "Cancel"}</button>
|
|
108
|
+
<button
|
|
109
|
+
type="button"
|
|
110
|
+
data-slot="alert-dialog-action"
|
|
111
|
+
class="${buttonVariants({
|
|
112
|
+
variant: props.destructive === true ? "destructive" : "default",
|
|
113
|
+
})}"
|
|
114
|
+
@click="${confirm}"
|
|
115
|
+
>${props.actionLabel ?? "Continue"}</button>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
</div>`,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
if (props.trigger === undefined) {
|
|
122
|
+
return html`<span data-slot="alert-dialog" hidden></span>`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return html`<button
|
|
126
|
+
type="button"
|
|
127
|
+
data-slot="alert-dialog-trigger"
|
|
128
|
+
id="${triggerId}"
|
|
129
|
+
aria-haspopup="dialog"
|
|
130
|
+
class="${() => cn(read(props.triggerClass))}"
|
|
131
|
+
@click="${() => state.set(true)}"
|
|
132
|
+
>${slot(props.trigger)}</button>`;
|
|
133
|
+
});
|