create-tauri-ui 0.3.2 → 0.3.3

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 (245) hide show
  1. package/index.js +1 -1
  2. package/package.json +6 -6
  3. package/templates/.shared/.github/workflows/release.yml +112 -112
  4. package/templates/.shared/src-tauri/Cargo.lock +3835 -3835
  5. package/templates/.shared/src-tauri/Cargo.toml +4 -4
  6. package/templates/.shared/src-tauri/build.rs +3 -3
  7. package/templates/.shared/src-tauri/src/main.rs +22 -22
  8. package/templates/next/.github/workflows/release.yml +108 -108
  9. package/templates/next/.vscode/extensions.json +3 -3
  10. package/templates/next/README.md +95 -95
  11. package/templates/next/next-env.d.ts +5 -5
  12. package/templates/next/package.json +87 -87
  13. package/templates/next/pnpm-lock.yaml +4911 -4911
  14. package/templates/next/postcss.config.js +6 -6
  15. package/templates/next/prettier.config.js +35 -35
  16. package/templates/next/src/app/examples/layout.tsx +7 -7
  17. package/templates/next/src/app/page.tsx +5 -5
  18. package/templates/next/src/components/examples-nav.tsx +70 -70
  19. package/templates/next/src/components/greeting.tsx +21 -21
  20. package/templates/next/src/components/mode-toggle.tsx +43 -43
  21. package/templates/next/src/components/page-header.tsx +52 -52
  22. package/templates/next/src/components/style-switcher.tsx +19 -19
  23. package/templates/next/src/components/tailwind-indicator.tsx +18 -18
  24. package/templates/next/src/components/theme-provider.tsx +9 -9
  25. package/templates/next/src/components/ui/accordion.tsx +60 -60
  26. package/templates/next/src/components/ui/alert-dialog.tsx +145 -145
  27. package/templates/next/src/components/ui/alert.tsx +59 -59
  28. package/templates/next/src/components/ui/aspect-ratio.tsx +7 -7
  29. package/templates/next/src/components/ui/avatar.tsx +50 -50
  30. package/templates/next/src/components/ui/badge.tsx +36 -36
  31. package/templates/next/src/components/ui/button.tsx +56 -56
  32. package/templates/next/src/components/ui/calendar.tsx +64 -64
  33. package/templates/next/src/components/ui/card.tsx +79 -79
  34. package/templates/next/src/components/ui/checkbox.tsx +30 -30
  35. package/templates/next/src/components/ui/collapsible.tsx +11 -11
  36. package/templates/next/src/components/ui/command.tsx +155 -155
  37. package/templates/next/src/components/ui/context-menu.tsx +200 -200
  38. package/templates/next/src/components/ui/dialog.tsx +123 -123
  39. package/templates/next/src/components/ui/dropdown-menu.tsx +200 -200
  40. package/templates/next/src/components/ui/form.tsx +176 -176
  41. package/templates/next/src/components/ui/hover-card.tsx +29 -29
  42. package/templates/next/src/components/ui/input.tsx +25 -25
  43. package/templates/next/src/components/ui/label.tsx +26 -26
  44. package/templates/next/src/components/ui/menubar.tsx +236 -236
  45. package/templates/next/src/components/ui/navigation-menu.tsx +128 -128
  46. package/templates/next/src/components/ui/popover.tsx +31 -31
  47. package/templates/next/src/components/ui/progress.tsx +28 -28
  48. package/templates/next/src/components/ui/radio-group.tsx +44 -44
  49. package/templates/next/src/components/ui/scroll-area.tsx +48 -48
  50. package/templates/next/src/components/ui/select.tsx +121 -121
  51. package/templates/next/src/components/ui/separator.tsx +31 -31
  52. package/templates/next/src/components/ui/sheet.tsx +144 -144
  53. package/templates/next/src/components/ui/skeleton.tsx +15 -15
  54. package/templates/next/src/components/ui/slider.tsx +28 -28
  55. package/templates/next/src/components/ui/switch.tsx +29 -29
  56. package/templates/next/src/components/ui/table.tsx +114 -114
  57. package/templates/next/src/components/ui/tabs.tsx +55 -55
  58. package/templates/next/src/components/ui/textarea.tsx +24 -24
  59. package/templates/next/src/components/ui/toast.tsx +127 -127
  60. package/templates/next/src/components/ui/toaster.tsx +35 -35
  61. package/templates/next/src/components/ui/toggle.tsx +45 -45
  62. package/templates/next/src/components/ui/tooltip.tsx +30 -30
  63. package/templates/next/src/components/ui/use-toast.ts +192 -192
  64. package/templates/next/src/data/albums.ts +71 -71
  65. package/templates/next/src/data/playlists.ts +16 -16
  66. package/templates/next/src-tauri/Cargo.lock +3835 -3835
  67. package/templates/next/src-tauri/Cargo.toml +39 -39
  68. package/templates/next/src-tauri/build.rs +3 -3
  69. package/templates/sveltekit/.github/workflows/release.yml +108 -108
  70. package/templates/sveltekit/.prettierignore +13 -13
  71. package/templates/sveltekit/.prettierrc +8 -8
  72. package/templates/sveltekit/README.md +1 -1
  73. package/templates/sveltekit/package.json +85 -85
  74. package/templates/sveltekit/pnpm-lock.yaml +4177 -4177
  75. package/templates/sveltekit/postcss.config.cjs +13 -13
  76. package/templates/sveltekit/src/app.d.ts +18 -18
  77. package/templates/sveltekit/src/app.html +16 -16
  78. package/templates/sveltekit/src/index.test.ts +7 -7
  79. package/templates/sveltekit/src/lib/components/docs/TailwindIndicator.svelte +10 -10
  80. package/templates/sveltekit/src/lib/components/docs/charts/Bar.svelte +152 -152
  81. package/templates/sveltekit/src/lib/components/docs/dashboard/DashboardPage.svelte +108 -108
  82. package/templates/sveltekit/src/lib/components/docs/dashboard/MainNav.svelte +31 -31
  83. package/templates/sveltekit/src/lib/components/docs/dashboard/Overview.svelte +5 -5
  84. package/templates/sveltekit/src/lib/components/docs/dashboard/RecentSales.svelte +61 -61
  85. package/templates/sveltekit/src/lib/components/docs/dashboard/Search.svelte +7 -7
  86. package/templates/sveltekit/src/lib/components/docs/dashboard/index.ts +1 -1
  87. package/templates/sveltekit/src/lib/components/docs/examples-nav/ExampleCodeLink.svelte +19 -19
  88. package/templates/sveltekit/src/lib/components/docs/examples-nav/ExamplesNav.svelte +27 -27
  89. package/templates/sveltekit/src/lib/components/docs/examples-nav/index.ts +2 -2
  90. package/templates/sveltekit/src/lib/components/docs/icons/Apple.svelte +12 -12
  91. package/templates/sveltekit/src/lib/components/docs/icons/Aria.svelte +11 -11
  92. package/templates/sveltekit/src/lib/components/docs/icons/GitHub.svelte +12 -12
  93. package/templates/sveltekit/src/lib/components/docs/icons/Google.svelte +12 -12
  94. package/templates/sveltekit/src/lib/components/docs/icons/Logo.svelte +17 -17
  95. package/templates/sveltekit/src/lib/components/docs/icons/Minimize.svelte +12 -12
  96. package/templates/sveltekit/src/lib/components/docs/icons/Npm.svelte +12 -12
  97. package/templates/sveltekit/src/lib/components/docs/icons/PayPal.svelte +12 -12
  98. package/templates/sveltekit/src/lib/components/docs/icons/Pnpm.svelte +12 -12
  99. package/templates/sveltekit/src/lib/components/docs/icons/Radix.svelte +14 -14
  100. package/templates/sveltekit/src/lib/components/docs/icons/RadixSvelte.svelte +14 -14
  101. package/templates/sveltekit/src/lib/components/docs/icons/Tailwind.svelte +12 -12
  102. package/templates/sveltekit/src/lib/components/docs/icons/Yarn.svelte +12 -12
  103. package/templates/sveltekit/src/lib/components/docs/icons/index.ts +78 -78
  104. package/templates/sveltekit/src/lib/components/docs/index.ts +6 -6
  105. package/templates/sveltekit/src/lib/components/docs/light-switch/LightSwitch.svelte +75 -75
  106. package/templates/sveltekit/src/lib/components/docs/light-switch/index.ts +1 -1
  107. package/templates/sveltekit/src/lib/components/docs/light-switch/light-switch.ts +87 -87
  108. package/templates/sveltekit/src/lib/components/docs/light-switch/local-storage-store.ts +81 -81
  109. package/templates/sveltekit/src/lib/components/ui/accordion/Accordion.svelte +11 -11
  110. package/templates/sveltekit/src/lib/components/ui/accordion/AccordionContent.svelte +19 -19
  111. package/templates/sveltekit/src/lib/components/ui/accordion/AccordionItem.svelte +13 -13
  112. package/templates/sveltekit/src/lib/components/ui/accordion/AccordionTrigger.svelte +21 -21
  113. package/templates/sveltekit/src/lib/components/ui/accordion/index.ts +4 -4
  114. package/templates/sveltekit/src/lib/components/ui/alert/Alert.svelte +29 -29
  115. package/templates/sveltekit/src/lib/components/ui/alert/AlertDescription.svelte +10 -10
  116. package/templates/sveltekit/src/lib/components/ui/alert/AlertTitle.svelte +15 -15
  117. package/templates/sveltekit/src/lib/components/ui/alert/index.ts +3 -3
  118. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogAction.svelte +12 -12
  119. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogCancel.svelte +15 -15
  120. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogContent.svelte +22 -22
  121. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogDescription.svelte +14 -14
  122. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogFooter.svelte +13 -13
  123. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogHeader.svelte +10 -10
  124. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogOverlay.svelte +15 -15
  125. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogPortal.svelte +9 -9
  126. package/templates/sveltekit/src/lib/components/ui/alert-dialog/AlertDialogTitle.svelte +11 -11
  127. package/templates/sveltekit/src/lib/components/ui/alert-dialog/index.ts +12 -12
  128. package/templates/sveltekit/src/lib/components/ui/aspect-ratio/AspectRatio.svelte +13 -13
  129. package/templates/sveltekit/src/lib/components/ui/aspect-ratio/index.ts +1 -1
  130. package/templates/sveltekit/src/lib/components/ui/avatar/Avatar.svelte +14 -14
  131. package/templates/sveltekit/src/lib/components/ui/avatar/AvatarFallback.svelte +14 -14
  132. package/templates/sveltekit/src/lib/components/ui/avatar/AvatarImage.svelte +17 -17
  133. package/templates/sveltekit/src/lib/components/ui/avatar/index.ts +3 -3
  134. package/templates/sveltekit/src/lib/components/ui/badge/Badge.svelte +39 -39
  135. package/templates/sveltekit/src/lib/components/ui/badge/index.ts +21 -21
  136. package/templates/sveltekit/src/lib/components/ui/button/Button.svelte +47 -47
  137. package/templates/sveltekit/src/lib/components/ui/button/index.ts +28 -28
  138. package/templates/sveltekit/src/lib/components/ui/card/Card.svelte +18 -18
  139. package/templates/sveltekit/src/lib/components/ui/card/CardContent.svelte +10 -10
  140. package/templates/sveltekit/src/lib/components/ui/card/CardDescription.svelte +10 -10
  141. package/templates/sveltekit/src/lib/components/ui/card/CardFooter.svelte +10 -10
  142. package/templates/sveltekit/src/lib/components/ui/card/CardHeader.svelte +10 -10
  143. package/templates/sveltekit/src/lib/components/ui/card/CardTitle.svelte +16 -16
  144. package/templates/sveltekit/src/lib/components/ui/card/index.ts +6 -6
  145. package/templates/sveltekit/src/lib/components/ui/checkbox/Checkbox.svelte +23 -23
  146. package/templates/sveltekit/src/lib/components/ui/checkbox/index.ts +1 -1
  147. package/templates/sveltekit/src/lib/components/ui/collapsible/index.ts +7 -7
  148. package/templates/sveltekit/src/lib/components/ui/dialog/DialogContent.svelte +29 -29
  149. package/templates/sveltekit/src/lib/components/ui/dialog/DialogDescription.svelte +14 -14
  150. package/templates/sveltekit/src/lib/components/ui/dialog/DialogFooter.svelte +13 -13
  151. package/templates/sveltekit/src/lib/components/ui/dialog/DialogHeader.svelte +10 -10
  152. package/templates/sveltekit/src/lib/components/ui/dialog/DialogOverlay.svelte +15 -15
  153. package/templates/sveltekit/src/lib/components/ui/dialog/DialogPortal.svelte +13 -13
  154. package/templates/sveltekit/src/lib/components/ui/dialog/DialogTitle.svelte +14 -14
  155. package/templates/sveltekit/src/lib/components/ui/dialog/index.ts +12 -12
  156. package/templates/sveltekit/src/lib/components/ui/hover-card/HoverCardContent.svelte +24 -24
  157. package/templates/sveltekit/src/lib/components/ui/hover-card/index.ts +6 -6
  158. package/templates/sveltekit/src/lib/components/ui/input/Input.svelte +30 -30
  159. package/templates/sveltekit/src/lib/components/ui/input/index.ts +1 -1
  160. package/templates/sveltekit/src/lib/components/ui/label/Label.svelte +16 -16
  161. package/templates/sveltekit/src/lib/components/ui/label/index.ts +1 -1
  162. package/templates/sveltekit/src/lib/components/ui/progress/Progress.svelte +22 -22
  163. package/templates/sveltekit/src/lib/components/ui/progress/index.ts +1 -1
  164. package/templates/sveltekit/src/lib/components/ui/radio-group/RadioGroup.svelte +13 -13
  165. package/templates/sveltekit/src/lib/components/ui/radio-group/RadioGroupItem.svelte +23 -23
  166. package/templates/sveltekit/src/lib/components/ui/radio-group/index.ts +2 -2
  167. package/templates/sveltekit/src/lib/components/ui/select/SelectContent.svelte +26 -26
  168. package/templates/sveltekit/src/lib/components/ui/select/SelectItem.svelte +29 -29
  169. package/templates/sveltekit/src/lib/components/ui/select/SelectLabel.svelte +14 -14
  170. package/templates/sveltekit/src/lib/components/ui/select/SelectSeparator.svelte +9 -9
  171. package/templates/sveltekit/src/lib/components/ui/select/SelectTrigger.svelte +21 -21
  172. package/templates/sveltekit/src/lib/components/ui/select/index.ts +10 -10
  173. package/templates/sveltekit/src/lib/components/ui/separator/Separator.svelte +22 -22
  174. package/templates/sveltekit/src/lib/components/ui/separator/index.ts +1 -1
  175. package/templates/sveltekit/src/lib/components/ui/sheet/SheetContent.svelte +27 -27
  176. package/templates/sveltekit/src/lib/components/ui/sheet/SheetDescription.svelte +11 -11
  177. package/templates/sveltekit/src/lib/components/ui/sheet/SheetFooter.svelte +13 -13
  178. package/templates/sveltekit/src/lib/components/ui/sheet/SheetHeader.svelte +10 -10
  179. package/templates/sveltekit/src/lib/components/ui/sheet/SheetOverlay.svelte +15 -15
  180. package/templates/sveltekit/src/lib/components/ui/sheet/SheetPortal.svelte +28 -28
  181. package/templates/sveltekit/src/lib/components/ui/sheet/SheetTitle.svelte +14 -14
  182. package/templates/sveltekit/src/lib/components/ui/sheet/index.ts +102 -102
  183. package/templates/sveltekit/src/lib/components/ui/skeleton/Skeleton.svelte +8 -8
  184. package/templates/sveltekit/src/lib/components/ui/skeleton/index.ts +1 -1
  185. package/templates/sveltekit/src/lib/components/ui/slider/Slider.svelte +22 -22
  186. package/templates/sveltekit/src/lib/components/ui/slider/index.ts +1 -1
  187. package/templates/sveltekit/src/lib/components/ui/switch/Switch.svelte +32 -32
  188. package/templates/sveltekit/src/lib/components/ui/switch/index.ts +1 -1
  189. package/templates/sveltekit/src/lib/components/ui/table/Table.svelte +12 -12
  190. package/templates/sveltekit/src/lib/components/ui/table/TableBody.svelte +10 -10
  191. package/templates/sveltekit/src/lib/components/ui/table/TableCaption.svelte +10 -10
  192. package/templates/sveltekit/src/lib/components/ui/table/TableCell.svelte +10 -10
  193. package/templates/sveltekit/src/lib/components/ui/table/TableFooter.svelte +10 -10
  194. package/templates/sveltekit/src/lib/components/ui/table/TableHead.svelte +16 -16
  195. package/templates/sveltekit/src/lib/components/ui/table/TableHeader.svelte +10 -10
  196. package/templates/sveltekit/src/lib/components/ui/table/TableRow.svelte +16 -16
  197. package/templates/sveltekit/src/lib/components/ui/table/index.ts +8 -8
  198. package/templates/sveltekit/src/lib/components/ui/tabs/TabsContent.svelte +20 -20
  199. package/templates/sveltekit/src/lib/components/ui/tabs/TabsList.svelte +17 -17
  200. package/templates/sveltekit/src/lib/components/ui/tabs/TabsTrigger.svelte +20 -20
  201. package/templates/sveltekit/src/lib/components/ui/tabs/index.ts +7 -7
  202. package/templates/sveltekit/src/lib/components/ui/textarea/Textarea.svelte +30 -30
  203. package/templates/sveltekit/src/lib/components/ui/textarea/index.ts +1 -1
  204. package/templates/sveltekit/src/lib/components/ui/toggle/Toggle.svelte +44 -44
  205. package/templates/sveltekit/src/lib/components/ui/toggle/index.ts +1 -1
  206. package/templates/sveltekit/src/lib/components/ui/tooltip/TooltipContent.svelte +22 -22
  207. package/templates/sveltekit/src/lib/components/ui/tooltip/index.ts +6 -6
  208. package/templates/sveltekit/src/lib/config/components.ts +306 -306
  209. package/templates/sveltekit/src/lib/config/docs.ts +356 -356
  210. package/templates/sveltekit/src/lib/config/site.ts +15 -15
  211. package/templates/sveltekit/src/lib/types/docs.ts +50 -50
  212. package/templates/sveltekit/src/lib/types/nav.ts +18 -18
  213. package/templates/sveltekit/src/lib/utils.ts +75 -75
  214. package/templates/sveltekit/src/routes/+layout.svelte +48 -48
  215. package/templates/sveltekit/src/routes/+page.ts +6 -6
  216. package/templates/sveltekit/src/routes/authentication/+page.svelte +57 -57
  217. package/templates/sveltekit/src/routes/authentication/+page.ts +7 -7
  218. package/templates/sveltekit/src/routes/authentication/UserAuthForm.svelte +61 -61
  219. package/templates/sveltekit/src/routes/cards/+page.svelte +26 -26
  220. package/templates/sveltekit/src/routes/cards/+page.ts +7 -7
  221. package/templates/sveltekit/src/routes/cards/CookieSettings.svelte +52 -52
  222. package/templates/sveltekit/src/routes/cards/CreateAccount.svelte +52 -52
  223. package/templates/sveltekit/src/routes/cards/DemoContainer.svelte +10 -10
  224. package/templates/sveltekit/src/routes/cards/Notifications.svelte +38 -38
  225. package/templates/sveltekit/src/routes/cards/PaymentMethod.svelte +110 -110
  226. package/templates/sveltekit/src/routes/cards/ReportAnIssue.svelte +71 -71
  227. package/templates/sveltekit/src/routes/cards/ShareDocument.svelte +91 -91
  228. package/templates/sveltekit/src/routes/dashboard/+page.svelte +5 -5
  229. package/templates/sveltekit/src/routes/dashboard/+page.ts +7 -7
  230. package/templates/sveltekit/src/routes/music/albums.ts +61 -61
  231. package/templates/sveltekit/src/routes/music/playlists.ts +16 -16
  232. package/templates/sveltekit/src/styles/globals.css +125 -125
  233. package/templates/sveltekit/src/styles/mdsvex.css +80 -80
  234. package/templates/sveltekit/src-tauri/Cargo.lock +3835 -3835
  235. package/templates/sveltekit/src-tauri/Cargo.toml +39 -39
  236. package/templates/sveltekit/src-tauri/build.rs +3 -3
  237. package/templates/sveltekit/src-tauri/tauri.conf.json +71 -71
  238. package/templates/sveltekit/svelte.config.js +22 -22
  239. package/templates/sveltekit/tailwind.config.js +67 -67
  240. package/templates/sveltekit/tsconfig.json +13 -13
  241. package/templates/vite/package.json +83 -83
  242. package/templates/vite/pnpm-lock.yaml +5176 -5176
  243. package/templates/vite/src-tauri/Cargo.lock +3835 -3835
  244. package/templates/vite/src-tauri/Cargo.toml +39 -39
  245. package/templates/vite/src-tauri/build.rs +3 -3
@@ -1,192 +1,192 @@
1
- // Inspired by react-hot-toast library
2
- import * as React from "react"
3
-
4
- import type {
5
- ToastActionElement,
6
- ToastProps,
7
- } from "@/components/ui/toast"
8
-
9
- const TOAST_LIMIT = 1
10
- const TOAST_REMOVE_DELAY = 1000000
11
-
12
- type ToasterToast = ToastProps & {
13
- id: string
14
- title?: React.ReactNode
15
- description?: React.ReactNode
16
- action?: ToastActionElement
17
- }
18
-
19
- const actionTypes = {
20
- ADD_TOAST: "ADD_TOAST",
21
- UPDATE_TOAST: "UPDATE_TOAST",
22
- DISMISS_TOAST: "DISMISS_TOAST",
23
- REMOVE_TOAST: "REMOVE_TOAST",
24
- } as const
25
-
26
- let count = 0
27
-
28
- function genId() {
29
- count = (count + 1) % Number.MAX_VALUE
30
- return count.toString()
31
- }
32
-
33
- type ActionType = typeof actionTypes
34
-
35
- type Action =
36
- | {
37
- type: ActionType["ADD_TOAST"]
38
- toast: ToasterToast
39
- }
40
- | {
41
- type: ActionType["UPDATE_TOAST"]
42
- toast: Partial<ToasterToast>
43
- }
44
- | {
45
- type: ActionType["DISMISS_TOAST"]
46
- toastId?: ToasterToast["id"]
47
- }
48
- | {
49
- type: ActionType["REMOVE_TOAST"]
50
- toastId?: ToasterToast["id"]
51
- }
52
-
53
- interface State {
54
- toasts: ToasterToast[]
55
- }
56
-
57
- const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()
58
-
59
- const addToRemoveQueue = (toastId: string) => {
60
- if (toastTimeouts.has(toastId)) {
61
- return
62
- }
63
-
64
- const timeout = setTimeout(() => {
65
- toastTimeouts.delete(toastId)
66
- dispatch({
67
- type: "REMOVE_TOAST",
68
- toastId: toastId,
69
- })
70
- }, TOAST_REMOVE_DELAY)
71
-
72
- toastTimeouts.set(toastId, timeout)
73
- }
74
-
75
- export const reducer = (state: State, action: Action): State => {
76
- switch (action.type) {
77
- case "ADD_TOAST":
78
- return {
79
- ...state,
80
- toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
81
- }
82
-
83
- case "UPDATE_TOAST":
84
- return {
85
- ...state,
86
- toasts: state.toasts.map((t) =>
87
- t.id === action.toast.id ? { ...t, ...action.toast } : t
88
- ),
89
- }
90
-
91
- case "DISMISS_TOAST": {
92
- const { toastId } = action
93
-
94
- // ! Side effects ! - This could be extracted into a dismissToast() action,
95
- // but I'll keep it here for simplicity
96
- if (toastId) {
97
- addToRemoveQueue(toastId)
98
- } else {
99
- state.toasts.forEach((toast) => {
100
- addToRemoveQueue(toast.id)
101
- })
102
- }
103
-
104
- return {
105
- ...state,
106
- toasts: state.toasts.map((t) =>
107
- t.id === toastId || toastId === undefined
108
- ? {
109
- ...t,
110
- open: false,
111
- }
112
- : t
113
- ),
114
- }
115
- }
116
- case "REMOVE_TOAST":
117
- if (action.toastId === undefined) {
118
- return {
119
- ...state,
120
- toasts: [],
121
- }
122
- }
123
- return {
124
- ...state,
125
- toasts: state.toasts.filter((t) => t.id !== action.toastId),
126
- }
127
- }
128
- }
129
-
130
- const listeners: Array<(state: State) => void> = []
131
-
132
- let memoryState: State = { toasts: [] }
133
-
134
- function dispatch(action: Action) {
135
- memoryState = reducer(memoryState, action)
136
- listeners.forEach((listener) => {
137
- listener(memoryState)
138
- })
139
- }
140
-
141
- type Toast = Omit<ToasterToast, "id">
142
-
143
- function toast({ ...props }: Toast) {
144
- const id = genId()
145
-
146
- const update = (props: ToasterToast) =>
147
- dispatch({
148
- type: "UPDATE_TOAST",
149
- toast: { ...props, id },
150
- })
151
- const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id })
152
-
153
- dispatch({
154
- type: "ADD_TOAST",
155
- toast: {
156
- ...props,
157
- id,
158
- open: true,
159
- onOpenChange: (open) => {
160
- if (!open) dismiss()
161
- },
162
- },
163
- })
164
-
165
- return {
166
- id: id,
167
- dismiss,
168
- update,
169
- }
170
- }
171
-
172
- function useToast() {
173
- const [state, setState] = React.useState<State>(memoryState)
174
-
175
- React.useEffect(() => {
176
- listeners.push(setState)
177
- return () => {
178
- const index = listeners.indexOf(setState)
179
- if (index > -1) {
180
- listeners.splice(index, 1)
181
- }
182
- }
183
- }, [state])
184
-
185
- return {
186
- ...state,
187
- toast,
188
- dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
189
- }
190
- }
191
-
192
- export { useToast, toast }
1
+ // Inspired by react-hot-toast library
2
+ import * as React from "react"
3
+
4
+ import type {
5
+ ToastActionElement,
6
+ ToastProps,
7
+ } from "@/components/ui/toast"
8
+
9
+ const TOAST_LIMIT = 1
10
+ const TOAST_REMOVE_DELAY = 1000000
11
+
12
+ type ToasterToast = ToastProps & {
13
+ id: string
14
+ title?: React.ReactNode
15
+ description?: React.ReactNode
16
+ action?: ToastActionElement
17
+ }
18
+
19
+ const actionTypes = {
20
+ ADD_TOAST: "ADD_TOAST",
21
+ UPDATE_TOAST: "UPDATE_TOAST",
22
+ DISMISS_TOAST: "DISMISS_TOAST",
23
+ REMOVE_TOAST: "REMOVE_TOAST",
24
+ } as const
25
+
26
+ let count = 0
27
+
28
+ function genId() {
29
+ count = (count + 1) % Number.MAX_VALUE
30
+ return count.toString()
31
+ }
32
+
33
+ type ActionType = typeof actionTypes
34
+
35
+ type Action =
36
+ | {
37
+ type: ActionType["ADD_TOAST"]
38
+ toast: ToasterToast
39
+ }
40
+ | {
41
+ type: ActionType["UPDATE_TOAST"]
42
+ toast: Partial<ToasterToast>
43
+ }
44
+ | {
45
+ type: ActionType["DISMISS_TOAST"]
46
+ toastId?: ToasterToast["id"]
47
+ }
48
+ | {
49
+ type: ActionType["REMOVE_TOAST"]
50
+ toastId?: ToasterToast["id"]
51
+ }
52
+
53
+ interface State {
54
+ toasts: ToasterToast[]
55
+ }
56
+
57
+ const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()
58
+
59
+ const addToRemoveQueue = (toastId: string) => {
60
+ if (toastTimeouts.has(toastId)) {
61
+ return
62
+ }
63
+
64
+ const timeout = setTimeout(() => {
65
+ toastTimeouts.delete(toastId)
66
+ dispatch({
67
+ type: "REMOVE_TOAST",
68
+ toastId: toastId,
69
+ })
70
+ }, TOAST_REMOVE_DELAY)
71
+
72
+ toastTimeouts.set(toastId, timeout)
73
+ }
74
+
75
+ export const reducer = (state: State, action: Action): State => {
76
+ switch (action.type) {
77
+ case "ADD_TOAST":
78
+ return {
79
+ ...state,
80
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
81
+ }
82
+
83
+ case "UPDATE_TOAST":
84
+ return {
85
+ ...state,
86
+ toasts: state.toasts.map((t) =>
87
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
88
+ ),
89
+ }
90
+
91
+ case "DISMISS_TOAST": {
92
+ const { toastId } = action
93
+
94
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
95
+ // but I'll keep it here for simplicity
96
+ if (toastId) {
97
+ addToRemoveQueue(toastId)
98
+ } else {
99
+ state.toasts.forEach((toast) => {
100
+ addToRemoveQueue(toast.id)
101
+ })
102
+ }
103
+
104
+ return {
105
+ ...state,
106
+ toasts: state.toasts.map((t) =>
107
+ t.id === toastId || toastId === undefined
108
+ ? {
109
+ ...t,
110
+ open: false,
111
+ }
112
+ : t
113
+ ),
114
+ }
115
+ }
116
+ case "REMOVE_TOAST":
117
+ if (action.toastId === undefined) {
118
+ return {
119
+ ...state,
120
+ toasts: [],
121
+ }
122
+ }
123
+ return {
124
+ ...state,
125
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
126
+ }
127
+ }
128
+ }
129
+
130
+ const listeners: Array<(state: State) => void> = []
131
+
132
+ let memoryState: State = { toasts: [] }
133
+
134
+ function dispatch(action: Action) {
135
+ memoryState = reducer(memoryState, action)
136
+ listeners.forEach((listener) => {
137
+ listener(memoryState)
138
+ })
139
+ }
140
+
141
+ type Toast = Omit<ToasterToast, "id">
142
+
143
+ function toast({ ...props }: Toast) {
144
+ const id = genId()
145
+
146
+ const update = (props: ToasterToast) =>
147
+ dispatch({
148
+ type: "UPDATE_TOAST",
149
+ toast: { ...props, id },
150
+ })
151
+ const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id })
152
+
153
+ dispatch({
154
+ type: "ADD_TOAST",
155
+ toast: {
156
+ ...props,
157
+ id,
158
+ open: true,
159
+ onOpenChange: (open) => {
160
+ if (!open) dismiss()
161
+ },
162
+ },
163
+ })
164
+
165
+ return {
166
+ id: id,
167
+ dismiss,
168
+ update,
169
+ }
170
+ }
171
+
172
+ function useToast() {
173
+ const [state, setState] = React.useState<State>(memoryState)
174
+
175
+ React.useEffect(() => {
176
+ listeners.push(setState)
177
+ return () => {
178
+ const index = listeners.indexOf(setState)
179
+ if (index > -1) {
180
+ listeners.splice(index, 1)
181
+ }
182
+ }
183
+ }, [state])
184
+
185
+ return {
186
+ ...state,
187
+ toast,
188
+ dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
189
+ }
190
+ }
191
+
192
+ export { useToast, toast }
@@ -1,71 +1,71 @@
1
- export interface Album {
2
- name: string
3
- artist: string
4
- cover: string
5
- }
6
-
7
- export const listenNowAlbums: Album[] = [
8
- {
9
- name: "React Rendezvous",
10
- artist: "Ethan Byte",
11
- cover:
12
- "https://images.unsplash.com/photo-1611348586804-61bf6c080437?w=300&dpr=2&q=80",
13
- },
14
- {
15
- name: "Async Awakenings",
16
- artist: "Nina Netcode",
17
- cover:
18
- "https://images.unsplash.com/photo-1468817814611-b7edf94b5d60?w=300&dpr=2&q=80",
19
- },
20
- {
21
- name: "The Art of Reusability",
22
- artist: "Lena Logic",
23
- cover:
24
- "https://images.unsplash.com/photo-1528143358888-6d3c7f67bd5d?w=300&dpr=2&q=80",
25
- },
26
- {
27
- name: "Stateful Symphony",
28
- artist: "Beth Binary",
29
- cover:
30
- "https://images.unsplash.com/photo-1490300472339-79e4adc6be4a?w=300&dpr=2&q=80",
31
- },
32
- ]
33
-
34
- export const madeForYouAlbums: Album[] = [
35
- {
36
- name: "Thinking Components",
37
- artist: "Lena Logic",
38
- cover:
39
- "https://images.unsplash.com/photo-1615247001958-f4bc92fa6a4a?w=300&dpr=2&q=80",
40
- },
41
- {
42
- name: "Functional Fury",
43
- artist: "Beth Binary",
44
- cover:
45
- "https://images.unsplash.com/photo-1513745405825-efaf9a49315f?w=300&dpr=2&q=80",
46
- },
47
- {
48
- name: "React Rendezvous",
49
- artist: "Ethan Byte",
50
- cover:
51
- "https://images.unsplash.com/photo-1614113489855-66422ad300a4?w=300&dpr=2&q=80",
52
- },
53
- {
54
- name: "Stateful Symphony",
55
- artist: "Beth Binary",
56
- cover:
57
- "https://images.unsplash.com/photo-1446185250204-f94591f7d702?w=300&dpr=2&q=80",
58
- },
59
- {
60
- name: "Async Awakenings",
61
- artist: "Nina Netcode",
62
- cover:
63
- "https://images.unsplash.com/photo-1468817814611-b7edf94b5d60?w=300&dpr=2&q=80",
64
- },
65
- {
66
- name: "The Art of Reusability",
67
- artist: "Lena Logic",
68
- cover:
69
- "https://images.unsplash.com/photo-1490300472339-79e4adc6be4a?w=300&dpr=2&q=80",
70
- },
71
- ]
1
+ export interface Album {
2
+ name: string
3
+ artist: string
4
+ cover: string
5
+ }
6
+
7
+ export const listenNowAlbums: Album[] = [
8
+ {
9
+ name: "React Rendezvous",
10
+ artist: "Ethan Byte",
11
+ cover:
12
+ "https://images.unsplash.com/photo-1611348586804-61bf6c080437?w=300&dpr=2&q=80",
13
+ },
14
+ {
15
+ name: "Async Awakenings",
16
+ artist: "Nina Netcode",
17
+ cover:
18
+ "https://images.unsplash.com/photo-1468817814611-b7edf94b5d60?w=300&dpr=2&q=80",
19
+ },
20
+ {
21
+ name: "The Art of Reusability",
22
+ artist: "Lena Logic",
23
+ cover:
24
+ "https://images.unsplash.com/photo-1528143358888-6d3c7f67bd5d?w=300&dpr=2&q=80",
25
+ },
26
+ {
27
+ name: "Stateful Symphony",
28
+ artist: "Beth Binary",
29
+ cover:
30
+ "https://images.unsplash.com/photo-1490300472339-79e4adc6be4a?w=300&dpr=2&q=80",
31
+ },
32
+ ]
33
+
34
+ export const madeForYouAlbums: Album[] = [
35
+ {
36
+ name: "Thinking Components",
37
+ artist: "Lena Logic",
38
+ cover:
39
+ "https://images.unsplash.com/photo-1615247001958-f4bc92fa6a4a?w=300&dpr=2&q=80",
40
+ },
41
+ {
42
+ name: "Functional Fury",
43
+ artist: "Beth Binary",
44
+ cover:
45
+ "https://images.unsplash.com/photo-1513745405825-efaf9a49315f?w=300&dpr=2&q=80",
46
+ },
47
+ {
48
+ name: "React Rendezvous",
49
+ artist: "Ethan Byte",
50
+ cover:
51
+ "https://images.unsplash.com/photo-1614113489855-66422ad300a4?w=300&dpr=2&q=80",
52
+ },
53
+ {
54
+ name: "Stateful Symphony",
55
+ artist: "Beth Binary",
56
+ cover:
57
+ "https://images.unsplash.com/photo-1446185250204-f94591f7d702?w=300&dpr=2&q=80",
58
+ },
59
+ {
60
+ name: "Async Awakenings",
61
+ artist: "Nina Netcode",
62
+ cover:
63
+ "https://images.unsplash.com/photo-1468817814611-b7edf94b5d60?w=300&dpr=2&q=80",
64
+ },
65
+ {
66
+ name: "The Art of Reusability",
67
+ artist: "Lena Logic",
68
+ cover:
69
+ "https://images.unsplash.com/photo-1490300472339-79e4adc6be4a?w=300&dpr=2&q=80",
70
+ },
71
+ ]
@@ -1,16 +1,16 @@
1
- export type Playlist = (typeof playlists)[number]
2
-
3
- export const playlists = [
4
- "Recently Added",
5
- "Recently Played",
6
- "Top Songs",
7
- "Top Albums",
8
- "Top Artists",
9
- "Logic Discography",
10
- "Bedtime Beats",
11
- "Feeling Happy",
12
- "I miss Y2K Pop",
13
- "Runtober",
14
- "Mellow Days",
15
- "Eminem Essentials",
16
- ]
1
+ export type Playlist = (typeof playlists)[number]
2
+
3
+ export const playlists = [
4
+ "Recently Added",
5
+ "Recently Played",
6
+ "Top Songs",
7
+ "Top Albums",
8
+ "Top Artists",
9
+ "Logic Discography",
10
+ "Bedtime Beats",
11
+ "Feeling Happy",
12
+ "I miss Y2K Pop",
13
+ "Runtober",
14
+ "Mellow Days",
15
+ "Eminem Essentials",
16
+ ]