@hanzo/ui 5.0.2 → 5.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 (371) hide show
  1. package/dist/accordion.js +1 -0
  2. package/dist/accordion.mjs +1 -0
  3. package/dist/alert-dialog.js +1 -0
  4. package/dist/alert-dialog.mjs +1 -0
  5. package/dist/alert.js +1 -0
  6. package/dist/alert.mjs +1 -0
  7. package/dist/avatar.js +1 -0
  8. package/dist/avatar.mjs +1 -0
  9. package/dist/badge.js +1 -0
  10. package/dist/badge.mjs +1 -0
  11. package/dist/breadcrumb.js +1 -0
  12. package/dist/breadcrumb.mjs +1 -0
  13. package/dist/calendar.js +1 -0
  14. package/dist/calendar.mjs +1 -0
  15. package/dist/carousel.js +1 -0
  16. package/dist/carousel.mjs +1 -0
  17. package/dist/checkbox.js +1 -0
  18. package/dist/checkbox.mjs +1 -0
  19. package/dist/chunk-3H5S2OQ3.mjs +1 -0
  20. package/dist/chunk-5GRJ7UQX.js +1 -0
  21. package/dist/chunk-63HNMH7C.js +1 -0
  22. package/dist/chunk-72TOQ4DM.mjs +1 -0
  23. package/dist/chunk-7AEFTV5R.mjs +1 -0
  24. package/dist/chunk-7M4AVV2R.js +1 -0
  25. package/dist/chunk-DKPVJSBC.js +1 -0
  26. package/dist/chunk-EI7MMDWY.js +1 -0
  27. package/dist/chunk-GANGDIZG.mjs +1 -0
  28. package/dist/chunk-GRGT2Z4K.js +1 -0
  29. package/dist/chunk-JCUUC6NY.mjs +1 -0
  30. package/dist/chunk-JUQMWLIN.js +1 -0
  31. package/dist/chunk-PRVEIITE.js +1 -0
  32. package/dist/chunk-SH52AKNZ.js +1 -0
  33. package/dist/chunk-TU67EJEW.mjs +1 -0
  34. package/dist/chunk-WN5KN73U.mjs +1 -0
  35. package/dist/chunk-YSXGDEY5.mjs +1 -0
  36. package/dist/chunk-Z76OOVUE.mjs +1 -0
  37. package/dist/collapsible.js +1 -0
  38. package/dist/collapsible.mjs +1 -0
  39. package/dist/command.js +1 -0
  40. package/dist/command.mjs +1 -0
  41. package/dist/context-menu.js +1 -0
  42. package/dist/context-menu.mjs +1 -0
  43. package/dist/dialog.js +1 -0
  44. package/dist/dialog.mjs +1 -0
  45. package/dist/drawer.js +1 -0
  46. package/dist/drawer.mjs +1 -0
  47. package/dist/dropdown-menu.js +1 -0
  48. package/dist/dropdown-menu.mjs +1 -0
  49. package/dist/form.js +1 -0
  50. package/dist/form.mjs +1 -0
  51. package/dist/hover-card.js +1 -0
  52. package/dist/hover-card.mjs +1 -0
  53. package/dist/index.js +1 -9079
  54. package/dist/index.mjs +1 -8700
  55. package/dist/input-otp.js +1 -0
  56. package/dist/input-otp.mjs +1 -0
  57. package/dist/lib/utils.js +1 -0
  58. package/dist/lib/utils.mjs +1 -0
  59. package/dist/navigation-menu.js +1 -0
  60. package/dist/navigation-menu.mjs +1 -0
  61. package/dist/popover.js +1 -0
  62. package/dist/popover.mjs +1 -0
  63. package/dist/progress.js +1 -0
  64. package/dist/progress.mjs +1 -0
  65. package/dist/radio-group.js +1 -0
  66. package/dist/radio-group.mjs +1 -0
  67. package/dist/resizable.js +1 -0
  68. package/dist/resizable.mjs +1 -0
  69. package/dist/scroll-area.js +1 -0
  70. package/dist/scroll-area.mjs +1 -0
  71. package/dist/select.js +1 -0
  72. package/dist/select.mjs +1 -0
  73. package/dist/separator.js +1 -0
  74. package/dist/separator.mjs +1 -0
  75. package/dist/sheet.js +1 -0
  76. package/dist/sheet.mjs +1 -0
  77. package/dist/skeleton.js +1 -0
  78. package/dist/skeleton.mjs +1 -0
  79. package/dist/slider.js +1 -0
  80. package/dist/slider.mjs +1 -0
  81. package/dist/sonner.js +1 -0
  82. package/dist/sonner.mjs +1 -0
  83. package/dist/src/utils.js +1 -0
  84. package/dist/src/utils.mjs +1 -0
  85. package/dist/switch.js +1 -0
  86. package/dist/switch.mjs +1 -0
  87. package/dist/table.js +1 -0
  88. package/dist/table.mjs +1 -0
  89. package/dist/tabs.js +1 -0
  90. package/dist/tabs.mjs +1 -0
  91. package/dist/tailwind/index.js +1 -0
  92. package/dist/tailwind/index.mjs +1 -0
  93. package/dist/textarea.js +1 -0
  94. package/dist/textarea.mjs +1 -0
  95. package/dist/toggle-group.js +1 -0
  96. package/dist/toggle-group.mjs +1 -0
  97. package/dist/toggle.js +1 -0
  98. package/dist/toggle.mjs +1 -0
  99. package/dist/tooltip.js +1 -0
  100. package/dist/tooltip.mjs +1 -0
  101. package/dist/types/index.js +1 -0
  102. package/dist/types/index.mjs +1 -0
  103. package/package.json +110 -81
  104. package/assets/ai-icons.tsx +0 -207
  105. package/assets/crypto.tsx +0 -33
  106. package/assets/file-type-icon.tsx +0 -66
  107. package/assets/file.tsx +0 -45
  108. package/assets/general.tsx +0 -2318
  109. package/assets/hanzo-logo.svg +0 -9
  110. package/assets/hanzo-logo.tsx +0 -17
  111. package/assets/index.ts +0 -122
  112. package/assets/index.tsx +0 -4
  113. package/assets/llm-provider.tsx +0 -1094
  114. package/blocks/auth/index.ts +0 -6
  115. package/blocks/auth/login-2fa.tsx +0 -165
  116. package/blocks/auth/login-basic.tsx +0 -94
  117. package/blocks/auth/login-social.tsx +0 -148
  118. package/blocks/auth/magic-link.tsx +0 -129
  119. package/blocks/auth/password-reset.tsx +0 -97
  120. package/blocks/auth/signup.tsx +0 -157
  121. package/blocks/components/accordian-block.tsx +0 -48
  122. package/blocks/components/block-component-props.ts +0 -11
  123. package/blocks/components/bullet-cards-block.tsx +0 -46
  124. package/blocks/components/card-block/index.tsx +0 -171
  125. package/blocks/components/card-block/link-out-button.tsx +0 -20
  126. package/blocks/components/card-block/util.ts +0 -28
  127. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  128. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  129. package/blocks/components/content.tsx +0 -70
  130. package/blocks/components/cta-block.tsx +0 -115
  131. package/blocks/components/enh-heading-block.tsx +0 -204
  132. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  133. package/blocks/components/grid-block/index.tsx +0 -83
  134. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  135. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  136. package/blocks/components/group-block.tsx +0 -83
  137. package/blocks/components/heading-block.tsx +0 -88
  138. package/blocks/components/image-block.tsx +0 -111
  139. package/blocks/components/index.ts +0 -30
  140. package/blocks/components/screenful-block/content.tsx +0 -123
  141. package/blocks/components/screenful-block/index.tsx +0 -107
  142. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  143. package/blocks/components/screenful-block/video-background.tsx +0 -45
  144. package/blocks/components/space-block.tsx +0 -66
  145. package/blocks/components/video-block.tsx +0 -138
  146. package/blocks/data-display/activity-feed.tsx +0 -242
  147. package/blocks/data-display/data-table.tsx +0 -235
  148. package/blocks/data-display/stats-grid.tsx +0 -194
  149. package/blocks/def/accordian-block.ts +0 -14
  150. package/blocks/def/block.ts +0 -7
  151. package/blocks/def/bullet-cards-block.ts +0 -22
  152. package/blocks/def/card-block.ts +0 -22
  153. package/blocks/def/carte-blanche-block.ts +0 -21
  154. package/blocks/def/cta-block.ts +0 -19
  155. package/blocks/def/element-block.ts +0 -11
  156. package/blocks/def/enh-heading-block.ts +0 -44
  157. package/blocks/def/grid-block.ts +0 -16
  158. package/blocks/def/group-block.ts +0 -11
  159. package/blocks/def/heading-block.ts +0 -15
  160. package/blocks/def/image-block.ts +0 -31
  161. package/blocks/def/index.ts +0 -35
  162. package/blocks/def/screenful-block.ts +0 -54
  163. package/blocks/def/space-block.ts +0 -64
  164. package/blocks/def/video-block.ts +0 -9
  165. package/blocks/ecommerce/checkout.tsx +0 -242
  166. package/blocks/ecommerce/index.ts +0 -7
  167. package/blocks/ecommerce/product-detail.tsx +0 -257
  168. package/blocks/ecommerce/product-grid.tsx +0 -148
  169. package/blocks/ecommerce/shopping-cart.tsx +0 -181
  170. package/blocks/index.ts +0 -2
  171. package/blocks/marketing/cta-section.tsx +0 -207
  172. package/blocks/marketing/faq.tsx +0 -159
  173. package/blocks/marketing/features-grid.tsx +0 -156
  174. package/blocks/marketing/hero-section.tsx +0 -192
  175. package/blocks/marketing/index.ts +0 -6
  176. package/blocks/marketing/pricing-table.tsx +0 -121
  177. package/blocks/marketing/testimonials.tsx +0 -196
  178. package/components/index.ts +0 -9
  179. package/dist/index.js.map +0 -1
  180. package/dist/index.mjs.map +0 -1
  181. package/dist/tailwind.js +0 -2025
  182. package/dist/tailwind.js.map +0 -1
  183. package/dist/tailwind.mjs +0 -2013
  184. package/dist/tailwind.mjs.map +0 -1
  185. package/dist/types.js +0 -59
  186. package/dist/types.js.map +0 -1
  187. package/dist/types.mjs +0 -53
  188. package/dist/types.mjs.map +0 -1
  189. package/dist/utils.js +0 -30
  190. package/dist/utils.js.map +0 -1
  191. package/dist/utils.mjs +0 -26
  192. package/dist/utils.mjs.map +0 -1
  193. package/frameworks/core/index.ts +0 -6
  194. package/frameworks/core/utils/index.ts +0 -64
  195. package/frameworks/react/components/button.tsx +0 -26
  196. package/frameworks/react/components/index.ts +0 -5
  197. package/frameworks/react/hooks/index.ts +0 -5
  198. package/frameworks/react/index.ts +0 -9
  199. package/frameworks/react/package.json +0 -8
  200. package/frameworks/react/utils/index.ts +0 -2
  201. package/frameworks/react-native/index.ts +0 -9
  202. package/frameworks/react-native/package.json +0 -8
  203. package/frameworks/registry.json +0 -371
  204. package/frameworks/setup.sh +0 -69
  205. package/frameworks/svelte/index.ts +0 -9
  206. package/frameworks/svelte/package.json +0 -8
  207. package/frameworks/tracker.json +0 -1854
  208. package/frameworks/vue/index.ts +0 -9
  209. package/frameworks/vue/package.json +0 -8
  210. package/helpers/file.ts +0 -33
  211. package/helpers/memoization.ts +0 -40
  212. package/primitives/accordion.tsx +0 -74
  213. package/primitives/action-button.tsx +0 -42
  214. package/primitives/alert-dialog.tsx +0 -185
  215. package/primitives/alert.tsx +0 -74
  216. package/primitives/apply-typography.tsx +0 -55
  217. package/primitives/aspect-ratio.tsx +0 -5
  218. package/primitives/avatar.tsx +0 -57
  219. package/primitives/background-beams.tsx +0 -142
  220. package/primitives/badge.tsx +0 -45
  221. package/primitives/breadcrumb.tsx +0 -130
  222. package/primitives/breakpoint-indicator.tsx +0 -19
  223. package/primitives/button.tsx +0 -72
  224. package/primitives/calendar.tsx +0 -72
  225. package/primitives/card.tsx +0 -97
  226. package/primitives/carousel.tsx +0 -238
  227. package/primitives/chat/chat-input-area.tsx +0 -88
  228. package/primitives/chat/chat-input.tsx +0 -71
  229. package/primitives/chat/files-preview.tsx +0 -331
  230. package/primitives/chat/index.ts +0 -6
  231. package/primitives/chat/json-form.tsx +0 -8
  232. package/primitives/chat/message-list.tsx +0 -308
  233. package/primitives/chat/message.tsx +0 -569
  234. package/primitives/chat/sqlite-preview.tsx +0 -215
  235. package/primitives/checkbox.tsx +0 -32
  236. package/primitives/collapsible.tsx +0 -9
  237. package/primitives/combobox.tsx +0 -239
  238. package/primitives/command.tsx +0 -151
  239. package/primitives/context-menu.tsx +0 -206
  240. package/primitives/copy-to-clipboard-icon.tsx +0 -60
  241. package/primitives/dialog-video-controller.tsx +0 -38
  242. package/primitives/dialog.tsx +0 -128
  243. package/primitives/dot-pattern.tsx +0 -57
  244. package/primitives/dots-loader.tsx +0 -13
  245. package/primitives/drawer.tsx +0 -113
  246. package/primitives/dropdown-menu.tsx +0 -199
  247. package/primitives/error-message.tsx +0 -19
  248. package/primitives/file-uploader.tsx +0 -203
  249. package/primitives/form.tsx +0 -185
  250. package/primitives/hover-card.tsx +0 -28
  251. package/primitives/icons/github.tsx +0 -14
  252. package/primitives/icons/index.ts +0 -18
  253. package/primitives/icons/youtube-logo.tsx +0 -59
  254. package/primitives/index-client.ts +0 -4
  255. package/primitives/index-common.ts +0 -304
  256. package/primitives/index-next.ts +0 -4
  257. package/primitives/input-otp.tsx +0 -65
  258. package/primitives/input.tsx +0 -128
  259. package/primitives/label.tsx +0 -21
  260. package/primitives/list-adaptor.ts +0 -12
  261. package/primitives/list-box.tsx +0 -74
  262. package/primitives/loading-spinner.tsx +0 -33
  263. package/primitives/markdown-preview.tsx +0 -612
  264. package/primitives/mermaid.tsx +0 -196
  265. package/primitives/navigation-menu.tsx +0 -147
  266. package/primitives/next/image.tsx +0 -91
  267. package/primitives/next/index.ts +0 -7
  268. package/primitives/next/inline-icon.tsx +0 -36
  269. package/primitives/next/link-element.tsx +0 -109
  270. package/primitives/next/mdx-link.tsx +0 -22
  271. package/primitives/next/media-stack.tsx +0 -52
  272. package/primitives/next/nav-items.tsx +0 -45
  273. package/primitives/next/youtube-embed.tsx +0 -83
  274. package/primitives/pagination.tsx +0 -117
  275. package/primitives/popover.tsx +0 -34
  276. package/primitives/pretty-json-print.tsx +0 -28
  277. package/primitives/progress.tsx +0 -27
  278. package/primitives/prompt-textarea.tsx +0 -72
  279. package/primitives/qr-code.tsx +0 -112
  280. package/primitives/radio-group.tsx +0 -42
  281. package/primitives/resizable.tsx +0 -47
  282. package/primitives/scroll-area.tsx +0 -57
  283. package/primitives/search-input.tsx +0 -66
  284. package/primitives/select.tsx +0 -122
  285. package/primitives/separator.tsx +0 -26
  286. package/primitives/sheet.tsx +0 -139
  287. package/primitives/skeleton.tsx +0 -18
  288. package/primitives/slider.tsx +0 -63
  289. package/primitives/sonner.tsx +0 -35
  290. package/primitives/step-indicator.tsx +0 -69
  291. package/primitives/stepper.tsx +0 -272
  292. package/primitives/switch.tsx +0 -27
  293. package/primitives/table.tsx +0 -105
  294. package/primitives/tabs.tsx +0 -50
  295. package/primitives/text-area.tsx +0 -26
  296. package/primitives/text-link.tsx +0 -27
  297. package/primitives/textarea.tsx +0 -64
  298. package/primitives/textfield.tsx +0 -78
  299. package/primitives/toast.tsx +0 -30
  300. package/primitives/toggle-group.tsx +0 -63
  301. package/primitives/toggle.tsx +0 -44
  302. package/primitives/tooltip.tsx +0 -47
  303. package/primitives/video-player.tsx +0 -23
  304. package/src/button.ts +0 -1
  305. package/src/hooks/index.ts +0 -7
  306. package/src/hooks/use-click-away.ts +0 -31
  307. package/src/hooks/use-combined-refs.ts +0 -22
  308. package/src/hooks/use-copy-clipboard.ts +0 -30
  309. package/src/hooks/use-debounce.ts +0 -17
  310. package/src/hooks/use-fill-ids.ts +0 -25
  311. package/src/hooks/use-map.ts +0 -26
  312. package/src/hooks/use-measure.ts +0 -42
  313. package/src/hooks/use-reverse-video-playback.ts +0 -43
  314. package/src/hooks/use-scroll-restoration.ts +0 -50
  315. package/src/index-lean.ts +0 -87
  316. package/src/index.ts +0 -54
  317. package/src/mcp/README.md +0 -141
  318. package/src/mcp/enhanced-server.ts +0 -1208
  319. package/src/mcp/index.ts +0 -518
  320. package/src/mcp/package.json +0 -10
  321. package/src/registry/api.ts +0 -164
  322. package/src/registry/index.ts +0 -60
  323. package/src/registry/package.json +0 -10
  324. package/src/utils.ts +0 -19
  325. package/tailwind/colors.tailwind.js +0 -53
  326. package/tailwind/fontFamily.tailwind.ts +0 -7
  327. package/tailwind/fontSize.tailwind.ts +0 -13
  328. package/tailwind/index.ts +0 -7
  329. package/tailwind/safelist.tailwind.js +0 -26
  330. package/tailwind/screens.tailwind.js +0 -8
  331. package/tailwind/spacing.tailwind.js +0 -65
  332. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  333. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  334. package/tailwind/tw-font-desc.ts +0 -15
  335. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  336. package/tailwind/typo-plugin/index.d.ts +0 -9
  337. package/tailwind/typo-plugin/index.js +0 -141
  338. package/tailwind/typo-plugin/utils.js +0 -60
  339. package/tailwind/typography-test.mdx +0 -35
  340. package/tailwind/z-index.tailwind.js +0 -71
  341. package/types/animation-def.ts +0 -3
  342. package/types/breakpoints.ts +0 -11
  343. package/types/bullet-item.ts +0 -10
  344. package/types/button-def.ts +0 -39
  345. package/types/dimensions.ts +0 -8
  346. package/types/grid-def.ts +0 -56
  347. package/types/image-def.ts +0 -32
  348. package/types/index.ts +0 -30
  349. package/types/link-def.ts +0 -56
  350. package/types/media-stack-def.ts +0 -31
  351. package/types/t-shirt-size.ts +0 -5
  352. package/types/tshirt-dimensions.ts +0 -20
  353. package/types/video-def.ts +0 -25
  354. package/util/blob.ts +0 -33
  355. package/util/copy-to-clipboard.ts +0 -17
  356. package/util/create-shadow-root.ts +0 -22
  357. package/util/date.ts +0 -84
  358. package/util/debounce.ts +0 -11
  359. package/util/file.ts +0 -15
  360. package/util/format-and-abbreviate-as-currency.ts +0 -125
  361. package/util/format-text.ts +0 -34
  362. package/util/format-to-max-char.ts +0 -68
  363. package/util/index-client.ts +0 -3
  364. package/util/index.ts +0 -112
  365. package/util/number-abbreviate.ts +0 -49
  366. package/util/specifier.ts +0 -43
  367. package/util/spread-to-transform.ts +0 -25
  368. package/util/step-animation.ts +0 -90
  369. package/util/timing.ts +0 -3
  370. package/util/toasts.tsx +0 -17
  371. package/util/two-way-map.ts +0 -19
@@ -1,215 +0,0 @@
1
- // import { debug } from '@tauri-apps/plugin-log'; // Not available in web environment
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 console.log(`loading table data for ${tableName}`);
17
- const dataResult = db.exec(`SELECT * FROM ${tableName}`);
18
- void console.log(`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 console.log(`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 console.log(`found ${tableNames.length} tables`);
43
- void console.log(`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 console.log(
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 console.log('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,32 +0,0 @@
1
- import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
2
- import { CheckIcon } from '@radix-ui/react-icons';
3
- import 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 };
32
- export default 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,151 +0,0 @@
1
- 'use client';
2
-
3
- import { DialogProps } from '@radix-ui/react-dialog';
4
- import { Command as CommandPrimitive } from 'cmdk';
5
- import { Search } from 'lucide-react';
6
- import React from 'react';
7
-
8
- import { cn } from '../src/utils';
9
- import { Dialog, DialogContent } from './dialog';
10
-
11
- const Command = ({
12
- className,
13
- ...props
14
- }: React.ComponentProps<typeof CommandPrimitive>) => (
15
- <CommandPrimitive
16
- className={cn(
17
- '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',
18
- className,
19
- )}
20
- loop={true}
21
- {...props}
22
- />
23
- );
24
- Command.displayName = CommandPrimitive.displayName;
25
-
26
- type CommandDialogProps = DialogProps;
27
-
28
- const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
29
- return (
30
- <Dialog {...props}>
31
- <DialogContent className="overflow-hidden p-0 shadow-lg">
32
- <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">
33
- {children}
34
- </Command>
35
- </DialogContent>
36
- </Dialog>
37
- );
38
- };
39
-
40
- const CommandInput = ({
41
- className,
42
- ref,
43
- ...props
44
- }: React.ComponentProps<typeof CommandPrimitive.Input>) => (
45
- <div className="flex items-center border-b px-3" cmdk-input-wrapper="">
46
- <Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
47
- <CommandPrimitive.Input
48
- className={cn(
49
- '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',
50
- className,
51
- )}
52
- ref={ref}
53
- {...props}
54
- />
55
- </div>
56
- );
57
-
58
- CommandInput.displayName = CommandPrimitive.Input.displayName;
59
-
60
- const CommandList = ({
61
- className,
62
- ...props
63
- }: React.ComponentProps<typeof CommandPrimitive.List>) => (
64
- <CommandPrimitive.List
65
- className={cn(
66
- 'max-h-[300px] scroll-pt-0 overflow-x-hidden overflow-y-auto scroll-auto',
67
- className,
68
- )}
69
- {...props}
70
- />
71
- );
72
-
73
- CommandList.displayName = CommandPrimitive.List.displayName;
74
-
75
- const CommandEmpty = ({
76
- className,
77
- ...props
78
- }: React.ComponentProps<typeof CommandPrimitive.Empty>) => (
79
- <CommandPrimitive.Empty className="py-6 text-center text-sm" {...props} />
80
- );
81
-
82
- CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
83
-
84
- const CommandGroup = ({
85
- className,
86
- ...props
87
- }: React.ComponentProps<typeof CommandPrimitive.Group>) => (
88
- <CommandPrimitive.Group
89
- className={cn(
90
- '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',
91
- className,
92
- )}
93
- {...props}
94
- />
95
- );
96
-
97
- CommandGroup.displayName = CommandPrimitive.Group.displayName;
98
-
99
- const CommandSeparator = ({
100
- className,
101
- ...props
102
- }: React.ComponentProps<typeof CommandPrimitive.Separator>) => (
103
- <CommandPrimitive.Separator
104
- className={cn('bg-divider -mx-1 h-px', className)}
105
- {...props}
106
- />
107
- );
108
- CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
109
-
110
- const CommandItem = ({
111
- className,
112
- ...props
113
- }: React.ComponentProps<typeof CommandPrimitive.Item>) => (
114
- <CommandPrimitive.Item
115
- className={cn(
116
- "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",
117
- className,
118
- )}
119
- {...props}
120
- />
121
- );
122
-
123
- CommandItem.displayName = CommandPrimitive.Item.displayName;
124
-
125
- const CommandShortcut = ({
126
- className,
127
- ...props
128
- }: React.HTMLAttributes<HTMLSpanElement>) => {
129
- return (
130
- <span
131
- className={cn(
132
- 'text-text-secondary ml-auto text-xs tracking-widest',
133
- className,
134
- )}
135
- {...props}
136
- />
137
- );
138
- };
139
- CommandShortcut.displayName = 'CommandShortcut';
140
-
141
- export {
142
- Command,
143
- CommandDialog,
144
- CommandInput,
145
- CommandList,
146
- CommandEmpty,
147
- CommandGroup,
148
- CommandItem,
149
- CommandShortcut,
150
- CommandSeparator,
151
- };