@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.
Files changed (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +256 -0
  3. package/dist/adapters/css.d.ts +33 -0
  4. package/dist/adapters/css.js +67 -0
  5. package/dist/adapters/index.d.ts +16 -0
  6. package/dist/adapters/index.js +27 -0
  7. package/dist/adapters/tailwind.d.ts +25 -0
  8. package/dist/adapters/tailwind.js +122 -0
  9. package/dist/adapters/types.d.ts +49 -0
  10. package/dist/adapters/types.js +21 -0
  11. package/dist/adapters/unocss.d.ts +17 -0
  12. package/dist/adapters/unocss.js +107 -0
  13. package/dist/atoms/AspectRatio.d.ts +17 -0
  14. package/dist/atoms/AspectRatio.js +19 -0
  15. package/dist/atoms/Avatar.d.ts +23 -0
  16. package/dist/atoms/Avatar.js +46 -0
  17. package/dist/atoms/Badge.d.ts +25 -0
  18. package/dist/atoms/Badge.js +28 -0
  19. package/dist/atoms/Button.d.ts +58 -0
  20. package/dist/atoms/Button.js +67 -0
  21. package/dist/atoms/Checkbox.d.ts +41 -0
  22. package/dist/atoms/Checkbox.js +47 -0
  23. package/dist/atoms/Input.d.ts +36 -0
  24. package/dist/atoms/Input.js +50 -0
  25. package/dist/atoms/Kbd.d.ts +14 -0
  26. package/dist/atoms/Kbd.js +17 -0
  27. package/dist/atoms/Label.d.ts +24 -0
  28. package/dist/atoms/Label.js +26 -0
  29. package/dist/atoms/Marker.d.ts +42 -0
  30. package/dist/atoms/Marker.js +55 -0
  31. package/dist/atoms/NativeSelect.d.ts +43 -0
  32. package/dist/atoms/NativeSelect.js +81 -0
  33. package/dist/atoms/Progress.d.ts +21 -0
  34. package/dist/atoms/Progress.js +48 -0
  35. package/dist/atoms/ScrollArea.d.ts +28 -0
  36. package/dist/atoms/ScrollArea.js +37 -0
  37. package/dist/atoms/Separator.d.ts +16 -0
  38. package/dist/atoms/Separator.js +21 -0
  39. package/dist/atoms/Skeleton.d.ts +13 -0
  40. package/dist/atoms/Skeleton.js +18 -0
  41. package/dist/atoms/Slider.d.ts +30 -0
  42. package/dist/atoms/Slider.js +40 -0
  43. package/dist/atoms/Spinner.d.ts +17 -0
  44. package/dist/atoms/Spinner.js +20 -0
  45. package/dist/atoms/Switch.d.ts +24 -0
  46. package/dist/atoms/Switch.js +41 -0
  47. package/dist/atoms/Textarea.d.ts +28 -0
  48. package/dist/atoms/Textarea.js +36 -0
  49. package/dist/atoms/Toggle.d.ts +38 -0
  50. package/dist/atoms/Toggle.js +45 -0
  51. package/dist/atoms/index.d.ts +32 -0
  52. package/dist/atoms/index.js +32 -0
  53. package/dist/cli/add.d.ts +44 -0
  54. package/dist/cli/add.js +99 -0
  55. package/dist/cli/index.d.ts +10 -0
  56. package/dist/cli/index.js +10 -0
  57. package/dist/cli/registry.d.ts +31 -0
  58. package/dist/cli/registry.js +83 -0
  59. package/dist/config.d.ts +81 -0
  60. package/dist/config.js +43 -0
  61. package/dist/configure.d.ts +34 -0
  62. package/dist/configure.js +85 -0
  63. package/dist/index.d.ts +41 -0
  64. package/dist/index.js +41 -0
  65. package/dist/lib/children.d.ts +28 -0
  66. package/dist/lib/children.js +27 -0
  67. package/dist/lib/cn.d.ts +13 -0
  68. package/dist/lib/cn.js +13 -0
  69. package/dist/lib/cva.d.ts +83 -0
  70. package/dist/lib/cva.js +178 -0
  71. package/dist/lib/icons.d.ts +44 -0
  72. package/dist/lib/icons.js +79 -0
  73. package/dist/lib/id.d.ts +31 -0
  74. package/dist/lib/id.js +41 -0
  75. package/dist/lib/index.d.ts +12 -0
  76. package/dist/lib/index.js +12 -0
  77. package/dist/lib/motion.d.ts +31 -0
  78. package/dist/lib/motion.js +39 -0
  79. package/dist/lib/props.d.ts +48 -0
  80. package/dist/lib/props.js +59 -0
  81. package/dist/lib/styled.d.ts +31 -0
  82. package/dist/lib/styled.js +39 -0
  83. package/dist/molecules/Accordion.d.ts +35 -0
  84. package/dist/molecules/Accordion.js +117 -0
  85. package/dist/molecules/Alert.d.ts +30 -0
  86. package/dist/molecules/Alert.js +35 -0
  87. package/dist/molecules/Attachment.d.ts +39 -0
  88. package/dist/molecules/Attachment.js +103 -0
  89. package/dist/molecules/Breadcrumb.d.ts +29 -0
  90. package/dist/molecules/Breadcrumb.js +73 -0
  91. package/dist/molecules/Bubble.d.ts +56 -0
  92. package/dist/molecules/Bubble.js +92 -0
  93. package/dist/molecules/ButtonGroup.d.ts +23 -0
  94. package/dist/molecules/ButtonGroup.js +30 -0
  95. package/dist/molecules/Card.d.ts +17 -0
  96. package/dist/molecules/Card.js +17 -0
  97. package/dist/molecules/Collapsible.d.ts +40 -0
  98. package/dist/molecules/Collapsible.js +71 -0
  99. package/dist/molecules/Empty.d.ts +16 -0
  100. package/dist/molecules/Empty.js +16 -0
  101. package/dist/molecules/Field.d.ts +54 -0
  102. package/dist/molecules/Field.js +82 -0
  103. package/dist/molecules/InputGroup.d.ts +33 -0
  104. package/dist/molecules/InputGroup.js +35 -0
  105. package/dist/molecules/InputOTP.d.ts +33 -0
  106. package/dist/molecules/InputOTP.js +140 -0
  107. package/dist/molecules/Item.d.ts +41 -0
  108. package/dist/molecules/Item.js +48 -0
  109. package/dist/molecules/Message.d.ts +43 -0
  110. package/dist/molecules/Message.js +82 -0
  111. package/dist/molecules/Pagination.d.ts +41 -0
  112. package/dist/molecules/Pagination.js +144 -0
  113. package/dist/molecules/RadioGroup.d.ts +32 -0
  114. package/dist/molecules/RadioGroup.js +65 -0
  115. package/dist/molecules/Resizable.d.ts +37 -0
  116. package/dist/molecules/Resizable.js +136 -0
  117. package/dist/molecules/Table.d.ts +37 -0
  118. package/dist/molecules/Table.js +78 -0
  119. package/dist/molecules/Tabs.d.ts +37 -0
  120. package/dist/molecules/Tabs.js +109 -0
  121. package/dist/molecules/ToggleGroup.d.ts +37 -0
  122. package/dist/molecules/ToggleGroup.js +68 -0
  123. package/dist/molecules/Typography.d.ts +26 -0
  124. package/dist/molecules/Typography.js +67 -0
  125. package/dist/molecules/index.d.ts +37 -0
  126. package/dist/molecules/index.js +37 -0
  127. package/dist/organisms/AlertDialog.d.ts +40 -0
  128. package/dist/organisms/AlertDialog.js +104 -0
  129. package/dist/organisms/Calendar.d.ts +96 -0
  130. package/dist/organisms/Calendar.js +353 -0
  131. package/dist/organisms/Carousel.d.ts +29 -0
  132. package/dist/organisms/Carousel.js +128 -0
  133. package/dist/organisms/Chart.d.ts +55 -0
  134. package/dist/organisms/Chart.js +189 -0
  135. package/dist/organisms/Combobox.d.ts +41 -0
  136. package/dist/organisms/Combobox.js +102 -0
  137. package/dist/organisms/Command.d.ts +46 -0
  138. package/dist/organisms/Command.js +171 -0
  139. package/dist/organisms/CommandDialog.d.ts +42 -0
  140. package/dist/organisms/CommandDialog.js +116 -0
  141. package/dist/organisms/ContextMenu.d.ts +29 -0
  142. package/dist/organisms/ContextMenu.js +102 -0
  143. package/dist/organisms/DataTable.d.ts +50 -0
  144. package/dist/organisms/DataTable.js +257 -0
  145. package/dist/organisms/DatePicker.d.ts +34 -0
  146. package/dist/organisms/DatePicker.js +115 -0
  147. package/dist/organisms/DateRangePicker.d.ts +34 -0
  148. package/dist/organisms/DateRangePicker.js +122 -0
  149. package/dist/organisms/Dialog.d.ts +50 -0
  150. package/dist/organisms/Dialog.js +116 -0
  151. package/dist/organisms/Drawer.d.ts +40 -0
  152. package/dist/organisms/Drawer.js +131 -0
  153. package/dist/organisms/DropdownMenu.d.ts +30 -0
  154. package/dist/organisms/DropdownMenu.js +91 -0
  155. package/dist/organisms/Form.d.ts +114 -0
  156. package/dist/organisms/Form.js +151 -0
  157. package/dist/organisms/HoverCard.d.ts +30 -0
  158. package/dist/organisms/HoverCard.js +68 -0
  159. package/dist/organisms/Menubar.d.ts +28 -0
  160. package/dist/organisms/Menubar.js +147 -0
  161. package/dist/organisms/MessageScroller.d.ts +36 -0
  162. package/dist/organisms/MessageScroller.js +124 -0
  163. package/dist/organisms/NavigationMenu.d.ts +41 -0
  164. package/dist/organisms/NavigationMenu.js +139 -0
  165. package/dist/organisms/Popover.d.ts +33 -0
  166. package/dist/organisms/Popover.js +58 -0
  167. package/dist/organisms/Questionnaire.d.ts +74 -0
  168. package/dist/organisms/Questionnaire.js +235 -0
  169. package/dist/organisms/Select.d.ts +47 -0
  170. package/dist/organisms/Select.js +250 -0
  171. package/dist/organisms/Sheet.d.ts +34 -0
  172. package/dist/organisms/Sheet.js +107 -0
  173. package/dist/organisms/Sidebar.d.ts +100 -0
  174. package/dist/organisms/Sidebar.js +228 -0
  175. package/dist/organisms/Toaster.d.ts +67 -0
  176. package/dist/organisms/Toaster.js +189 -0
  177. package/dist/organisms/Tooltip.d.ts +39 -0
  178. package/dist/organisms/Tooltip.js +94 -0
  179. package/dist/organisms/index.d.ts +40 -0
  180. package/dist/organisms/index.js +40 -0
  181. package/dist/primitives/controllable.d.ts +38 -0
  182. package/dist/primitives/controllable.js +43 -0
  183. package/dist/primitives/dismissable.d.ts +53 -0
  184. package/dist/primitives/dismissable.js +158 -0
  185. package/dist/primitives/floating.d.ts +116 -0
  186. package/dist/primitives/floating.js +289 -0
  187. package/dist/primitives/floatingSurface.d.ts +56 -0
  188. package/dist/primitives/floatingSurface.js +142 -0
  189. package/dist/primitives/focusTrap.d.ts +47 -0
  190. package/dist/primitives/focusTrap.js +101 -0
  191. package/dist/primitives/focusable.d.ts +53 -0
  192. package/dist/primitives/focusable.js +109 -0
  193. package/dist/primitives/index.d.ts +27 -0
  194. package/dist/primitives/index.js +27 -0
  195. package/dist/primitives/menu.d.ts +102 -0
  196. package/dist/primitives/menu.js +356 -0
  197. package/dist/primitives/modalSurface.d.ts +54 -0
  198. package/dist/primitives/modalSurface.js +146 -0
  199. package/dist/primitives/portal.d.ts +34 -0
  200. package/dist/primitives/portal.js +42 -0
  201. package/dist/primitives/presence.d.ts +45 -0
  202. package/dist/primitives/presence.js +152 -0
  203. package/dist/primitives/rovingFocus.d.ts +47 -0
  204. package/dist/primitives/rovingFocus.js +176 -0
  205. package/dist/primitives/scrollLock.d.ts +21 -0
  206. package/dist/primitives/scrollLock.js +75 -0
  207. package/dist/primitives/typeahead.d.ts +39 -0
  208. package/dist/primitives/typeahead.js +123 -0
  209. package/dist/templates/AppShell.d.ts +30 -0
  210. package/dist/templates/AppShell.js +42 -0
  211. package/dist/templates/AuthLayout.d.ts +23 -0
  212. package/dist/templates/AuthLayout.js +42 -0
  213. package/dist/templates/SettingsLayout.d.ts +27 -0
  214. package/dist/templates/SettingsLayout.js +42 -0
  215. package/dist/templates/index.d.ts +16 -0
  216. package/dist/templates/index.js +16 -0
  217. package/nebula.css +2 -0
  218. package/package.json +92 -0
  219. package/registry.json +1107 -0
  220. package/src/adapters/css.ts +75 -0
  221. package/src/adapters/index.ts +40 -0
  222. package/src/adapters/tailwind.ts +134 -0
  223. package/src/adapters/types.ts +53 -0
  224. package/src/adapters/unocss.ts +116 -0
  225. package/src/atoms/AspectRatio.ts +28 -0
  226. package/src/atoms/Avatar.ts +67 -0
  227. package/src/atoms/Badge.ts +46 -0
  228. package/src/atoms/Button.ts +96 -0
  229. package/src/atoms/Checkbox.ts +76 -0
  230. package/src/atoms/Input.ts +76 -0
  231. package/src/atoms/Kbd.ts +28 -0
  232. package/src/atoms/Label.ts +38 -0
  233. package/src/atoms/Marker.ts +79 -0
  234. package/src/atoms/NativeSelect.ts +115 -0
  235. package/src/atoms/Progress.ts +64 -0
  236. package/src/atoms/ScrollArea.ts +53 -0
  237. package/src/atoms/Separator.ts +36 -0
  238. package/src/atoms/Skeleton.ts +24 -0
  239. package/src/atoms/Slider.ts +65 -0
  240. package/src/atoms/Spinner.ts +28 -0
  241. package/src/atoms/Switch.ts +56 -0
  242. package/src/atoms/Textarea.ts +58 -0
  243. package/src/atoms/Toggle.ts +67 -0
  244. package/src/atoms/index.ts +62 -0
  245. package/src/cli/add.ts +126 -0
  246. package/src/cli/index.ts +22 -0
  247. package/src/cli/registry.ts +116 -0
  248. package/src/config.ts +102 -0
  249. package/src/configure.ts +127 -0
  250. package/src/index.ts +53 -0
  251. package/src/lib/children.ts +43 -0
  252. package/src/lib/cn.ts +14 -0
  253. package/src/lib/cva.ts +249 -0
  254. package/src/lib/icons.ts +138 -0
  255. package/src/lib/id.ts +44 -0
  256. package/src/lib/index.ts +21 -0
  257. package/src/lib/motion.ts +48 -0
  258. package/src/lib/props.ts +83 -0
  259. package/src/lib/styled.ts +60 -0
  260. package/src/molecules/Accordion.ts +161 -0
  261. package/src/molecules/Alert.ts +58 -0
  262. package/src/molecules/Attachment.ts +132 -0
  263. package/src/molecules/Breadcrumb.ts +107 -0
  264. package/src/molecules/Bubble.ts +134 -0
  265. package/src/molecules/ButtonGroup.ts +55 -0
  266. package/src/molecules/Card.ts +42 -0
  267. package/src/molecules/Collapsible.ts +89 -0
  268. package/src/molecules/Empty.ts +43 -0
  269. package/src/molecules/Field.ts +131 -0
  270. package/src/molecules/InputGroup.ts +62 -0
  271. package/src/molecules/InputOTP.ts +166 -0
  272. package/src/molecules/Item.ts +89 -0
  273. package/src/molecules/Message.ts +127 -0
  274. package/src/molecules/Pagination.ts +197 -0
  275. package/src/molecules/RadioGroup.ts +104 -0
  276. package/src/molecules/Resizable.ts +166 -0
  277. package/src/molecules/Table.ts +118 -0
  278. package/src/molecules/Tabs.ts +148 -0
  279. package/src/molecules/ToggleGroup.ts +109 -0
  280. package/src/molecules/Typography.ts +94 -0
  281. package/src/molecules/index.ts +144 -0
  282. package/src/organisms/AlertDialog.ts +133 -0
  283. package/src/organisms/Calendar.ts +470 -0
  284. package/src/organisms/Carousel.ts +161 -0
  285. package/src/organisms/Chart.ts +257 -0
  286. package/src/organisms/Combobox.ts +140 -0
  287. package/src/organisms/Command.ts +211 -0
  288. package/src/organisms/CommandDialog.ts +149 -0
  289. package/src/organisms/ContextMenu.ts +125 -0
  290. package/src/organisms/DataTable.ts +328 -0
  291. package/src/organisms/DatePicker.ts +141 -0
  292. package/src/organisms/DateRangePicker.ts +149 -0
  293. package/src/organisms/Dialog.ts +162 -0
  294. package/src/organisms/Drawer.ts +167 -0
  295. package/src/organisms/DropdownMenu.ts +112 -0
  296. package/src/organisms/Form.ts +217 -0
  297. package/src/organisms/HoverCard.ts +92 -0
  298. package/src/organisms/Menubar.ts +167 -0
  299. package/src/organisms/MessageScroller.ts +145 -0
  300. package/src/organisms/NavigationMenu.ts +184 -0
  301. package/src/organisms/Popover.ts +84 -0
  302. package/src/organisms/Questionnaire.ts +322 -0
  303. package/src/organisms/Select.ts +286 -0
  304. package/src/organisms/Sheet.ts +144 -0
  305. package/src/organisms/Sidebar.ts +336 -0
  306. package/src/organisms/Toaster.ts +246 -0
  307. package/src/organisms/Tooltip.ts +124 -0
  308. package/src/organisms/index.ts +134 -0
  309. package/src/primitives/controllable.ts +64 -0
  310. package/src/primitives/dismissable.ts +195 -0
  311. package/src/primitives/floating.ts +453 -0
  312. package/src/primitives/floatingSurface.ts +209 -0
  313. package/src/primitives/focusTrap.ts +132 -0
  314. package/src/primitives/focusable.ts +108 -0
  315. package/src/primitives/index.ts +88 -0
  316. package/src/primitives/menu.ts +491 -0
  317. package/src/primitives/modalSurface.ts +199 -0
  318. package/src/primitives/portal.ts +61 -0
  319. package/src/primitives/presence.ts +185 -0
  320. package/src/primitives/rovingFocus.ts +212 -0
  321. package/src/primitives/scrollLock.ts +79 -0
  322. package/src/primitives/typeahead.ts +156 -0
  323. package/src/templates/AppShell.ts +56 -0
  324. package/src/templates/AuthLayout.ts +66 -0
  325. package/src/templates/SettingsLayout.ts +63 -0
  326. package/src/templates/index.ts +21 -0
  327. 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
+ });