@hanzo/ui 4.6.0 → 4.7.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 (290) hide show
  1. package/dist/index.d.mts +16 -0
  2. package/dist/index.d.ts +16 -0
  3. package/dist/index.js +9458 -0
  4. package/dist/index.mjs +9449 -0
  5. package/dist/lib/utils.d.mts +2 -0
  6. package/dist/lib/utils.d.ts +2 -0
  7. package/dist/lib/utils.js +47 -0
  8. package/dist/lib/utils.mjs +28 -0
  9. package/dist/src/utils.d.mts +7 -0
  10. package/dist/src/utils.d.ts +7 -0
  11. package/dist/src/utils.js +47 -0
  12. package/dist/src/utils.mjs +28 -0
  13. package/dist/tailwind/index.d.mts +2 -0
  14. package/dist/tailwind/index.d.ts +2 -0
  15. package/dist/tailwind/index.js +2048 -0
  16. package/dist/tailwind/index.mjs +2017 -0
  17. package/dist/types/index.d.mts +12 -0
  18. package/dist/types/index.d.ts +12 -0
  19. package/dist/types/index.js +79 -0
  20. package/dist/types/index.mjs +56 -0
  21. package/package.json +151 -25
  22. package/MCP-INSTRUCTIONS.md +0 -73
  23. package/README-MCP.md +0 -175
  24. package/assets/ai-icons.tsx +0 -207
  25. package/assets/crypto.tsx +0 -33
  26. package/assets/file-type-icon.tsx +0 -66
  27. package/assets/file.tsx +0 -45
  28. package/assets/general.tsx +0 -2318
  29. package/assets/hanzo-logo.svg +0 -9
  30. package/assets/hanzo-logo.tsx +0 -15
  31. package/assets/index.ts +0 -8
  32. package/assets/index.tsx +0 -4
  33. package/assets/llm-provider.tsx +0 -1094
  34. package/blocks/components/accordian-block.tsx +0 -48
  35. package/blocks/components/block-component-props.ts +0 -11
  36. package/blocks/components/bullet-cards-block.tsx +0 -46
  37. package/blocks/components/card-block/index.tsx +0 -171
  38. package/blocks/components/card-block/link-out-button.tsx +0 -20
  39. package/blocks/components/card-block/util.ts +0 -28
  40. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  41. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  42. package/blocks/components/content.tsx +0 -70
  43. package/blocks/components/cta-block.tsx +0 -115
  44. package/blocks/components/enh-heading-block.tsx +0 -204
  45. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  46. package/blocks/components/grid-block/index.tsx +0 -83
  47. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  48. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  49. package/blocks/components/group-block.tsx +0 -83
  50. package/blocks/components/heading-block.tsx +0 -88
  51. package/blocks/components/image-block.tsx +0 -111
  52. package/blocks/components/index.ts +0 -30
  53. package/blocks/components/screenful-block/content.tsx +0 -123
  54. package/blocks/components/screenful-block/index.tsx +0 -107
  55. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  56. package/blocks/components/screenful-block/video-background.tsx +0 -45
  57. package/blocks/components/space-block.tsx +0 -66
  58. package/blocks/components/video-block.tsx +0 -138
  59. package/blocks/def/accordian-block.ts +0 -14
  60. package/blocks/def/block.ts +0 -7
  61. package/blocks/def/bullet-cards-block.ts +0 -22
  62. package/blocks/def/card-block.ts +0 -22
  63. package/blocks/def/carte-blanche-block.ts +0 -21
  64. package/blocks/def/cta-block.ts +0 -19
  65. package/blocks/def/element-block.ts +0 -11
  66. package/blocks/def/enh-heading-block.ts +0 -44
  67. package/blocks/def/grid-block.ts +0 -16
  68. package/blocks/def/group-block.ts +0 -11
  69. package/blocks/def/heading-block.ts +0 -15
  70. package/blocks/def/image-block.ts +0 -31
  71. package/blocks/def/index.ts +0 -35
  72. package/blocks/def/screenful-block.ts +0 -54
  73. package/blocks/def/space-block.ts +0 -64
  74. package/blocks/def/video-block.ts +0 -9
  75. package/blocks/index.ts +0 -2
  76. package/components/index.ts +0 -56
  77. package/dist/button.d.ts +0 -1
  78. package/dist/button.js +0 -1
  79. package/dist/hooks/index.d.ts +0 -7
  80. package/dist/hooks/index.js +0 -7
  81. package/dist/hooks/use-click-away.d.ts +0 -2
  82. package/dist/hooks/use-click-away.js +0 -23
  83. package/dist/hooks/use-combined-refs.d.ts +0 -3
  84. package/dist/hooks/use-combined-refs.js +0 -18
  85. package/dist/hooks/use-copy-clipboard.d.ts +0 -9
  86. package/dist/hooks/use-copy-clipboard.js +0 -21
  87. package/dist/hooks/use-debounce.d.ts +0 -1
  88. package/dist/hooks/use-debounce.js +0 -13
  89. package/dist/hooks/use-fill-ids.d.ts +0 -8
  90. package/dist/hooks/use-fill-ids.js +0 -20
  91. package/dist/hooks/use-map.d.ts +0 -1
  92. package/dist/hooks/use-map.js +0 -20
  93. package/dist/hooks/use-measure.d.ts +0 -8
  94. package/dist/hooks/use-measure.js +0 -25
  95. package/dist/hooks/use-reverse-video-playback.d.ts +0 -1
  96. package/dist/hooks/use-reverse-video-playback.js +0 -41
  97. package/dist/hooks/use-scroll-restoration.d.ts +0 -8
  98. package/dist/hooks/use-scroll-restoration.js +0 -36
  99. package/dist/mcp/enhanced-server.d.ts +0 -29
  100. package/dist/mcp/enhanced-server.js +0 -1128
  101. package/dist/mcp/index.d.ts +0 -28
  102. package/dist/mcp/index.js +0 -436
  103. package/dist/registry/api.d.ts +0 -37
  104. package/dist/registry/api.js +0 -129
  105. package/dist/registry/index.d.ts +0 -353
  106. package/dist/registry/index.js +0 -45
  107. package/dist/utils.d.ts +0 -1
  108. package/dist/utils.js +0 -1
  109. package/environment.d.ts +0 -6
  110. package/helpers/file.ts +0 -33
  111. package/helpers/memoization.ts +0 -40
  112. package/primitives/accordion.tsx +0 -74
  113. package/primitives/action-button.tsx +0 -42
  114. package/primitives/alert-dialog.tsx +0 -185
  115. package/primitives/alert.tsx +0 -74
  116. package/primitives/apply-typography.tsx +0 -55
  117. package/primitives/aspect-ratio.tsx +0 -5
  118. package/primitives/avatar.tsx +0 -57
  119. package/primitives/background-beams.tsx +0 -142
  120. package/primitives/badge.tsx +0 -44
  121. package/primitives/breadcrumb.tsx +0 -130
  122. package/primitives/breakpoint-indicator.tsx +0 -19
  123. package/primitives/button.tsx +0 -82
  124. package/primitives/calendar.tsx +0 -72
  125. package/primitives/card.tsx +0 -97
  126. package/primitives/carousel.tsx +0 -237
  127. package/primitives/chat/chat-input-area.tsx +0 -87
  128. package/primitives/chat/chat-input.tsx +0 -71
  129. package/primitives/chat/files-preview.tsx +0 -330
  130. package/primitives/chat/index.ts +0 -6
  131. package/primitives/chat/json-form.tsx +0 -8
  132. package/primitives/chat/message-list.tsx +0 -307
  133. package/primitives/chat/message.tsx +0 -569
  134. package/primitives/chat/sqlite-preview.tsx +0 -215
  135. package/primitives/checkbox.tsx +0 -31
  136. package/primitives/collapsible.tsx +0 -9
  137. package/primitives/combobox.tsx +0 -239
  138. package/primitives/command.tsx +0 -149
  139. package/primitives/context-menu.tsx +0 -206
  140. package/primitives/copy-to-clipboard-icon.tsx +0 -60
  141. package/primitives/dialog-video-controller.tsx +0 -38
  142. package/primitives/dialog.tsx +0 -123
  143. package/primitives/dot-pattern.tsx +0 -57
  144. package/primitives/dots-loader.tsx +0 -13
  145. package/primitives/drawer.tsx +0 -110
  146. package/primitives/dropdown-menu.tsx +0 -199
  147. package/primitives/error-message.tsx +0 -19
  148. package/primitives/file-uploader.tsx +0 -200
  149. package/primitives/form.tsx +0 -183
  150. package/primitives/hover-card.tsx +0 -28
  151. package/primitives/icons/github.tsx +0 -14
  152. package/primitives/icons/index.ts +0 -18
  153. package/primitives/icons/youtube-logo.tsx +0 -59
  154. package/primitives/index-common.ts +0 -303
  155. package/primitives/index-next.ts +0 -4
  156. package/primitives/input-otp.tsx +0 -65
  157. package/primitives/input.tsx +0 -125
  158. package/primitives/label.tsx +0 -20
  159. package/primitives/list-adaptor.ts +0 -12
  160. package/primitives/list-box.tsx +0 -74
  161. package/primitives/loading-spinner.tsx +0 -33
  162. package/primitives/markdown-preview.tsx +0 -609
  163. package/primitives/mermaid.tsx +0 -196
  164. package/primitives/navigation-menu.tsx +0 -147
  165. package/primitives/next/image.tsx +0 -90
  166. package/primitives/next/index.ts +0 -7
  167. package/primitives/next/inline-icon.tsx +0 -36
  168. package/primitives/next/link-element.tsx +0 -109
  169. package/primitives/next/mdx-link.tsx +0 -22
  170. package/primitives/next/media-stack.tsx +0 -69
  171. package/primitives/next/nav-items.tsx +0 -45
  172. package/primitives/next/youtube-embed.tsx +0 -83
  173. package/primitives/pagination.tsx +0 -117
  174. package/primitives/popover.tsx +0 -32
  175. package/primitives/pretty-json-print.tsx +0 -28
  176. package/primitives/progress.tsx +0 -26
  177. package/primitives/prompt-textarea.tsx +0 -72
  178. package/primitives/qr-code.tsx +0 -112
  179. package/primitives/radio-group.tsx +0 -42
  180. package/primitives/resizable.tsx +0 -47
  181. package/primitives/scroll-area.tsx +0 -57
  182. package/primitives/search-input.tsx +0 -66
  183. package/primitives/select.tsx +0 -122
  184. package/primitives/separator.tsx +0 -25
  185. package/primitives/sheet.tsx +0 -139
  186. package/primitives/skeleton.tsx +0 -17
  187. package/primitives/slider.tsx +0 -62
  188. package/primitives/sonner.tsx +0 -35
  189. package/primitives/step-indicator.tsx +0 -69
  190. package/primitives/stepper.tsx +0 -272
  191. package/primitives/switch.tsx +0 -26
  192. package/primitives/table.tsx +0 -105
  193. package/primitives/tabs.tsx +0 -50
  194. package/primitives/text-area.tsx +0 -26
  195. package/primitives/text-link.tsx +0 -25
  196. package/primitives/textarea.tsx +0 -61
  197. package/primitives/textfield.tsx +0 -75
  198. package/primitives/toast.tsx +0 -30
  199. package/primitives/toggle-group.tsx +0 -63
  200. package/primitives/toggle.tsx +0 -44
  201. package/primitives/tooltip.tsx +0 -47
  202. package/primitives/video-player.tsx +0 -23
  203. package/public/r/accordion.json +0 -11
  204. package/public/r/alert.json +0 -11
  205. package/public/r/avatar.json +0 -11
  206. package/public/r/badge.json +0 -11
  207. package/public/r/button.json +0 -11
  208. package/public/r/card.json +0 -11
  209. package/public/r/checkbox.json +0 -11
  210. package/public/r/default.json +0 -6
  211. package/public/r/dialog.json +0 -11
  212. package/public/r/input.json +0 -11
  213. package/public/r/label.json +0 -11
  214. package/public/r/new-york.json +0 -6
  215. package/public/r/popover.json +0 -11
  216. package/public/r/select.json +0 -11
  217. package/public/r/table.json +0 -11
  218. package/public/r/tabs.json +0 -11
  219. package/public/r/toast.json +0 -11
  220. package/registry.json +0 -184
  221. package/src/button.ts +0 -1
  222. package/src/hooks/index.ts +0 -7
  223. package/src/hooks/use-click-away.ts +0 -31
  224. package/src/hooks/use-combined-refs.ts +0 -22
  225. package/src/hooks/use-copy-clipboard.ts +0 -30
  226. package/src/hooks/use-debounce.ts +0 -17
  227. package/src/hooks/use-fill-ids.ts +0 -25
  228. package/src/hooks/use-map.ts +0 -26
  229. package/src/hooks/use-measure.ts +0 -42
  230. package/src/hooks/use-reverse-video-playback.ts +0 -43
  231. package/src/hooks/use-scroll-restoration.ts +0 -50
  232. package/src/mcp/README.md +0 -141
  233. package/src/mcp/enhanced-server.ts +0 -1208
  234. package/src/mcp/index.ts +0 -518
  235. package/src/mcp/package.json +0 -10
  236. package/src/registry/api.ts +0 -164
  237. package/src/registry/index.ts +0 -60
  238. package/src/registry/package.json +0 -10
  239. package/src/utils.ts +0 -1
  240. package/tailwind/colors.tailwind.js +0 -53
  241. package/tailwind/fontFamily.tailwind.ts +0 -7
  242. package/tailwind/fontSize.tailwind.ts +0 -13
  243. package/tailwind/index.ts +0 -7
  244. package/tailwind/safelist.tailwind.js +0 -26
  245. package/tailwind/screens.tailwind.js +0 -8
  246. package/tailwind/spacing.tailwind.js +0 -65
  247. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  248. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  249. package/tailwind/tw-font-desc.ts +0 -15
  250. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  251. package/tailwind/typo-plugin/index.d.ts +0 -9
  252. package/tailwind/typo-plugin/index.js +0 -141
  253. package/tailwind/typo-plugin/utils.js +0 -60
  254. package/tailwind/typography-test.mdx +0 -35
  255. package/tailwind/z-index.tailwind.js +0 -71
  256. package/test/test-registry.js +0 -73
  257. package/test-imports.mjs +0 -19
  258. package/tsconfig.json +0 -22
  259. package/types/animation-def.ts +0 -3
  260. package/types/breakpoints.ts +0 -11
  261. package/types/bullet-item.ts +0 -10
  262. package/types/button-def.ts +0 -39
  263. package/types/dimensions.ts +0 -8
  264. package/types/grid-def.ts +0 -56
  265. package/types/image-def.ts +0 -32
  266. package/types/index.ts +0 -29
  267. package/types/link-def.ts +0 -56
  268. package/types/media-stack-def.ts +0 -31
  269. package/types/t-shirt-size.ts +0 -5
  270. package/types/tshirt-dimensions.ts +0 -20
  271. package/types/video-def.ts +0 -25
  272. package/util/blob.ts +0 -28
  273. package/util/copy-to-clipboard.ts +0 -17
  274. package/util/create-shadow-root.ts +0 -22
  275. package/util/date.ts +0 -83
  276. package/util/debounce.ts +0 -11
  277. package/util/file.ts +0 -15
  278. package/util/format-and-abbreviate-as-currency.ts +0 -125
  279. package/util/format-text.ts +0 -33
  280. package/util/format-to-max-char.ts +0 -68
  281. package/util/index-client.ts +0 -3
  282. package/util/index.ts +0 -9
  283. package/util/number-abbreviate.ts +0 -49
  284. package/util/specifier.ts +0 -43
  285. package/util/spread-to-transform.ts +0 -24
  286. package/util/step-animation.ts +0 -90
  287. package/util/timing.ts +0 -3
  288. package/util/toasts.tsx +0 -17
  289. package/util/two-way-map.ts +0 -19
  290. package/utils.ts +0 -9
@@ -1,215 +0,0 @@
1
- import { debug } from '@tauri-apps/plugin-log';
2
- import { useEffect, useState } from 'react';
3
- import * as sqljs from 'sql.js';
4
-
5
- import { Button } from '../button';
6
- import { Skeleton } from '../skeleton';
7
-
8
- interface SqlitePreviewProps {
9
- url: string;
10
- }
11
-
12
- const loadTableData = async (
13
- db: sqljs.Database,
14
- tableName: string,
15
- ): Promise<{ values: sqljs.SqlValue[][] }> => {
16
- void debug(`loading table data for ${tableName}`);
17
- const dataResult = db.exec(`SELECT * FROM ${tableName}`);
18
- void debug(`found ${dataResult[0].values.length} rows for ${tableName}`);
19
- return { values: dataResult[0].values };
20
- };
21
-
22
- const loadDatabase = async (
23
- url: string,
24
- ): Promise<{
25
- db: sqljs.Database;
26
- tables: { name: string; columns: sqljs.SqlValue[]; count: number }[];
27
- }> => {
28
- void debug(`loading database from ${url}`);
29
- const SQL = await sqljs.default({
30
- locateFile: (file: string) => '/sqljs/sql-wasm.wasm',
31
- });
32
-
33
- const response = await fetch(url);
34
- const arrayBuffer = await response.arrayBuffer();
35
- const db = new SQL.Database(new Uint8Array(arrayBuffer));
36
-
37
- // Get list of tables
38
- const tablesResult = db.exec(
39
- "SELECT name FROM sqlite_master WHERE type='table'",
40
- );
41
- const tableNames = tablesResult[0].values.map((v) => v[0] as string);
42
- void debug(`found ${tableNames.length} tables`);
43
- void debug(`tables: ${tableNames.join(', ')}`);
44
- const tables = tableNames.map((table) => {
45
- const columnsResult = db.exec(`PRAGMA table_info(${table})`);
46
- const columnNames = columnsResult[0].values.map((v) => v[1]);
47
- const countResult = db.exec(`SELECT COUNT(*) FROM ${table}`);
48
- const count = countResult[0].values[0][0] as number;
49
- void debug(
50
- `found columns ${columnNames.join(', ')} and ${count} rows for ${table}`,
51
- );
52
- return {
53
- name: table,
54
- columns: columnNames,
55
- count,
56
- };
57
- });
58
-
59
- return { db, tables };
60
- };
61
-
62
- export const SqlitePreview: React.FC<SqlitePreviewProps> = ({ url }) => {
63
- const [selectedTable, setSelectedTable] = useState<string>();
64
- const [error, setError] = useState<string>();
65
- const [loading, setLoading] = useState(true);
66
- const [loadingData, setLoadingData] = useState(false);
67
-
68
- const [db, setDb] = useState<sqljs.Database | null>(null);
69
- const [tables, setTables] = useState<
70
- { name: string; columns: sqljs.SqlValue[]; count: number }[]
71
- >([]);
72
- const [tableData, setTableData] = useState<{
73
- columns: sqljs.SqlValue[];
74
- rows: sqljs.SqlValue[][];
75
- } | null>(null);
76
-
77
- useEffect(() => {
78
- const init = async () => {
79
- setLoading(true);
80
- try {
81
- const { db, tables } = await loadDatabase(url);
82
- setDb(db);
83
- setTables(tables);
84
- if (tables.length > 0) {
85
- setSelectedTable(tables[0].name);
86
- }
87
- } catch (error) {
88
- setError(
89
- error instanceof Error ? error.message : 'Failed to load database',
90
- );
91
- } finally {
92
- setLoading(false);
93
- }
94
- };
95
- void init();
96
- }, [url]);
97
-
98
- useEffect(() => {
99
- if (db && selectedTable) {
100
- setLoadingData(true);
101
- loadTableData(db, selectedTable)
102
- .then(({ values }) => {
103
- const columns = tables.find(
104
- (table) => table.name === selectedTable,
105
- )?.columns;
106
- if (!columns) {
107
- setError('Table not found');
108
- return;
109
- }
110
- setTableData({
111
- columns,
112
- rows: values,
113
- });
114
- })
115
- .catch((error) => {
116
- setError(
117
- error instanceof Error
118
- ? error.message
119
- : 'Failed to load table data',
120
- );
121
- })
122
- .finally(() => {
123
- setLoadingData(false);
124
- });
125
- }
126
- }, [db, selectedTable, tables]);
127
-
128
- useEffect(() => {
129
- return () => {
130
- if (db) {
131
- void debug('closing database connection');
132
- db.close();
133
- }
134
- };
135
- }, [db]);
136
-
137
- if (error) {
138
- return (
139
- <div className="p-4 text-red-500">Error loading database: {error}</div>
140
- );
141
- }
142
-
143
- if (loading) {
144
- return (
145
- <div className="flex flex-col gap-4 rounded-lg bg-gray-600 p-4">
146
- <div className="flex gap-2">
147
- <Skeleton className="h-8 w-24" />
148
- <Skeleton className="h-8 w-24" />
149
- </div>
150
- <div className="space-y-2">
151
- <Skeleton className="h-8 w-full" />
152
- <Skeleton className="h-8 w-full" />
153
- <Skeleton className="h-8 w-full" />
154
- </div>
155
- </div>
156
- );
157
- }
158
-
159
- return (
160
- <div className="flex flex-col gap-4 overflow-y-hidden rounded-lg bg-gray-600 p-4">
161
- <div className="flex flex-wrap gap-2">
162
- {tables.map((table) => (
163
- <Button
164
- key={table.name}
165
- onClick={() => setSelectedTable(table.name)}
166
- size="sm"
167
- variant={selectedTable === table.name ? 'default' : 'outline'}
168
- >
169
- {table.name} ({table.count})
170
- </Button>
171
- ))}
172
- </div>
173
-
174
- {selectedTable && (
175
- <div className="max-h-full min-h-fit overflow-y-auto">
176
- <div className="overflow-x-auto">
177
- {loadingData ? (
178
- <div className="space-y-2">
179
- <Skeleton className="h-8 w-full" />
180
- <Skeleton className="h-8 w-full" />
181
- <Skeleton className="h-8 w-full" />
182
- </div>
183
- ) : (
184
- <table className="w-full text-left text-sm">
185
- <thead className="sticky top-0 bg-gray-600">
186
- <tr className="border-b border-gray-500">
187
- {tableData?.columns.map((column) => (
188
- <th
189
- className="p-2 font-medium text-gray-300"
190
- key={String(column)}
191
- >
192
- {String(column)}
193
- </th>
194
- ))}
195
- </tr>
196
- </thead>
197
- <tbody>
198
- {tableData?.rows.map((row, i) => (
199
- <tr className="border-b border-gray-700" key={i}>
200
- {row.map((cell, j) => (
201
- <td className="text-text-secondary p-2" key={j}>
202
- {String(cell)}
203
- </td>
204
- ))}
205
- </tr>
206
- ))}
207
- </tbody>
208
- </table>
209
- )}
210
- </div>
211
- </div>
212
- )}
213
- </div>
214
- );
215
- };
@@ -1,31 +0,0 @@
1
- import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
2
- import { CheckIcon } from '@radix-ui/react-icons';
3
- import * as React from 'react';
4
-
5
- import { cn } from '../src/utils';
6
-
7
- type CheckboxProps = React.ComponentPropsWithoutRef<
8
- typeof CheckboxPrimitive.Root
9
- > & {
10
- ref?: React.RefObject<React.ComponentRef<typeof CheckboxPrimitive.Root>>;
11
- };
12
-
13
- const Checkbox = ({ className, ref, ...props }: CheckboxProps) => (
14
- <CheckboxPrimitive.Root
15
- className={cn(
16
- 'focus-visible:ring-ring data-[state=checked]:bg-brand data-[state=checked]:border-brand peer h-4 w-4 shrink-0 rounded-xs border border-gray-400 shadow-sm focus-visible:ring-1 focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:text-black',
17
- className,
18
- )}
19
- ref={ref}
20
- {...props}
21
- >
22
- <CheckboxPrimitive.Indicator
23
- className={cn('flex items-center justify-center text-current')}
24
- >
25
- <CheckIcon className="h-3.5 w-3.5" />
26
- </CheckboxPrimitive.Indicator>
27
- </CheckboxPrimitive.Root>
28
- );
29
- Checkbox.displayName = CheckboxPrimitive.Root.displayName;
30
-
31
- export { Checkbox };
@@ -1,9 +0,0 @@
1
- import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
2
-
3
- const Collapsible = CollapsiblePrimitive.Root;
4
-
5
- const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
6
-
7
- const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
8
-
9
- export { Collapsible, CollapsibleTrigger, CollapsibleContent };
@@ -1,239 +0,0 @@
1
- 'use client'
2
- import React, { useState } from 'react'
3
-
4
- import { Check, ChevronDown } from 'lucide-react'
5
-
6
- import { cn } from '../util'
7
- import Button from './button'
8
- import {
9
- Command,
10
- CommandEmpty,
11
- CommandGroup,
12
- CommandInput,
13
- CommandItem,
14
- CommandList,
15
- } from './command'
16
-
17
- import {
18
- Popover,
19
- PopoverContent,
20
- PopoverTrigger,
21
- } from './popover'
22
-
23
- import type ListAdaptor from './list-adaptor'
24
-
25
- const DEFAULT_IMAGE_SIZE = 32
26
-
27
- interface ComboboxTriggerProps<T> {
28
- current: T | null
29
- currentLabel: string | null
30
- imageUrl: string | null
31
- placeholder?: string
32
- buttonClx?: string
33
- imageClx?: string
34
- disabled?: boolean
35
- imageSize?: number
36
- noChevron?: boolean
37
- open: boolean
38
- }
39
-
40
- const DefaultTriggerInner = <T,>(
41
- {
42
- current,
43
- currentLabel,
44
- imageUrl,
45
- buttonClx='',
46
- imageClx='',
47
- placeholder='(select)',
48
- disabled=false,
49
- imageSize=DEFAULT_IMAGE_SIZE,
50
- noChevron=false,
51
- open,
52
- ...rest
53
- }: ComboboxTriggerProps<T>,
54
- ref: React.ForwardedRef<HTMLButtonElement>
55
- ) => (
56
- <Button
57
- ref={ref}
58
- {...rest}
59
- variant='outline'
60
- role='combobox'
61
- aria-expanded={open}
62
- className={cn(
63
- 'flex',
64
- noChevron ? 'justify-start' : 'justify-between',
65
- buttonClx
66
- )}
67
- disabled={disabled}
68
- >
69
- <div className='flex justify-start items-center gap-2'>
70
- {(current && imageUrl) ? (
71
- <img
72
- src={imageUrl}
73
- alt={currentLabel + ' image'}
74
- height={imageSize}
75
- width={imageSize}
76
- loading="eager"
77
- className={cn('block', imageClx)}
78
- />
79
- ) : (
80
- <div style={{width: imageSize, height: imageSize}} />
81
- )}
82
- <span className='block'>{currentLabel}</span>
83
- </div>
84
- {!noChevron && (<ChevronDown className={cn('block', open ? '' : 'opacity-50')} />)}
85
- </Button>
86
- )
87
-
88
- const DefaultTrigger = React.forwardRef(DefaultTriggerInner) as <T, P>(props: P & { ref?: React.ForwardedRef<HTMLButtonElement> }) => React.ReactNode
89
-
90
- const Combobox = <T, P extends ComboboxTriggerProps<T>>({
91
- elements,
92
- initial,
93
- current,
94
- setCurrent,
95
- closeOnSelect=true,
96
- adaptor,
97
- popoverClx='',
98
- listItemClx='',
99
- listItemSelectedClx='',
100
- listItemDisabledClx='',
101
- noCheckmark=false,
102
- listItemImageClx='',
103
- searchPlaceholder='Search...',
104
- noneFoundMessage='None found.',
105
- listItemImageSize=DEFAULT_IMAGE_SIZE,
106
- noSearch=false,
107
- popoverAlign = 'center',
108
- popoverSideOffset = 4,
109
- Trigger,
110
- triggerProps
111
- }: {
112
- elements: T[]
113
- initial?: T | null
114
- current?: T | null
115
- setCurrent: (c: T | null) => void
116
- closeOnSelect?: boolean
117
- adaptor: ListAdaptor<T>
118
- popoverClx?: string
119
- listItemClx?: string
120
- listItemSelectedClx?: string
121
- listItemDisabledClx?: string
122
- listItemImageClx?: string
123
- listItemImageSize?: number
124
- noCheckmark?: boolean
125
- searchPlaceholder?: string
126
- noneFoundMessage?: string
127
- noSearch?: boolean
128
- popoverAlign?: "center" | "end" | "start"
129
- popoverSideOffset?: number
130
- /** If (custom) Trigger is not supplied,
131
- * passed to default trigger */
132
- triggerProps: P
133
- Trigger?:
134
- <T, P>(props: P & { ref?: React.ForwardedRef<HTMLButtonElement> }) => React.ReactNode
135
- }) => {
136
-
137
- const [_open, _setOpen] = useState<boolean>(false)
138
- // for non-controlled base (must declare the hook either way)
139
- const [_current, _setCurrent] = useState<T | null>(initial ?? null)
140
-
141
- const handleSelect = (selString: string) => {
142
-
143
- const found = elements.find((el: T) => (adaptor.valueEquals(el, selString)))
144
- if (found) {
145
- // non-controlled ('initial' supplied (may have been null))
146
- if (initial !== undefined) {
147
- _setCurrent(found)
148
- }
149
- setCurrent(found)
150
- }
151
- if (closeOnSelect) {
152
- _setOpen(false)
153
- }
154
- }
155
-
156
- const isCurrent = (el: T): boolean => {
157
-
158
- // non-controlled?
159
- const curr = (current === undefined) ? _current : current
160
- return !!curr && adaptor.equals(el, curr)
161
- }
162
-
163
- const _triggerProps = current ? {
164
- ...triggerProps,
165
- current,
166
- currentLabel: adaptor.getLabel ? adaptor.getLabel(current) : adaptor.getValue(current),
167
- imageUrl: adaptor.getImageUrl ? adaptor.getImageUrl(current) : null,
168
- open: _open
169
- } : {
170
- ...triggerProps,
171
- current: null,
172
- currentLabel: null,
173
- imageUrl: null,
174
- open: _open
175
- }
176
-
177
- return (
178
- <Popover open={_open} onOpenChange={_setOpen}>
179
- <PopoverTrigger asChild>
180
- {Trigger ? (
181
- <Trigger<T, P> {..._triggerProps} />
182
- ) : (
183
- <DefaultTrigger<T, P> {..._triggerProps} />
184
- )}
185
- </PopoverTrigger>
186
- <PopoverContent className={cn('p-0', popoverClx)} align={popoverAlign} sideOffset={popoverSideOffset}>
187
- <Command>
188
- {!noSearch && (<CommandInput placeholder={searchPlaceholder} />)}
189
- <CommandList>
190
- <CommandEmpty>{noneFoundMessage}</CommandEmpty>
191
- <CommandGroup>
192
- {elements.map((el) => (
193
- <CommandItem
194
- key={adaptor.getValue(el)}
195
- value={adaptor.getValue(el)}
196
- onSelect={handleSelect}
197
- disabled={adaptor.isDisabled ? adaptor.isDisabled(el) : false}
198
- className={cn(
199
- 'flex',
200
- noCheckmark ? 'justify-start' : 'justify-between',
201
- listItemClx,
202
- (isCurrent(el) ? listItemSelectedClx : ''),
203
- ((adaptor.isDisabled && adaptor.isDisabled(el)) ? listItemDisabledClx : '')
204
- )}
205
- >
206
- <div className='flex justify-start items-center gap-2'>
207
- { (adaptor.getImageUrl && adaptor.getImageUrl(el)) ? (
208
- <img
209
- src={adaptor.getImageUrl(el)!}
210
- alt={adaptor.getValue(el) + ' image'}
211
- height={listItemImageSize}
212
- width={listItemImageSize}
213
- loading="eager"
214
- className={listItemImageClx}
215
- />
216
- ) : (
217
- <div style={{width: listItemImageSize, height: listItemImageSize}} />
218
- )}
219
- <span>{ adaptor.getLabel ? adaptor.getLabel(el) : adaptor.getValue(el) }</span>
220
- </div>
221
- {!noCheckmark && (
222
- <div>
223
- <Check className={cn('ml-auto', (isCurrent(el)) ? '' : 'invisible' )} />
224
- </div>
225
- )}
226
- </CommandItem>
227
- ))}
228
- </CommandGroup>
229
- </CommandList>
230
- </Command>
231
- </PopoverContent>
232
- </Popover>
233
- )
234
- }
235
-
236
- export {
237
- Combobox as default,
238
- type ComboboxTriggerProps
239
- }
@@ -1,149 +0,0 @@
1
- import { DialogProps } from '@radix-ui/react-dialog';
2
- import { Command as CommandPrimitive } from 'cmdk';
3
- import { Search } from 'lucide-react';
4
- import * as React from 'react';
5
-
6
- import { cn } from '../src/utils';
7
- import { Dialog, DialogContent } from './dialog';
8
-
9
- const Command = ({
10
- className,
11
- ...props
12
- }: React.ComponentProps<typeof CommandPrimitive>) => (
13
- <CommandPrimitive
14
- className={cn(
15
- 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md [&_[cmdk-list]]:scroll-pt-0 [&_[cmdk-list]]:scroll-auto',
16
- className,
17
- )}
18
- loop={true}
19
- {...props}
20
- />
21
- );
22
- Command.displayName = CommandPrimitive.displayName;
23
-
24
- type CommandDialogProps = DialogProps;
25
-
26
- const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
27
- return (
28
- <Dialog {...props}>
29
- <DialogContent className="overflow-hidden p-0 shadow-lg">
30
- <Command className="[&_[cmdk-group-heading]]:text-text-secondary [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
31
- {children}
32
- </Command>
33
- </DialogContent>
34
- </Dialog>
35
- );
36
- };
37
-
38
- const CommandInput = ({
39
- className,
40
- ref,
41
- ...props
42
- }: React.ComponentProps<typeof CommandPrimitive.Input>) => (
43
- <div className="flex items-center border-b px-3" cmdk-input-wrapper="">
44
- <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
45
- <CommandPrimitive.Input
46
- className={cn(
47
- 'placeholder:!text-text-placeholder flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50',
48
- className,
49
- )}
50
- ref={ref}
51
- {...props}
52
- />
53
- </div>
54
- );
55
-
56
- CommandInput.displayName = CommandPrimitive.Input.displayName;
57
-
58
- const CommandList = ({
59
- className,
60
- ...props
61
- }: React.ComponentProps<typeof CommandPrimitive.List>) => (
62
- <CommandPrimitive.List
63
- className={cn(
64
- 'max-h-[300px] scroll-pt-0 overflow-x-hidden overflow-y-auto scroll-auto',
65
- className,
66
- )}
67
- {...props}
68
- />
69
- );
70
-
71
- CommandList.displayName = CommandPrimitive.List.displayName;
72
-
73
- const CommandEmpty = ({
74
- className,
75
- ...props
76
- }: React.ComponentProps<typeof CommandPrimitive.Empty>) => (
77
- <CommandPrimitive.Empty className="py-6 text-center text-sm" {...props} />
78
- );
79
-
80
- CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
81
-
82
- const CommandGroup = ({
83
- className,
84
- ...props
85
- }: React.ComponentProps<typeof CommandPrimitive.Group>) => (
86
- <CommandPrimitive.Group
87
- className={cn(
88
- 'text-text-default [&_[cmdk-group-heading]]:text-text-default overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',
89
- className,
90
- )}
91
- {...props}
92
- />
93
- );
94
-
95
- CommandGroup.displayName = CommandPrimitive.Group.displayName;
96
-
97
- const CommandSeparator = ({
98
- className,
99
- ...props
100
- }: React.ComponentProps<typeof CommandPrimitive.Separator>) => (
101
- <CommandPrimitive.Separator
102
- className={cn('bg-divider -mx-1 h-px', className)}
103
- {...props}
104
- />
105
- );
106
- CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
107
-
108
- const CommandItem = ({
109
- className,
110
- ...props
111
- }: React.ComponentProps<typeof CommandPrimitive.Item>) => (
112
- <CommandPrimitive.Item
113
- className={cn(
114
- "hover:bg-bg-secondary data-[selected=true]:text-text-default data-[selected='true']:bg-bg-secondary relative flex cursor-default items-center rounded-xs px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
115
- className,
116
- )}
117
- {...props}
118
- />
119
- );
120
-
121
- CommandItem.displayName = CommandPrimitive.Item.displayName;
122
-
123
- const CommandShortcut = ({
124
- className,
125
- ...props
126
- }: React.HTMLAttributes<HTMLSpanElement>) => {
127
- return (
128
- <span
129
- className={cn(
130
- 'text-text-secondary ml-auto text-xs tracking-widest',
131
- className,
132
- )}
133
- {...props}
134
- />
135
- );
136
- };
137
- CommandShortcut.displayName = 'CommandShortcut';
138
-
139
- export {
140
- Command,
141
- CommandDialog,
142
- CommandInput,
143
- CommandList,
144
- CommandEmpty,
145
- CommandGroup,
146
- CommandItem,
147
- CommandShortcut,
148
- CommandSeparator,
149
- };