@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.
Files changed (319) hide show
  1. package/README.md +36 -3
  2. package/dist/auth/index.d.ts +3 -0
  3. package/dist/auth/index.js +3 -0
  4. package/dist/components/data-display/accordion.d.ts +10 -0
  5. package/dist/components/data-display/accordion.js +53 -0
  6. package/{src/components/data-display/index.ts → dist/components/data-display/index.d.ts} +1 -10
  7. package/dist/components/data-display/index.js +8 -0
  8. package/dist/components/data-display/metric-card.d.ts +9 -0
  9. package/dist/components/data-display/metric-card.js +25 -0
  10. package/dist/components/data-display/sort-controls.d.ts +13 -0
  11. package/dist/components/data-display/sort-controls.js +57 -0
  12. package/dist/components/data-display/sort-row.d.ts +10 -0
  13. package/dist/components/data-display/sort-row.js +52 -0
  14. package/dist/components/data-display/table.d.ts +10 -0
  15. package/dist/components/data-display/table.js +57 -0
  16. package/dist/components/feedback/alert.d.ts +9 -0
  17. package/dist/components/feedback/alert.js +38 -0
  18. package/dist/components/feedback/empty-state.d.ts +18 -0
  19. package/dist/components/feedback/empty-state.js +36 -0
  20. package/{src/components/feedback/index.ts → dist/components/feedback/index.d.ts} +2 -0
  21. package/dist/components/feedback/index.js +7 -0
  22. package/dist/components/feedback/progress.d.ts +6 -0
  23. package/dist/components/feedback/progress.js +25 -0
  24. package/dist/components/feedback/skeleton.d.ts +2 -0
  25. package/dist/components/feedback/skeleton.js +11 -0
  26. package/dist/components/feedback/spinner.d.ts +14 -0
  27. package/dist/components/feedback/spinner.js +27 -0
  28. package/dist/components/feedback/update-guard.d.ts +13 -0
  29. package/dist/components/feedback/update-guard.js +38 -0
  30. package/dist/components/filters/active-filters-bar.d.ts +14 -0
  31. package/dist/components/filters/active-filters-bar.js +44 -0
  32. package/dist/components/filters/filter-chip.d.ts +11 -0
  33. package/dist/components/filters/filter-chip.js +33 -0
  34. package/dist/components/filters/filter-select.d.ts +17 -0
  35. package/dist/components/filters/filter-select.js +46 -0
  36. package/dist/components/filters/index.js +4 -0
  37. package/dist/components/forms/checkbox.d.ts +4 -0
  38. package/dist/components/forms/checkbox.js +24 -0
  39. package/dist/components/forms/date-month-select.d.ts +11 -0
  40. package/dist/components/forms/date-month-select.js +47 -0
  41. package/dist/components/forms/date-picker.d.ts +60 -0
  42. package/dist/components/forms/date-picker.js +193 -0
  43. package/dist/components/forms/date-utils.d.ts +14 -0
  44. package/dist/components/forms/date-utils.js +18 -0
  45. package/dist/components/forms/drop-zone.d.ts +42 -0
  46. package/dist/components/forms/drop-zone.js +184 -0
  47. package/{src/components/forms/index.ts → dist/components/forms/index.d.ts} +3 -9
  48. package/dist/components/forms/index.js +17 -0
  49. package/dist/components/forms/input.d.ts +3 -0
  50. package/dist/components/forms/input.js +15 -0
  51. package/dist/components/forms/label.d.ts +3 -0
  52. package/dist/components/forms/label.js +14 -0
  53. package/dist/components/forms/passkey-management.d.ts +14 -0
  54. package/dist/components/forms/passkey-management.js +132 -0
  55. package/dist/components/forms/radio-group.d.ts +6 -0
  56. package/dist/components/forms/radio-group.js +28 -0
  57. package/dist/components/forms/select.d.ts +18 -0
  58. package/dist/components/forms/select.js +103 -0
  59. package/dist/components/forms/slider.d.ts +9 -0
  60. package/dist/components/forms/slider.js +25 -0
  61. package/dist/components/forms/stepper.d.ts +15 -0
  62. package/dist/components/forms/stepper.js +41 -0
  63. package/dist/components/forms/switch.d.ts +6 -0
  64. package/dist/components/forms/switch.js +21 -0
  65. package/dist/components/forms/text-field.d.ts +15 -0
  66. package/dist/components/forms/text-field.js +46 -0
  67. package/dist/components/forms/text-field.types.d.ts +8 -0
  68. package/dist/components/forms/textarea.d.ts +3 -0
  69. package/dist/components/forms/textarea.js +14 -0
  70. package/dist/components/layout/index.js +5 -0
  71. package/dist/components/layout/particle-background.d.ts +19 -0
  72. package/dist/components/layout/particle-background.js +171 -0
  73. package/dist/components/layout/scroll-area.d.ts +9 -0
  74. package/dist/components/layout/scroll-area.js +35 -0
  75. package/dist/components/layout/section-intro.d.ts +12 -0
  76. package/dist/components/layout/section-intro.js +28 -0
  77. package/dist/components/layout/surface-panel.d.ts +7 -0
  78. package/dist/components/layout/surface-panel.js +11 -0
  79. package/dist/components/navigation/app-navigation.d.ts +67 -0
  80. package/dist/components/navigation/app-navigation.js +106 -0
  81. package/{src/components/navigation/index.ts → dist/components/navigation/index.d.ts} +1 -7
  82. package/dist/components/navigation/index.js +4 -0
  83. package/dist/components/navigation/pagination-controls.d.ts +7 -0
  84. package/dist/components/navigation/pagination-controls.js +50 -0
  85. package/dist/components/navigation/tabs.d.ts +7 -0
  86. package/dist/components/navigation/tabs.js +35 -0
  87. package/dist/components/overlays/bottom-sheet.d.ts +20 -0
  88. package/dist/components/overlays/bottom-sheet.js +101 -0
  89. package/dist/components/overlays/command.d.ts +29 -0
  90. package/dist/components/overlays/command.js +123 -0
  91. package/dist/components/overlays/dialog.d.ts +30 -0
  92. package/dist/components/overlays/dialog.js +105 -0
  93. package/dist/components/overlays/dropdown-menu.d.ts +29 -0
  94. package/dist/components/overlays/dropdown-menu.js +128 -0
  95. package/dist/components/overlays/index.d.ts +7 -0
  96. package/dist/components/overlays/index.js +8 -0
  97. package/dist/components/overlays/popover.d.ts +14 -0
  98. package/dist/components/overlays/popover.js +56 -0
  99. package/dist/components/overlays/sheet.d.ts +27 -0
  100. package/dist/components/overlays/sheet.js +81 -0
  101. package/dist/components/overlays/tooltip.d.ts +10 -0
  102. package/dist/components/overlays/tooltip.js +23 -0
  103. package/dist/components/primitives/avatar.d.ts +14 -0
  104. package/dist/components/primitives/avatar.js +72 -0
  105. package/dist/components/primitives/badge.d.ts +7 -0
  106. package/dist/components/primitives/badge.js +27 -0
  107. package/dist/components/primitives/button.d.ts +13 -0
  108. package/dist/components/primitives/button.js +113 -0
  109. package/{src/components/primitives/button.types.ts → dist/components/primitives/button.types.d.ts} +4 -6
  110. package/dist/components/primitives/card.d.ts +9 -0
  111. package/dist/components/primitives/card.js +56 -0
  112. package/{src/components/primitives/index.ts → dist/components/primitives/index.d.ts} +1 -9
  113. package/dist/components/primitives/index.js +7 -0
  114. package/dist/components/primitives/segmented-control.d.ts +20 -0
  115. package/dist/components/primitives/segmented-control.js +27 -0
  116. package/dist/components/primitives/separator.d.ts +4 -0
  117. package/dist/components/primitives/separator.js +16 -0
  118. package/dist/constants/chart-colors.d.ts +33 -0
  119. package/dist/constants/chart-colors.js +31 -0
  120. package/dist/hooks/index.js +9 -0
  121. package/{src/hooks/sort.types.ts → dist/hooks/sort.types.d.ts} +2 -4
  122. package/dist/hooks/use-api-client.d.ts +30 -0
  123. package/dist/hooks/use-api-client.js +106 -0
  124. package/dist/hooks/use-debounced-value.d.ts +1 -0
  125. package/dist/hooks/use-debounced-value.js +12 -0
  126. package/dist/hooks/use-derived-filter-state.d.ts +20 -0
  127. package/dist/hooks/use-derived-filter-state.js +39 -0
  128. package/dist/hooks/use-filter-state.d.ts +12 -0
  129. package/dist/hooks/use-filter-state.js +37 -0
  130. package/dist/hooks/use-media-query.d.ts +6 -0
  131. package/dist/hooks/use-media-query.js +27 -0
  132. package/dist/hooks/use-mobile.d.ts +1 -0
  133. package/dist/hooks/use-mobile.js +14 -0
  134. package/dist/hooks/use-sort.d.ts +11 -0
  135. package/dist/hooks/use-sort.js +14 -0
  136. package/{src/index.ts → dist/index.d.ts} +4 -32
  137. package/dist/index.js +15 -0
  138. package/dist/integrations/service-worker.d.ts +2 -0
  139. package/dist/integrations/service-worker.js +2 -0
  140. package/dist/lib/auth.d.ts +2 -0
  141. package/dist/lib/auth.js +7 -0
  142. package/dist/lib/clipboard.d.ts +1 -0
  143. package/dist/lib/clipboard.js +10 -0
  144. package/dist/lib/index.js +4 -0
  145. package/{src/lib/slot.tsx → dist/lib/slot.d.ts} +2 -15
  146. package/dist/lib/slot.js +14 -0
  147. package/dist/lib/utils.d.ts +2 -0
  148. package/dist/lib/utils.js +8 -0
  149. package/dist/native/components.d.ts +41 -0
  150. package/dist/native/components.js +135 -0
  151. package/dist/native/index.js +3 -0
  152. package/dist/native/theme.d.ts +19 -0
  153. package/dist/native/theme.js +58 -0
  154. package/dist/styles/tokens/css-vars.d.ts +7 -0
  155. package/dist/styles/tokens/css-vars.js +5 -0
  156. package/dist/styles/tokens/generated/dark.colors.generated.d.ts +40 -0
  157. package/dist/styles/tokens/generated/dark.colors.generated.js +39 -0
  158. package/dist/styles/tokens/generated/foundations.generated.d.ts +323 -0
  159. package/dist/styles/tokens/generated/foundations.generated.js +453 -0
  160. package/dist/styles/tokens/generated/light.colors.generated.d.ts +40 -0
  161. package/dist/styles/tokens/generated/light.colors.generated.js +39 -0
  162. package/dist/styles/tokens/index.d.ts +317 -0
  163. package/dist/styles/tokens/index.js +14 -0
  164. package/dist/styles.css +1 -1
  165. package/dist/translations/en.d.ts +34 -0
  166. package/dist/translations/index.d.ts +39 -0
  167. package/dist/translations/ui-provider.d.ts +9 -0
  168. package/dist/translations/ui-provider.js +16 -0
  169. package/dist/types/upload.d.ts +36 -0
  170. package/package.json +50 -33
  171. package/src/components/data-display/accordion.stories.tsx +0 -57
  172. package/src/components/data-display/accordion.tsx +0 -86
  173. package/src/components/data-display/metric-card.stories.tsx +0 -48
  174. package/src/components/data-display/metric-card.tsx +0 -20
  175. package/src/components/data-display/sort-controls.stories.tsx +0 -45
  176. package/src/components/data-display/sort-controls.tsx +0 -96
  177. package/src/components/data-display/sort-row.tsx +0 -88
  178. package/src/components/data-display/table.stories.tsx +0 -75
  179. package/src/components/data-display/table.tsx +0 -80
  180. package/src/components/feedback/alert.stories.tsx +0 -51
  181. package/src/components/feedback/alert.tsx +0 -64
  182. package/src/components/feedback/empty-state.tsx +0 -76
  183. package/src/components/feedback/progress.stories.tsx +0 -54
  184. package/src/components/feedback/progress.tsx +0 -41
  185. package/src/components/feedback/skeleton.stories.tsx +0 -36
  186. package/src/components/feedback/skeleton.tsx +0 -7
  187. package/src/components/feedback/spinner.stories.tsx +0 -52
  188. package/src/components/feedback/spinner.tsx +0 -47
  189. package/src/components/feedback/update-guard.stories.tsx +0 -28
  190. package/src/components/feedback/update-guard.tsx +0 -57
  191. package/src/components/filters/active-filters-bar.stories.tsx +0 -114
  192. package/src/components/filters/active-filters-bar.tsx +0 -61
  193. package/src/components/filters/filter-chip.tsx +0 -57
  194. package/src/components/filters/filter-select.stories.tsx +0 -71
  195. package/src/components/filters/filter-select.tsx +0 -68
  196. package/src/components/forms/checkbox.stories.tsx +0 -35
  197. package/src/components/forms/checkbox.tsx +0 -38
  198. package/src/components/forms/date-month-select.stories.tsx +0 -26
  199. package/src/components/forms/date-month-select.tsx +0 -79
  200. package/src/components/forms/date-picker.stories.tsx +0 -188
  201. package/src/components/forms/date-picker.tsx +0 -303
  202. package/src/components/forms/date-utils.ts +0 -37
  203. package/src/components/forms/drop-zone.stories.tsx +0 -140
  204. package/src/components/forms/drop-zone.tsx +0 -298
  205. package/src/components/forms/input.stories.tsx +0 -47
  206. package/src/components/forms/input.tsx +0 -24
  207. package/src/components/forms/label.stories.tsx +0 -16
  208. package/src/components/forms/label.tsx +0 -25
  209. package/src/components/forms/passkey-management.stories.tsx +0 -85
  210. package/src/components/forms/passkey-management.tsx +0 -168
  211. package/src/components/forms/radio-group.stories.tsx +0 -46
  212. package/src/components/forms/radio-group.tsx +0 -44
  213. package/src/components/forms/select.stories.tsx +0 -207
  214. package/src/components/forms/select.tsx +0 -182
  215. package/src/components/forms/slider.stories.tsx +0 -70
  216. package/src/components/forms/slider.tsx +0 -50
  217. package/src/components/forms/stepper.stories.tsx +0 -111
  218. package/src/components/forms/stepper.tsx +0 -66
  219. package/src/components/forms/switch.stories.tsx +0 -144
  220. package/src/components/forms/switch.tsx +0 -39
  221. package/src/components/forms/text-field.stories.tsx +0 -87
  222. package/src/components/forms/text-field.tsx +0 -75
  223. package/src/components/forms/text-field.types.ts +0 -9
  224. package/src/components/forms/textarea.stories.tsx +0 -150
  225. package/src/components/forms/textarea.tsx +0 -22
  226. package/src/components/layout/particle-background.stories.tsx +0 -38
  227. package/src/components/layout/particle-background.tsx +0 -378
  228. package/src/components/layout/scroll-area.stories.tsx +0 -91
  229. package/src/components/layout/scroll-area.tsx +0 -79
  230. package/src/components/layout/section-intro.stories.tsx +0 -29
  231. package/src/components/layout/section-intro.tsx +0 -31
  232. package/src/components/layout/surface-panel.stories.tsx +0 -32
  233. package/src/components/layout/surface-panel.tsx +0 -23
  234. package/src/components/navigation/app-navigation.stories.tsx +0 -217
  235. package/src/components/navigation/app-navigation.tsx +0 -234
  236. package/src/components/navigation/pagination-controls.stories.tsx +0 -41
  237. package/src/components/navigation/pagination-controls.tsx +0 -46
  238. package/src/components/navigation/tabs.stories.tsx +0 -48
  239. package/src/components/navigation/tabs.tsx +0 -52
  240. package/src/components/overlays/bottom-sheet.stories.tsx +0 -52
  241. package/src/components/overlays/bottom-sheet.tsx +0 -179
  242. package/src/components/overlays/command.stories.tsx +0 -65
  243. package/src/components/overlays/command.tsx +0 -227
  244. package/src/components/overlays/dialog.stories.tsx +0 -148
  245. package/src/components/overlays/dialog.tsx +0 -203
  246. package/src/components/overlays/dropdown-menu.stories.tsx +0 -74
  247. package/src/components/overlays/dropdown-menu.tsx +0 -236
  248. package/src/components/overlays/index.ts +0 -56
  249. package/src/components/overlays/popover.stories.tsx +0 -51
  250. package/src/components/overlays/popover.tsx +0 -78
  251. package/src/components/overlays/sheet.stories.tsx +0 -68
  252. package/src/components/overlays/sheet.tsx +0 -155
  253. package/src/components/overlays/tooltip.stories.tsx +0 -29
  254. package/src/components/overlays/tooltip.tsx +0 -41
  255. package/src/components/primitives/avatar-placeholder.svg +0 -13
  256. package/src/components/primitives/avatar.stories.tsx +0 -72
  257. package/src/components/primitives/avatar.tsx +0 -136
  258. package/src/components/primitives/badge.stories.tsx +0 -43
  259. package/src/components/primitives/badge.tsx +0 -43
  260. package/src/components/primitives/button.stories.tsx +0 -113
  261. package/src/components/primitives/button.tsx +0 -131
  262. package/src/components/primitives/card.stories.tsx +0 -59
  263. package/src/components/primitives/card.tsx +0 -66
  264. package/src/components/primitives/segmented-control.stories.tsx +0 -54
  265. package/src/components/primitives/segmented-control.tsx +0 -73
  266. package/src/components/primitives/separator.stories.tsx +0 -34
  267. package/src/components/primitives/separator.tsx +0 -27
  268. package/src/constants/chart-colors.ts +0 -39
  269. package/src/env.d.ts +0 -9
  270. package/src/hooks/use-api-client.ts +0 -122
  271. package/src/hooks/use-debounced-value.ts +0 -12
  272. package/src/hooks/use-derived-filter-state.ts +0 -70
  273. package/src/hooks/use-filter-state.ts +0 -66
  274. package/src/hooks/use-media-query.ts +0 -69
  275. package/src/hooks/use-mobile.tsx +0 -19
  276. package/src/hooks/use-sort.ts +0 -20
  277. package/src/lib/auth.ts +0 -5
  278. package/src/lib/clipboard.ts +0 -8
  279. package/src/lib/utils.ts +0 -6
  280. package/src/native/components.tsx +0 -198
  281. package/src/native/theme.tsx +0 -69
  282. package/src/storybook/controls.ts +0 -117
  283. package/src/storybook/options.ts +0 -52
  284. package/src/styles/build.ts +0 -1
  285. package/src/styles/index.css +0 -423
  286. package/src/styles/nokia.css +0 -36
  287. package/src/styles/package.css +0 -3
  288. package/src/styles/tokens/chart-colors.stories.tsx +0 -189
  289. package/src/styles/tokens/color-systems.stories.tsx +0 -190
  290. package/src/styles/tokens/css-vars.ts +0 -15
  291. package/src/styles/tokens/generated/dark-class.css +0 -39
  292. package/src/styles/tokens/generated/dark.colors.generated.ts +0 -39
  293. package/src/styles/tokens/generated/dark.css +0 -39
  294. package/src/styles/tokens/generated/foundations.css +0 -149
  295. package/src/styles/tokens/generated/foundations.generated.ts +0 -454
  296. package/src/styles/tokens/generated/light.colors.generated.ts +0 -39
  297. package/src/styles/tokens/generated/light.css +0 -39
  298. package/src/styles/tokens/index.ts +0 -70
  299. package/src/styles/tokens/layout.stories.tsx +0 -50
  300. package/src/styles/tokens/scripts/check-foundations.mjs +0 -126
  301. package/src/styles/tokens/scripts/check-source.mjs +0 -53
  302. package/src/styles/tokens/source/dark.tokens.json +0 -138
  303. package/src/styles/tokens/source/foundations.tokens.json +0 -344
  304. package/src/styles/tokens/source/light.tokens.json +0 -138
  305. package/src/styles/tokens/style-dictionary.dark-class.json +0 -16
  306. package/src/styles/tokens/style-dictionary.dark-storybook.json +0 -16
  307. package/src/styles/tokens/style-dictionary.dark.json +0 -21
  308. package/src/styles/tokens/style-dictionary.foundations.json +0 -21
  309. package/src/styles/tokens/style-dictionary.light-storybook.json +0 -16
  310. package/src/styles/tokens/style-dictionary.light.json +0 -21
  311. package/src/styles/tokens/typography.stories.tsx +0 -157
  312. package/src/translations/en.ts +0 -34
  313. package/src/translations/index.ts +0 -32
  314. package/src/types/upload.ts +0 -42
  315. /package/{src/components/filters/index.ts → dist/components/filters/index.d.ts} +0 -0
  316. /package/{src/components/layout/index.ts → dist/components/layout/index.d.ts} +0 -0
  317. /package/{src/hooks/index.ts → dist/hooks/index.d.ts} +0 -0
  318. /package/{src/lib/index.ts → dist/lib/index.d.ts} +0 -0
  319. /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 };