@aphexcms/ui 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 (152) hide show
  1. package/package.json +49 -0
  2. package/src/app.css +156 -0
  3. package/src/lib/components/app-sidebar.svelte +171 -0
  4. package/src/lib/components/nav-main.svelte +64 -0
  5. package/src/lib/components/nav-projects.svelte +76 -0
  6. package/src/lib/components/nav-user.svelte +87 -0
  7. package/src/lib/components/sidebar-07/+page.svelte +39 -0
  8. package/src/lib/components/team-switcher.svelte +67 -0
  9. package/src/lib/components/ui/alert/alert-description.svelte +23 -0
  10. package/src/lib/components/ui/alert/alert-title.svelte +20 -0
  11. package/src/lib/components/ui/alert/alert.svelte +44 -0
  12. package/src/lib/components/ui/alert/index.ts +14 -0
  13. package/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte +18 -0
  14. package/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte +18 -0
  15. package/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte +27 -0
  16. package/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte +17 -0
  17. package/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte +20 -0
  18. package/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte +20 -0
  19. package/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte +20 -0
  20. package/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte +17 -0
  21. package/src/lib/components/ui/alert-dialog/alert-dialog-trigger.svelte +7 -0
  22. package/src/lib/components/ui/alert-dialog/index.ts +39 -0
  23. package/src/lib/components/ui/avatar/avatar-fallback.svelte +17 -0
  24. package/src/lib/components/ui/avatar/avatar-image.svelte +17 -0
  25. package/src/lib/components/ui/avatar/avatar.svelte +19 -0
  26. package/src/lib/components/ui/avatar/index.ts +13 -0
  27. package/src/lib/components/ui/badge/badge.svelte +49 -0
  28. package/src/lib/components/ui/badge/index.ts +2 -0
  29. package/src/lib/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +23 -0
  30. package/src/lib/components/ui/breadcrumb/breadcrumb-item.svelte +20 -0
  31. package/src/lib/components/ui/breadcrumb/breadcrumb-link.svelte +31 -0
  32. package/src/lib/components/ui/breadcrumb/breadcrumb-list.svelte +23 -0
  33. package/src/lib/components/ui/breadcrumb/breadcrumb-page.svelte +23 -0
  34. package/src/lib/components/ui/breadcrumb/breadcrumb-separator.svelte +27 -0
  35. package/src/lib/components/ui/breadcrumb/breadcrumb.svelte +21 -0
  36. package/src/lib/components/ui/breadcrumb/index.ts +25 -0
  37. package/src/lib/components/ui/button/button.svelte +82 -0
  38. package/src/lib/components/ui/button/index.ts +17 -0
  39. package/src/lib/components/ui/card/card-action.svelte +20 -0
  40. package/src/lib/components/ui/card/card-content.svelte +15 -0
  41. package/src/lib/components/ui/card/card-description.svelte +20 -0
  42. package/src/lib/components/ui/card/card-footer.svelte +20 -0
  43. package/src/lib/components/ui/card/card-header.svelte +23 -0
  44. package/src/lib/components/ui/card/card-title.svelte +20 -0
  45. package/src/lib/components/ui/card/card.svelte +23 -0
  46. package/src/lib/components/ui/card/index.ts +25 -0
  47. package/src/lib/components/ui/collapsible/collapsible-content.svelte +7 -0
  48. package/src/lib/components/ui/collapsible/collapsible-trigger.svelte +7 -0
  49. package/src/lib/components/ui/collapsible/collapsible.svelte +11 -0
  50. package/src/lib/components/ui/collapsible/index.ts +13 -0
  51. package/src/lib/components/ui/command/command-dialog.svelte +40 -0
  52. package/src/lib/components/ui/command/command-empty.svelte +17 -0
  53. package/src/lib/components/ui/command/command-group.svelte +30 -0
  54. package/src/lib/components/ui/command/command-input.svelte +26 -0
  55. package/src/lib/components/ui/command/command-item.svelte +20 -0
  56. package/src/lib/components/ui/command/command-link-item.svelte +20 -0
  57. package/src/lib/components/ui/command/command-list.svelte +17 -0
  58. package/src/lib/components/ui/command/command-separator.svelte +17 -0
  59. package/src/lib/components/ui/command/command-shortcut.svelte +20 -0
  60. package/src/lib/components/ui/command/command.svelte +22 -0
  61. package/src/lib/components/ui/command/index.ts +40 -0
  62. package/src/lib/components/ui/dialog/dialog-close.svelte +7 -0
  63. package/src/lib/components/ui/dialog/dialog-content.svelte +43 -0
  64. package/src/lib/components/ui/dialog/dialog-description.svelte +17 -0
  65. package/src/lib/components/ui/dialog/dialog-footer.svelte +20 -0
  66. package/src/lib/components/ui/dialog/dialog-header.svelte +20 -0
  67. package/src/lib/components/ui/dialog/dialog-overlay.svelte +20 -0
  68. package/src/lib/components/ui/dialog/dialog-title.svelte +17 -0
  69. package/src/lib/components/ui/dialog/dialog-trigger.svelte +7 -0
  70. package/src/lib/components/ui/dialog/index.ts +37 -0
  71. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +41 -0
  72. package/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +27 -0
  73. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  74. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte +7 -0
  75. package/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +27 -0
  76. package/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +24 -0
  77. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  78. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +31 -0
  79. package/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  80. package/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +20 -0
  81. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +20 -0
  82. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  83. package/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  84. package/src/lib/components/ui/dropdown-menu/index.ts +49 -0
  85. package/src/lib/components/ui/input/index.ts +7 -0
  86. package/src/lib/components/ui/input/input.svelte +52 -0
  87. package/src/lib/components/ui/label/index.ts +7 -0
  88. package/src/lib/components/ui/label/label.svelte +20 -0
  89. package/src/lib/components/ui/popover/index.ts +17 -0
  90. package/src/lib/components/ui/popover/popover-content.svelte +29 -0
  91. package/src/lib/components/ui/popover/popover-trigger.svelte +17 -0
  92. package/src/lib/components/ui/select/index.ts +37 -0
  93. package/src/lib/components/ui/select/select-content.svelte +40 -0
  94. package/src/lib/components/ui/select/select-group-heading.svelte +21 -0
  95. package/src/lib/components/ui/select/select-group.svelte +7 -0
  96. package/src/lib/components/ui/select/select-item.svelte +38 -0
  97. package/src/lib/components/ui/select/select-label.svelte +20 -0
  98. package/src/lib/components/ui/select/select-scroll-down-button.svelte +20 -0
  99. package/src/lib/components/ui/select/select-scroll-up-button.svelte +20 -0
  100. package/src/lib/components/ui/select/select-separator.svelte +18 -0
  101. package/src/lib/components/ui/select/select-trigger.svelte +29 -0
  102. package/src/lib/components/ui/separator/index.ts +7 -0
  103. package/src/lib/components/ui/separator/separator.svelte +21 -0
  104. package/src/lib/components/ui/sheet/index.ts +36 -0
  105. package/src/lib/components/ui/sheet/sheet-close.svelte +7 -0
  106. package/src/lib/components/ui/sheet/sheet-content.svelte +60 -0
  107. package/src/lib/components/ui/sheet/sheet-description.svelte +17 -0
  108. package/src/lib/components/ui/sheet/sheet-footer.svelte +20 -0
  109. package/src/lib/components/ui/sheet/sheet-header.svelte +20 -0
  110. package/src/lib/components/ui/sheet/sheet-overlay.svelte +20 -0
  111. package/src/lib/components/ui/sheet/sheet-title.svelte +17 -0
  112. package/src/lib/components/ui/sheet/sheet-trigger.svelte +7 -0
  113. package/src/lib/components/ui/sidebar/constants.ts +6 -0
  114. package/src/lib/components/ui/sidebar/context.svelte.ts +79 -0
  115. package/src/lib/components/ui/sidebar/index.ts +75 -0
  116. package/src/lib/components/ui/sidebar/sidebar-content.svelte +24 -0
  117. package/src/lib/components/ui/sidebar/sidebar-footer.svelte +21 -0
  118. package/src/lib/components/ui/sidebar/sidebar-group-action.svelte +36 -0
  119. package/src/lib/components/ui/sidebar/sidebar-group-content.svelte +21 -0
  120. package/src/lib/components/ui/sidebar/sidebar-group-label.svelte +34 -0
  121. package/src/lib/components/ui/sidebar/sidebar-group.svelte +21 -0
  122. package/src/lib/components/ui/sidebar/sidebar-header.svelte +21 -0
  123. package/src/lib/components/ui/sidebar/sidebar-input.svelte +21 -0
  124. package/src/lib/components/ui/sidebar/sidebar-inset.svelte +24 -0
  125. package/src/lib/components/ui/sidebar/sidebar-menu-action.svelte +43 -0
  126. package/src/lib/components/ui/sidebar/sidebar-menu-badge.svelte +29 -0
  127. package/src/lib/components/ui/sidebar/sidebar-menu-button.svelte +101 -0
  128. package/src/lib/components/ui/sidebar/sidebar-menu-item.svelte +21 -0
  129. package/src/lib/components/ui/sidebar/sidebar-menu-skeleton.svelte +36 -0
  130. package/src/lib/components/ui/sidebar/sidebar-menu-sub-button.svelte +43 -0
  131. package/src/lib/components/ui/sidebar/sidebar-menu-sub-item.svelte +21 -0
  132. package/src/lib/components/ui/sidebar/sidebar-menu-sub.svelte +25 -0
  133. package/src/lib/components/ui/sidebar/sidebar-menu.svelte +21 -0
  134. package/src/lib/components/ui/sidebar/sidebar-provider.svelte +53 -0
  135. package/src/lib/components/ui/sidebar/sidebar-rail.svelte +36 -0
  136. package/src/lib/components/ui/sidebar/sidebar-separator.svelte +19 -0
  137. package/src/lib/components/ui/sidebar/sidebar-trigger.svelte +35 -0
  138. package/src/lib/components/ui/sidebar/sidebar.svelte +101 -0
  139. package/src/lib/components/ui/skeleton/index.ts +7 -0
  140. package/src/lib/components/ui/skeleton/skeleton.svelte +17 -0
  141. package/src/lib/components/ui/tabs/index.ts +16 -0
  142. package/src/lib/components/ui/tabs/tabs-content.svelte +17 -0
  143. package/src/lib/components/ui/tabs/tabs-list.svelte +16 -0
  144. package/src/lib/components/ui/tabs/tabs-trigger.svelte +20 -0
  145. package/src/lib/components/ui/tabs/tabs.svelte +19 -0
  146. package/src/lib/components/ui/textarea/index.ts +7 -0
  147. package/src/lib/components/ui/textarea/textarea.svelte +22 -0
  148. package/src/lib/components/ui/tooltip/index.ts +21 -0
  149. package/src/lib/components/ui/tooltip/tooltip-content.svelte +47 -0
  150. package/src/lib/components/ui/tooltip/tooltip-trigger.svelte +7 -0
  151. package/src/lib/hooks/is-mobile.svelte.ts +9 -0
  152. package/src/lib/utils.ts +13 -0
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@aphexcms/ui",
3
+ "version": "0.1.0",
4
+ "description": "Shared UI components for Aphex CMS (shadcn-svelte)",
5
+ "type": "module",
6
+ "scripts": {
7
+ "build": "svelte-package",
8
+ "shadcn": "pnpm dlx shadcn-svelte@latest add"
9
+ },
10
+ "exports": {
11
+ "./shadcn/*": {
12
+ "types": "./src/lib/components/ui/*/index.ts",
13
+ "svelte": "./src/lib/components/ui/*/index.ts",
14
+ "default": "./src/lib/components/ui/*/index.ts"
15
+ },
16
+ "./shadcn/css": "./src/app.css",
17
+ "./utils": {
18
+ "types": "./src/lib/utils.ts",
19
+ "default": "./src/lib/utils.ts"
20
+ }
21
+ },
22
+ "files": [
23
+ "src"
24
+ ],
25
+ "peerDependencies": {
26
+ "bits-ui": "^2.11.1",
27
+ "clsx": "^2.1.1",
28
+ "svelte": "^5.0.0",
29
+ "tailwind-merge": "^3.3.1",
30
+ "tailwind-variants": "^3.1.1"
31
+ },
32
+ "devDependencies": {
33
+ "@internationalized/date": "^3.8.1",
34
+ "@lucide/svelte": "^0.544.0",
35
+ "@sveltejs/kit": "^2.22.0",
36
+ "@sveltejs/package": "^2.5.4",
37
+ "@sveltejs/vite-plugin-svelte": "^6.0.0",
38
+ "@tailwindcss/vite": "^4.0.0",
39
+ "bits-ui": "^2.11.0",
40
+ "clsx": "^2.1.1",
41
+ "svelte": "^5.0.0",
42
+ "tailwind-merge": "^3.3.1",
43
+ "tailwind-variants": "^3.1.1",
44
+ "tailwindcss": "^4.0.0",
45
+ "tw-animate-css": "^1.4.0",
46
+ "typescript": "^5.0.0",
47
+ "vite": "^7.0.4"
48
+ }
49
+ }
package/src/app.css ADDED
@@ -0,0 +1,156 @@
1
+ @import 'tailwindcss';
2
+
3
+ @import 'tw-animate-css';
4
+
5
+ @custom-variant dark (&:is(.dark *));
6
+
7
+ :root {
8
+ --background: oklch(0.98 0.01 95.10);
9
+ --foreground: oklch(0.34 0.03 95.72);
10
+ --card: oklch(0.98 0.01 95.10);
11
+ --card-foreground: oklch(0.19 0.00 106.59);
12
+ --popover: oklch(1.00 0 0);
13
+ --popover-foreground: oklch(0.27 0.02 98.94);
14
+ --primary: oklch(0.62 0.14 39.04);
15
+ --primary-foreground: oklch(1.00 0 0);
16
+ --secondary: oklch(0.92 0.01 92.99);
17
+ --secondary-foreground: oklch(0.43 0.02 98.60);
18
+ --muted: oklch(0.93 0.02 90.24);
19
+ --muted-foreground: oklch(0.61 0.01 97.42);
20
+ --accent: oklch(0.92 0.01 92.99);
21
+ --accent-foreground: oklch(0.27 0.02 98.94);
22
+ --destructive: oklch(0.19 0.00 106.59);
23
+ --border: oklch(0.88 0.01 97.36);
24
+ --input: oklch(0.76 0.02 98.35);
25
+ --ring: oklch(0.59 0.17 253.06);
26
+ --chart-1: oklch(0.56 0.13 43.00);
27
+ --chart-2: oklch(0.69 0.16 290.41);
28
+ --chart-3: oklch(0.88 0.03 93.13);
29
+ --chart-4: oklch(0.88 0.04 298.18);
30
+ --chart-5: oklch(0.56 0.13 42.06);
31
+ --sidebar: oklch(0.97 0.01 98.88);
32
+ --sidebar-foreground: oklch(0.36 0.01 106.65);
33
+ --sidebar-primary: oklch(0.62 0.14 39.04);
34
+ --sidebar-primary-foreground: oklch(0.99 0 0);
35
+ --sidebar-accent: oklch(0.92 0.01 92.99);
36
+ --sidebar-accent-foreground: oklch(0.33 0 0);
37
+ --sidebar-border: oklch(0.94 0 0);
38
+ --sidebar-ring: oklch(0.77 0 0);
39
+ --destructive-foreground: oklch(1.0000 0 0);
40
+ --radius: 0.5rem;
41
+ --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
42
+ --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
43
+ --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
44
+ --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
45
+ --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10);
46
+ --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10);
47
+ --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10);
48
+ --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25);
49
+ --tracking-normal: 0em;
50
+ }
51
+
52
+ .dark {
53
+ --background: oklch(0.27 0.00 106.64);
54
+ --foreground: oklch(0.81 0.01 93.01);
55
+ --card: oklch(0.27 0.00 106.64);
56
+ --card-foreground: oklch(0.98 0.01 95.10);
57
+ --popover: oklch(0.31 0.00 106.60);
58
+ --popover-foreground: oklch(0.92 0.00 106.48);
59
+ --primary: oklch(0.67 0.13 38.76);
60
+ --primary-foreground: oklch(1.00 0 0);
61
+ --secondary: oklch(0.98 0.01 95.10);
62
+ --secondary-foreground: oklch(0.31 0.00 106.60);
63
+ --muted: oklch(0.22 0.00 106.71);
64
+ --muted-foreground: oklch(0.77 0.02 99.07);
65
+ --accent: oklch(0.21 0.01 95.42);
66
+ --accent-foreground: oklch(0.97 0.01 98.88);
67
+ --destructive: oklch(0.64 0.21 25.33);
68
+ --border: oklch(0.36 0.01 106.89);
69
+ --input: oklch(0.43 0.01 100.22);
70
+ --ring: oklch(0.59 0.17 253.06);
71
+ --chart-1: oklch(0.56 0.13 43.00);
72
+ --chart-2: oklch(0.69 0.16 290.41);
73
+ --chart-3: oklch(0.21 0.01 95.42);
74
+ --chart-4: oklch(0.31 0.05 289.32);
75
+ --chart-5: oklch(0.56 0.13 42.06);
76
+ --sidebar: oklch(0.24 0.00 67.71);
77
+ --sidebar-foreground: oklch(0.81 0.01 93.01);
78
+ --sidebar-primary: oklch(0.33 0 0);
79
+ --sidebar-primary-foreground: oklch(0.99 0 0);
80
+ --sidebar-accent: oklch(0.17 0.00 106.62);
81
+ --sidebar-accent-foreground: oklch(0.81 0.01 93.01);
82
+ --sidebar-border: oklch(0.94 0 0);
83
+ --sidebar-ring: oklch(0.77 0 0);
84
+ --destructive-foreground: oklch(1.0000 0 0);
85
+ --radius: 0.5rem;
86
+ --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
87
+ --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
88
+ --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
89
+ --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
90
+ --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10);
91
+ --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10);
92
+ --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10);
93
+ --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25);
94
+ }
95
+
96
+ @theme inline {
97
+ --color-background: var(--background);
98
+ --color-foreground: var(--foreground);
99
+ --color-card: var(--card);
100
+ --color-card-foreground: var(--card-foreground);
101
+ --color-popover: var(--popover);
102
+ --color-popover-foreground: var(--popover-foreground);
103
+ --color-primary: var(--primary);
104
+ --color-primary-foreground: var(--primary-foreground);
105
+ --color-secondary: var(--secondary);
106
+ --color-secondary-foreground: var(--secondary-foreground);
107
+ --color-muted: var(--muted);
108
+ --color-muted-foreground: var(--muted-foreground);
109
+ --color-accent: var(--accent);
110
+ --color-accent-foreground: var(--accent-foreground);
111
+ --color-destructive: var(--destructive);
112
+ --color-border: var(--border);
113
+ --color-input: var(--input);
114
+ --color-ring: var(--ring);
115
+ --color-chart-1: var(--chart-1);
116
+ --color-chart-2: var(--chart-2);
117
+ --color-chart-3: var(--chart-3);
118
+ --color-chart-4: var(--chart-4);
119
+ --color-chart-5: var(--chart-5);
120
+ --color-sidebar: var(--sidebar);
121
+ --color-sidebar-foreground: var(--sidebar-foreground);
122
+ --color-sidebar-primary: var(--sidebar-primary);
123
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
124
+ --color-sidebar-accent: var(--sidebar-accent);
125
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
126
+ --color-sidebar-border: var(--sidebar-border);
127
+ --color-sidebar-ring: var(--sidebar-ring);
128
+ --color-destructive-foreground: var(--destructive-foreground);
129
+
130
+ --font-sans: var(--font-sans);
131
+ --font-mono: var(--font-mono);
132
+ --font-serif: var(--font-serif);
133
+
134
+ --radius-sm: calc(var(--radius) - 4px);
135
+ --radius-md: calc(var(--radius) - 2px);
136
+ --radius-lg: var(--radius);
137
+ --radius-xl: calc(var(--radius) + 4px);
138
+
139
+ --shadow-2xs: var(--shadow-2xs);
140
+ --shadow-xs: var(--shadow-xs);
141
+ --shadow-sm: var(--shadow-sm);
142
+ --shadow: var(--shadow);
143
+ --shadow-md: var(--shadow-md);
144
+ --shadow-lg: var(--shadow-lg);
145
+ --shadow-xl: var(--shadow-xl);
146
+ --shadow-2xl: var(--shadow-2xl);
147
+ }
148
+
149
+ @layer base {
150
+ * {
151
+ @apply border-border outline-ring/50;
152
+ }
153
+ body {
154
+ @apply bg-background text-foreground;
155
+ }
156
+ }
@@ -0,0 +1,171 @@
1
+ <script lang="ts" module>
2
+ import AudioWaveformIcon from '@lucide/svelte/icons/audio-waveform';
3
+ import BookOpenIcon from '@lucide/svelte/icons/book-open';
4
+ import BotIcon from '@lucide/svelte/icons/bot';
5
+ import ChartPieIcon from '@lucide/svelte/icons/chart-pie';
6
+ import CommandIcon from '@lucide/svelte/icons/command';
7
+ import FrameIcon from '@lucide/svelte/icons/frame';
8
+ import GalleryVerticalEndIcon from '@lucide/svelte/icons/gallery-vertical-end';
9
+ import MapIcon from '@lucide/svelte/icons/map';
10
+ import Settings2Icon from '@lucide/svelte/icons/settings-2';
11
+ import SquareTerminalIcon from '@lucide/svelte/icons/square-terminal';
12
+
13
+ // This is sample data.
14
+ const data = {
15
+ user: {
16
+ name: 'shadcn',
17
+ email: 'm@example.com',
18
+ avatar: '/avatars/shadcn.jpg'
19
+ },
20
+ teams: [
21
+ {
22
+ name: 'Acme Inc',
23
+ logo: GalleryVerticalEndIcon,
24
+ plan: 'Enterprise'
25
+ },
26
+ {
27
+ name: 'Acme Corp.',
28
+ logo: AudioWaveformIcon,
29
+ plan: 'Startup'
30
+ },
31
+ {
32
+ name: 'Evil Corp.',
33
+ logo: CommandIcon,
34
+ plan: 'Free'
35
+ }
36
+ ],
37
+ navMain: [
38
+ {
39
+ title: 'Playground',
40
+ url: '#',
41
+ icon: SquareTerminalIcon,
42
+ isActive: true,
43
+ items: [
44
+ {
45
+ title: 'History',
46
+ url: '#'
47
+ },
48
+ {
49
+ title: 'Starred',
50
+ url: '#'
51
+ },
52
+ {
53
+ title: 'Settings',
54
+ url: '#'
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ title: 'Models',
60
+ url: '#',
61
+ icon: BotIcon,
62
+ items: [
63
+ {
64
+ title: 'Genesis',
65
+ url: '#'
66
+ },
67
+ {
68
+ title: 'Explorer',
69
+ url: '#'
70
+ },
71
+ {
72
+ title: 'Quantum',
73
+ url: '#'
74
+ }
75
+ ]
76
+ },
77
+ {
78
+ title: 'Documentation',
79
+ url: '#',
80
+ icon: BookOpenIcon,
81
+ items: [
82
+ {
83
+ title: 'Introduction',
84
+ url: '#'
85
+ },
86
+ {
87
+ title: 'Get Started',
88
+ url: '#'
89
+ },
90
+ {
91
+ title: 'Tutorials',
92
+ url: '#'
93
+ },
94
+ {
95
+ title: 'Changelog',
96
+ url: '#'
97
+ }
98
+ ]
99
+ },
100
+ {
101
+ title: 'Settings',
102
+ url: '#',
103
+ icon: Settings2Icon,
104
+ items: [
105
+ {
106
+ title: 'General',
107
+ url: '#'
108
+ },
109
+ {
110
+ title: 'Team',
111
+ url: '#'
112
+ },
113
+ {
114
+ title: 'Billing',
115
+ url: '#'
116
+ },
117
+ {
118
+ title: 'Limits',
119
+ url: '#'
120
+ }
121
+ ]
122
+ }
123
+ ],
124
+ projects: [
125
+ {
126
+ name: 'Design Engineering',
127
+ url: '#',
128
+ icon: FrameIcon
129
+ },
130
+ {
131
+ name: 'Sales & Marketing',
132
+ url: '#',
133
+ icon: ChartPieIcon
134
+ },
135
+ {
136
+ name: 'Travel',
137
+ url: '#',
138
+ icon: MapIcon
139
+ }
140
+ ]
141
+ };
142
+ </script>
143
+
144
+ <script lang="ts">
145
+ import NavMain from './nav-main.svelte';
146
+ import NavProjects from './nav-projects.svelte';
147
+ import NavUser from './nav-user.svelte';
148
+ import TeamSwitcher from './team-switcher.svelte';
149
+ import * as Sidebar from '@lib/components/ui/sidebar/index.js';
150
+ import type { ComponentProps } from 'svelte';
151
+
152
+ let {
153
+ ref = $bindable(null),
154
+ collapsible = 'icon',
155
+ ...restProps
156
+ }: ComponentProps<typeof Sidebar.Root> = $props();
157
+ </script>
158
+
159
+ <Sidebar.Root {collapsible} {...restProps}>
160
+ <Sidebar.Header>
161
+ <TeamSwitcher teams={data.teams} />
162
+ </Sidebar.Header>
163
+ <Sidebar.Content>
164
+ <NavMain items={data.navMain} />
165
+ <NavProjects projects={data.projects} />
166
+ </Sidebar.Content>
167
+ <Sidebar.Footer>
168
+ <NavUser user={data.user} />
169
+ </Sidebar.Footer>
170
+ <Sidebar.Rail />
171
+ </Sidebar.Root>
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ import * as Collapsible from '@lib/components/ui/collapsible/index.js';
3
+ import * as Sidebar from '@lib/components/ui/sidebar/index.js';
4
+ import ChevronRightIcon from '@lucide/svelte/icons/chevron-right';
5
+
6
+ let {
7
+ items
8
+ }: {
9
+ items: {
10
+ title: string;
11
+ url: string;
12
+ // this should be `Component` after @lucide/svelte updates types
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ icon?: any;
15
+ isActive?: boolean;
16
+ items?: {
17
+ title: string;
18
+ url: string;
19
+ }[];
20
+ }[];
21
+ } = $props();
22
+ </script>
23
+
24
+ <Sidebar.Group>
25
+ <Sidebar.GroupLabel>Platform</Sidebar.GroupLabel>
26
+ <Sidebar.Menu>
27
+ {#each items as item (item.title)}
28
+ <Collapsible.Root open={item.isActive} class="group/collapsible">
29
+ {#snippet child({ props })}
30
+ <Sidebar.MenuItem {...props}>
31
+ <Collapsible.Trigger>
32
+ {#snippet child({ props })}
33
+ <Sidebar.MenuButton {...props} tooltipContent={item.title}>
34
+ {#if item.icon}
35
+ <item.icon />
36
+ {/if}
37
+ <span>{item.title}</span>
38
+ <ChevronRightIcon
39
+ class="ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90"
40
+ />
41
+ </Sidebar.MenuButton>
42
+ {/snippet}
43
+ </Collapsible.Trigger>
44
+ <Collapsible.Content>
45
+ <Sidebar.MenuSub>
46
+ {#each item.items ?? [] as subItem (subItem.title)}
47
+ <Sidebar.MenuSubItem>
48
+ <Sidebar.MenuSubButton>
49
+ {#snippet child({ props })}
50
+ <a href={subItem.url} {...props}>
51
+ <span>{subItem.title}</span>
52
+ </a>
53
+ {/snippet}
54
+ </Sidebar.MenuSubButton>
55
+ </Sidebar.MenuSubItem>
56
+ {/each}
57
+ </Sidebar.MenuSub>
58
+ </Collapsible.Content>
59
+ </Sidebar.MenuItem>
60
+ {/snippet}
61
+ </Collapsible.Root>
62
+ {/each}
63
+ </Sidebar.Menu>
64
+ </Sidebar.Group>
@@ -0,0 +1,76 @@
1
+ <script lang="ts">
2
+ import * as DropdownMenu from '@lib/components/ui/dropdown-menu/index.js';
3
+ import { useSidebar } from '@lib/components/ui/sidebar/context.svelte.js';
4
+ import * as Sidebar from '@lib/components/ui/sidebar/index.js';
5
+ import EllipsisIcon from '@lucide/svelte/icons/ellipsis';
6
+ import FolderIcon from '@lucide/svelte/icons/folder';
7
+ import ForwardIcon from '@lucide/svelte/icons/forward';
8
+ import Trash2Icon from '@lucide/svelte/icons/trash-2';
9
+
10
+ let {
11
+ projects
12
+ }: {
13
+ projects: {
14
+ name: string;
15
+ url: string;
16
+ // This should be `Component` after @lucide/svelte updates types
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ icon: any;
19
+ }[];
20
+ } = $props();
21
+
22
+ const sidebar = useSidebar();
23
+ </script>
24
+
25
+ <Sidebar.Group class="group-data-[collapsible=icon]:hidden">
26
+ <Sidebar.GroupLabel>Projects</Sidebar.GroupLabel>
27
+ <Sidebar.Menu>
28
+ {#each projects as item (item.name)}
29
+ <Sidebar.MenuItem>
30
+ <Sidebar.MenuButton>
31
+ {#snippet child({ props })}
32
+ <a href={item.url} {...props}>
33
+ <item.icon />
34
+ <span>{item.name}</span>
35
+ </a>
36
+ {/snippet}
37
+ </Sidebar.MenuButton>
38
+ <DropdownMenu.Root>
39
+ <DropdownMenu.Trigger>
40
+ {#snippet child({ props })}
41
+ <Sidebar.MenuAction showOnHover {...props}>
42
+ <EllipsisIcon />
43
+ <span class="sr-only">More</span>
44
+ </Sidebar.MenuAction>
45
+ {/snippet}
46
+ </DropdownMenu.Trigger>
47
+ <DropdownMenu.Content
48
+ class="w-48 rounded-lg"
49
+ side={sidebar.isMobile ? 'bottom' : 'right'}
50
+ align={sidebar.isMobile ? 'end' : 'start'}
51
+ >
52
+ <DropdownMenu.Item>
53
+ <FolderIcon class="text-muted-foreground" />
54
+ <span>View Project</span>
55
+ </DropdownMenu.Item>
56
+ <DropdownMenu.Item>
57
+ <ForwardIcon class="text-muted-foreground" />
58
+ <span>Share Project</span>
59
+ </DropdownMenu.Item>
60
+ <DropdownMenu.Separator />
61
+ <DropdownMenu.Item>
62
+ <Trash2Icon class="text-muted-foreground" />
63
+ <span>Delete Project</span>
64
+ </DropdownMenu.Item>
65
+ </DropdownMenu.Content>
66
+ </DropdownMenu.Root>
67
+ </Sidebar.MenuItem>
68
+ {/each}
69
+ <Sidebar.MenuItem>
70
+ <Sidebar.MenuButton class="text-sidebar-foreground/70">
71
+ <EllipsisIcon class="text-sidebar-foreground/70" />
72
+ <span>More</span>
73
+ </Sidebar.MenuButton>
74
+ </Sidebar.MenuItem>
75
+ </Sidebar.Menu>
76
+ </Sidebar.Group>
@@ -0,0 +1,87 @@
1
+ <script lang="ts">
2
+ import * as Avatar from '@lib/components/ui/avatar/index.js';
3
+ import * as DropdownMenu from '@lib/components/ui/dropdown-menu/index.js';
4
+ import * as Sidebar from '@lib/components/ui/sidebar/index.js';
5
+ import { useSidebar } from '@lib/components/ui/sidebar/index.js';
6
+ import BadgeCheckIcon from '@lucide/svelte/icons/badge-check';
7
+ import BellIcon from '@lucide/svelte/icons/bell';
8
+ import ChevronsUpDownIcon from '@lucide/svelte/icons/chevrons-up-down';
9
+ import CreditCardIcon from '@lucide/svelte/icons/credit-card';
10
+ import LogOutIcon from '@lucide/svelte/icons/log-out';
11
+ import SparklesIcon from '@lucide/svelte/icons/sparkles';
12
+
13
+ let { user }: { user: { name: string; email: string; avatar: string } } = $props();
14
+ const sidebar = useSidebar();
15
+ </script>
16
+
17
+ <Sidebar.Menu>
18
+ <Sidebar.MenuItem>
19
+ <DropdownMenu.Root>
20
+ <DropdownMenu.Trigger>
21
+ {#snippet child({ props })}
22
+ <Sidebar.MenuButton
23
+ size="lg"
24
+ class="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
25
+ {...props}
26
+ >
27
+ <Avatar.Root class="size-8 rounded-lg">
28
+ <Avatar.Image src={user.avatar} alt={user.name} />
29
+ <Avatar.Fallback class="rounded-lg">CN</Avatar.Fallback>
30
+ </Avatar.Root>
31
+ <div class="grid flex-1 text-left text-sm leading-tight">
32
+ <span class="truncate font-medium">{user.name}</span>
33
+ <span class="truncate text-xs">{user.email}</span>
34
+ </div>
35
+ <ChevronsUpDownIcon class="ml-auto size-4" />
36
+ </Sidebar.MenuButton>
37
+ {/snippet}
38
+ </DropdownMenu.Trigger>
39
+ <DropdownMenu.Content
40
+ class="w-(--bits-dropdown-menu-anchor-width) min-w-56 rounded-lg"
41
+ side={sidebar.isMobile ? 'bottom' : 'right'}
42
+ align="end"
43
+ sideOffset={4}
44
+ >
45
+ <DropdownMenu.Label class="p-0 font-normal">
46
+ <div class="flex items-center gap-2 px-1 py-1.5 text-left text-sm">
47
+ <Avatar.Root class="size-8 rounded-lg">
48
+ <Avatar.Image src={user.avatar} alt={user.name} />
49
+ <Avatar.Fallback class="rounded-lg">CN</Avatar.Fallback>
50
+ </Avatar.Root>
51
+ <div class="grid flex-1 text-left text-sm leading-tight">
52
+ <span class="truncate font-medium">{user.name}</span>
53
+ <span class="truncate text-xs">{user.email}</span>
54
+ </div>
55
+ </div>
56
+ </DropdownMenu.Label>
57
+ <DropdownMenu.Separator />
58
+ <DropdownMenu.Group>
59
+ <DropdownMenu.Item>
60
+ <SparklesIcon />
61
+ Upgrade to Pro
62
+ </DropdownMenu.Item>
63
+ </DropdownMenu.Group>
64
+ <DropdownMenu.Separator />
65
+ <DropdownMenu.Group>
66
+ <DropdownMenu.Item>
67
+ <BadgeCheckIcon />
68
+ Account
69
+ </DropdownMenu.Item>
70
+ <DropdownMenu.Item>
71
+ <CreditCardIcon />
72
+ Billing
73
+ </DropdownMenu.Item>
74
+ <DropdownMenu.Item>
75
+ <BellIcon />
76
+ Notifications
77
+ </DropdownMenu.Item>
78
+ </DropdownMenu.Group>
79
+ <DropdownMenu.Separator />
80
+ <DropdownMenu.Item>
81
+ <LogOutIcon />
82
+ Log out
83
+ </DropdownMenu.Item>
84
+ </DropdownMenu.Content>
85
+ </DropdownMenu.Root>
86
+ </Sidebar.MenuItem>
87
+ </Sidebar.Menu>
@@ -0,0 +1,39 @@
1
+ <script lang="ts">
2
+ import AppSidebar from '@lib/components/app-sidebar.svelte';
3
+ import * as Breadcrumb from '@lib/components/ui/breadcrumb/index.js';
4
+ import { Separator } from '@lib/components/ui/separator/index.js';
5
+ import * as Sidebar from '@lib/components/ui/sidebar/index.js';
6
+ </script>
7
+
8
+ <Sidebar.Provider>
9
+ <AppSidebar />
10
+ <Sidebar.Inset>
11
+ <header
12
+ class="group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear"
13
+ >
14
+ <div class="flex items-center gap-2 px-4">
15
+ <Sidebar.Trigger class="-ml-1" />
16
+ <Separator orientation="vertical" class="mr-2 data-[orientation=vertical]:h-4" />
17
+ <Breadcrumb.Root>
18
+ <Breadcrumb.List>
19
+ <Breadcrumb.Item class="hidden md:block">
20
+ <Breadcrumb.Link href="#">Building Your Application</Breadcrumb.Link>
21
+ </Breadcrumb.Item>
22
+ <Breadcrumb.Separator class="hidden md:block" />
23
+ <Breadcrumb.Item>
24
+ <Breadcrumb.Page>Data Fetching</Breadcrumb.Page>
25
+ </Breadcrumb.Item>
26
+ </Breadcrumb.List>
27
+ </Breadcrumb.Root>
28
+ </div>
29
+ </header>
30
+ <div class="flex flex-1 flex-col gap-4 p-4 pt-0">
31
+ <div class="grid auto-rows-min gap-4 md:grid-cols-3">
32
+ <div class="bg-muted/50 aspect-video rounded-xl"></div>
33
+ <div class="bg-muted/50 aspect-video rounded-xl"></div>
34
+ <div class="bg-muted/50 aspect-video rounded-xl"></div>
35
+ </div>
36
+ <div class="bg-muted/50 min-h-[100vh] flex-1 rounded-xl md:min-h-min"></div>
37
+ </div>
38
+ </Sidebar.Inset>
39
+ </Sidebar.Provider>