@tscircuit/fake-snippets 0.0.120 → 0.0.122

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 (612) hide show
  1. package/dist/bundle.js +1 -2
  2. package/package.json +4 -1
  3. package/.github/CODEOWNERS +0 -1
  4. package/.github/workflows/bun-formatcheck.yml +0 -26
  5. package/.github/workflows/bun-pver-release.yml +0 -28
  6. package/.github/workflows/bun-test.yml +0 -28
  7. package/.github/workflows/bun-typecheck.yml +0 -26
  8. package/.github/workflows/bundle-size-analysis.yml +0 -79
  9. package/.github/workflows/stale.yml +0 -40
  10. package/.github/workflows/update-package.yml +0 -58
  11. package/.github/workflows/update-snapshots.yml +0 -49
  12. package/CLAUDE.md +0 -92
  13. package/CONTRIBUTING.md +0 -59
  14. package/api/generated-index.js +0 -456
  15. package/biome.json +0 -67
  16. package/bun-tests/fake-snippets-api/fixtures/get-test-server.ts +0 -141
  17. package/bun-tests/fake-snippets-api/fixtures/preload.ts +0 -18
  18. package/bun-tests/fake-snippets-api/fixtures/start-server.ts +0 -48
  19. package/bun-tests/fake-snippets-api/routes/accounts/get.test.ts +0 -64
  20. package/bun-tests/fake-snippets-api/routes/accounts/get_account_balance.test.ts +0 -14
  21. package/bun-tests/fake-snippets-api/routes/ai_reviews/create.test.ts +0 -21
  22. package/bun-tests/fake-snippets-api/routes/ai_reviews/get.test.ts +0 -16
  23. package/bun-tests/fake-snippets-api/routes/ai_reviews/list.test.ts +0 -14
  24. package/bun-tests/fake-snippets-api/routes/ai_reviews/process_review.test.ts +0 -16
  25. package/bun-tests/fake-snippets-api/routes/bug_reports/create.test.ts +0 -37
  26. package/bun-tests/fake-snippets-api/routes/bug_reports/upload_file.test.ts +0 -89
  27. package/bun-tests/fake-snippets-api/routes/datasheets/create.test.ts +0 -16
  28. package/bun-tests/fake-snippets-api/routes/datasheets/get.test.ts +0 -54
  29. package/bun-tests/fake-snippets-api/routes/datasheets/list.test.ts +0 -49
  30. package/bun-tests/fake-snippets-api/routes/datasheets/process_all_datasheets.test.ts +0 -22
  31. package/bun-tests/fake-snippets-api/routes/datasheets/run_async_tasks.test.ts +0 -19
  32. package/bun-tests/fake-snippets-api/routes/health.test.ts +0 -9
  33. package/bun-tests/fake-snippets-api/routes/order_files/get.test.ts +0 -48
  34. package/bun-tests/fake-snippets-api/routes/order_files/upload.test.ts +0 -77
  35. package/bun-tests/fake-snippets-api/routes/order_quotes/create.test.ts +0 -33
  36. package/bun-tests/fake-snippets-api/routes/orders/create.test.ts +0 -17
  37. package/bun-tests/fake-snippets-api/routes/orders/get.test.ts +0 -199
  38. package/bun-tests/fake-snippets-api/routes/orders/list.test.ts +0 -30
  39. package/bun-tests/fake-snippets-api/routes/orgs/add_member.test.ts +0 -26
  40. package/bun-tests/fake-snippets-api/routes/orgs/create.test.ts +0 -37
  41. package/bun-tests/fake-snippets-api/routes/orgs/get.test.ts +0 -53
  42. package/bun-tests/fake-snippets-api/routes/orgs/get_member.test.ts +0 -110
  43. package/bun-tests/fake-snippets-api/routes/orgs/list.test.ts +0 -17
  44. package/bun-tests/fake-snippets-api/routes/orgs/list_members.test.ts +0 -24
  45. package/bun-tests/fake-snippets-api/routes/orgs/remove_member.test.ts +0 -81
  46. package/bun-tests/fake-snippets-api/routes/orgs/update.test.ts +0 -151
  47. package/bun-tests/fake-snippets-api/routes/package_builds/get.test.ts +0 -279
  48. package/bun-tests/fake-snippets-api/routes/package_builds/list.test.ts +0 -292
  49. package/bun-tests/fake-snippets-api/routes/package_files/create.test.ts +0 -320
  50. package/bun-tests/fake-snippets-api/routes/package_files/create_or_update.test.ts +0 -603
  51. package/bun-tests/fake-snippets-api/routes/package_files/delete.test.ts +0 -233
  52. package/bun-tests/fake-snippets-api/routes/package_files/download.test.ts +0 -248
  53. package/bun-tests/fake-snippets-api/routes/package_files/get.test.ts +0 -230
  54. package/bun-tests/fake-snippets-api/routes/package_files/list.test.ts +0 -212
  55. package/bun-tests/fake-snippets-api/routes/package_releases/create.test.ts +0 -171
  56. package/bun-tests/fake-snippets-api/routes/package_releases/get.test.ts +0 -181
  57. package/bun-tests/fake-snippets-api/routes/package_releases/get_image_generation_fields.test.ts +0 -38
  58. package/bun-tests/fake-snippets-api/routes/package_releases/list.test.ts +0 -149
  59. package/bun-tests/fake-snippets-api/routes/package_releases/update.test.ts +0 -160
  60. package/bun-tests/fake-snippets-api/routes/packages/add_star.test.ts +0 -129
  61. package/bun-tests/fake-snippets-api/routes/packages/create.test.ts +0 -67
  62. package/bun-tests/fake-snippets-api/routes/packages/delete.test.ts +0 -74
  63. package/bun-tests/fake-snippets-api/routes/packages/fork.test.ts +0 -132
  64. package/bun-tests/fake-snippets-api/routes/packages/get.test.ts +0 -112
  65. package/bun-tests/fake-snippets-api/routes/packages/images.test.ts +0 -72
  66. package/bun-tests/fake-snippets-api/routes/packages/list-1.test.ts +0 -145
  67. package/bun-tests/fake-snippets-api/routes/packages/list-2.test.ts +0 -48
  68. package/bun-tests/fake-snippets-api/routes/packages/list_latest.test.ts +0 -110
  69. package/bun-tests/fake-snippets-api/routes/packages/list_trending.test.ts +0 -103
  70. package/bun-tests/fake-snippets-api/routes/packages/remove_star.test.ts +0 -131
  71. package/bun-tests/fake-snippets-api/routes/packages/update.test.ts +0 -217
  72. package/bun-tests/fake-snippets-api/routes/proxy.test.ts +0 -42
  73. package/bun.lock +0 -2724
  74. package/bunfig.toml +0 -3
  75. package/components.json +0 -20
  76. package/docs/CIRCUIT_JSON_SOURCE_COMPONENT_OVERVIEW.md +0 -151
  77. package/fake-snippets-api/README.md +0 -6
  78. package/fake-snippets-api/biome.json +0 -47
  79. package/fake-snippets-api/bun.lockb +0 -0
  80. package/fake-snippets-api/lib/db/autoload-dev-packages.ts +0 -222
  81. package/fake-snippets-api/lib/db/autoload-packages.json +0 -8
  82. package/fake-snippets-api/lib/db/db-client.ts +0 -1857
  83. package/fake-snippets-api/lib/db/schema.ts +0 -502
  84. package/fake-snippets-api/lib/db/seed.ts +0 -1843
  85. package/fake-snippets-api/lib/index.ts +0 -3
  86. package/fake-snippets-api/lib/middleware/with-ctx-error.ts +0 -26
  87. package/fake-snippets-api/lib/middleware/with-db.ts +0 -15
  88. package/fake-snippets-api/lib/middleware/with-error-handling.ts +0 -24
  89. package/fake-snippets-api/lib/middleware/with-optional-session-auth.ts +0 -53
  90. package/fake-snippets-api/lib/middleware/with-request-logging.ts +0 -54
  91. package/fake-snippets-api/lib/middleware/with-session-auth.ts +0 -102
  92. package/fake-snippets-api/lib/middleware/with-winter-spec.ts +0 -24
  93. package/fake-snippets-api/lib/package_file/generate-fs-sha.ts +0 -20
  94. package/fake-snippets-api/lib/package_file/get-package-file-id-from-file-descriptor.ts +0 -173
  95. package/fake-snippets-api/lib/package_release/find-package-release-id.ts +0 -120
  96. package/fake-snippets-api/lib/public-mapping/public-map-org.ts +0 -34
  97. package/fake-snippets-api/lib/public-mapping/public-map-package-build.ts +0 -48
  98. package/fake-snippets-api/lib/public-mapping/public-map-package-release.ts +0 -88
  99. package/fake-snippets-api/lib/public-mapping/public-map-package.ts +0 -60
  100. package/fake-snippets-api/lib/with-winter-spec.ts +0 -1
  101. package/fake-snippets-api/next-env.d.ts +0 -5
  102. package/fake-snippets-api/routes/api/_fake/ai_reviews/process_review.ts +0 -31
  103. package/fake-snippets-api/routes/api/_fake/datasheets/process_all_datasheets.ts +0 -38
  104. package/fake-snippets-api/routes/api/_fake/db.ts +0 -11
  105. package/fake-snippets-api/routes/api/_fake/move_orders_forward.ts +0 -65
  106. package/fake-snippets-api/routes/api/_fake/received_quotes.ts +0 -112
  107. package/fake-snippets-api/routes/api/_fake/run_async_tasks.ts +0 -12
  108. package/fake-snippets-api/routes/api/_fake/seed.ts +0 -13
  109. package/fake-snippets-api/routes/api/accounts/get.ts +0 -35
  110. package/fake-snippets-api/routes/api/accounts/get_account_balance.ts +0 -22
  111. package/fake-snippets-api/routes/api/accounts/search.ts +0 -20
  112. package/fake-snippets-api/routes/api/accounts/update.ts +0 -32
  113. package/fake-snippets-api/routes/api/ai/[...anyroute].ts +0 -31
  114. package/fake-snippets-api/routes/api/ai.ts +0 -2
  115. package/fake-snippets-api/routes/api/ai_reviews/create.ts +0 -44
  116. package/fake-snippets-api/routes/api/ai_reviews/get.ts +0 -24
  117. package/fake-snippets-api/routes/api/ai_reviews/list.ts +0 -14
  118. package/fake-snippets-api/routes/api/aistream/[...anyroute].ts +0 -65
  119. package/fake-snippets-api/routes/api/autocomplete/create_autocomplete.ts +0 -16
  120. package/fake-snippets-api/routes/api/bug_reports/create.ts +0 -43
  121. package/fake-snippets-api/routes/api/bug_reports/upload_file.ts +0 -113
  122. package/fake-snippets-api/routes/api/datasheets/create.ts +0 -18
  123. package/fake-snippets-api/routes/api/datasheets/get.ts +0 -35
  124. package/fake-snippets-api/routes/api/datasheets/list.ts +0 -29
  125. package/fake-snippets-api/routes/api/github/installations/create_new_installation_redirect.ts +0 -75
  126. package/fake-snippets-api/routes/api/github/repos/list_available.ts +0 -91
  127. package/fake-snippets-api/routes/api/github/repos/refresh.ts +0 -44
  128. package/fake-snippets-api/routes/api/health.ts +0 -9
  129. package/fake-snippets-api/routes/api/internal/sessions/create_without_auth.ts +0 -63
  130. package/fake-snippets-api/routes/api/order_files/get.ts +0 -28
  131. package/fake-snippets-api/routes/api/order_files/upload.ts +0 -46
  132. package/fake-snippets-api/routes/api/order_quotes/create.ts +0 -60
  133. package/fake-snippets-api/routes/api/order_quotes/create_all_vendor_quotes.ts +0 -30
  134. package/fake-snippets-api/routes/api/order_quotes/get.ts +0 -29
  135. package/fake-snippets-api/routes/api/orders/create.ts +0 -70
  136. package/fake-snippets-api/routes/api/orders/get.ts +0 -168
  137. package/fake-snippets-api/routes/api/orders/list.ts +0 -15
  138. package/fake-snippets-api/routes/api/orgs/add_member.ts +0 -52
  139. package/fake-snippets-api/routes/api/orgs/create.ts +0 -48
  140. package/fake-snippets-api/routes/api/orgs/get.ts +0 -39
  141. package/fake-snippets-api/routes/api/orgs/get_member.ts +0 -67
  142. package/fake-snippets-api/routes/api/orgs/list.ts +0 -31
  143. package/fake-snippets-api/routes/api/orgs/list_members.ts +0 -106
  144. package/fake-snippets-api/routes/api/orgs/remove_member.ts +0 -46
  145. package/fake-snippets-api/routes/api/orgs/update.ts +0 -118
  146. package/fake-snippets-api/routes/api/package_builds/get.ts +0 -70
  147. package/fake-snippets-api/routes/api/package_builds/list.ts +0 -97
  148. package/fake-snippets-api/routes/api/package_files/create.ts +0 -135
  149. package/fake-snippets-api/routes/api/package_files/create_or_update.ts +0 -194
  150. package/fake-snippets-api/routes/api/package_files/delete.ts +0 -109
  151. package/fake-snippets-api/routes/api/package_files/download.ts +0 -87
  152. package/fake-snippets-api/routes/api/package_files/get.ts +0 -68
  153. package/fake-snippets-api/routes/api/package_files/list.ts +0 -54
  154. package/fake-snippets-api/routes/api/package_releases/create.ts +0 -109
  155. package/fake-snippets-api/routes/api/package_releases/get.ts +0 -137
  156. package/fake-snippets-api/routes/api/package_releases/list.ts +0 -85
  157. package/fake-snippets-api/routes/api/package_releases/rebuild.ts +0 -66
  158. package/fake-snippets-api/routes/api/package_releases/update.ts +0 -122
  159. package/fake-snippets-api/routes/api/packages/add_star.ts +0 -84
  160. package/fake-snippets-api/routes/api/packages/create.ts +0 -136
  161. package/fake-snippets-api/routes/api/packages/delete.ts +0 -41
  162. package/fake-snippets-api/routes/api/packages/fork.ts +0 -165
  163. package/fake-snippets-api/routes/api/packages/generate_from_jlcpcb.ts +0 -111
  164. package/fake-snippets-api/routes/api/packages/get.ts +0 -81
  165. package/fake-snippets-api/routes/api/packages/images/[owner_github_username]/[unscoped_name]/[view_format].ts +0 -119
  166. package/fake-snippets-api/routes/api/packages/list.ts +0 -105
  167. package/fake-snippets-api/routes/api/packages/list_latest.ts +0 -29
  168. package/fake-snippets-api/routes/api/packages/list_trending.ts +0 -43
  169. package/fake-snippets-api/routes/api/packages/remove_star.ts +0 -70
  170. package/fake-snippets-api/routes/api/packages/search.ts +0 -19
  171. package/fake-snippets-api/routes/api/packages/update.ts +0 -112
  172. package/fake-snippets-api/routes/api/packages/update_ai_description.ts +0 -37
  173. package/fake-snippets-api/routes/api/proxy.ts +0 -128
  174. package/fake-snippets-api/routes/api/snippets/add_star.ts +0 -62
  175. package/fake-snippets-api/routes/api/snippets/create.ts +0 -184
  176. package/fake-snippets-api/routes/api/snippets/delete.ts +0 -41
  177. package/fake-snippets-api/routes/api/snippets/download.ts +0 -162
  178. package/fake-snippets-api/routes/api/snippets/generate_from_jlcpcb.ts +0 -48
  179. package/fake-snippets-api/routes/api/snippets/get.ts +0 -83
  180. package/fake-snippets-api/routes/api/snippets/get_image.ts +0 -65
  181. package/fake-snippets-api/routes/api/snippets/images/[author]/[snippet_name]/[typeFormat].ts +0 -80
  182. package/fake-snippets-api/routes/api/snippets/list.ts +0 -151
  183. package/fake-snippets-api/routes/api/snippets/list_latest.ts +0 -13
  184. package/fake-snippets-api/routes/api/snippets/list_trending.ts +0 -38
  185. package/fake-snippets-api/routes/api/snippets/remove_star.ts +0 -42
  186. package/fake-snippets-api/routes/api/snippets/search.ts +0 -18
  187. package/fake-snippets-api/routes/api/snippets/update.ts +0 -114
  188. package/fake-snippets-api/utils/normalizeProjectFilePath.ts +0 -60
  189. package/fake-snippets-api/utils/order-steps.ts +0 -20
  190. package/favicon.ico +0 -0
  191. package/index.html +0 -125
  192. package/landing.html +0 -23
  193. package/playwright-tests/ai-page.spec.ts +0 -19
  194. package/playwright-tests/circuit-json-import.spec.ts +0 -133
  195. package/playwright-tests/cmd-click.spec.ts +0 -43
  196. package/playwright-tests/dashboard-page.spec.ts +0 -10
  197. package/playwright-tests/editor-page.spec.ts +0 -15
  198. package/playwright-tests/exampleCircuitJson.ts +0 -498
  199. package/playwright-tests/files-dialog.spec.ts +0 -19
  200. package/playwright-tests/footprint-dialog/footprint-dialog.spec.ts +0 -27
  201. package/playwright-tests/footprint-dialog/footprint-insertion.spec.ts +0 -38
  202. package/playwright-tests/footprint-dialog/footprint-preview.spec.ts +0 -34
  203. package/playwright-tests/footprint-dialog/footprint-selection.spec.ts +0 -29
  204. package/playwright-tests/handle-manual-edits.spec.ts +0 -55
  205. package/playwright-tests/home-page.spec.ts +0 -10
  206. package/playwright-tests/images.spec.ts +0 -17
  207. package/playwright-tests/manual-edits.spec.ts +0 -89
  208. package/playwright-tests/preview-page.spec.ts +0 -7
  209. package/playwright-tests/profile-page.spec.ts +0 -108
  210. package/playwright-tests/quickstart-page.spec.ts +0 -10
  211. package/playwright-tests/search-links.spec.ts +0 -21
  212. package/playwright-tests/search.spec.ts +0 -27
  213. package/playwright-tests/snapshots/ai-page.spec.ts-AI-Page-lg.png +0 -0
  214. package/playwright-tests/snapshots/ai-page.spec.ts-AI-Page-md.png +0 -0
  215. package/playwright-tests/snapshots/ai-page.spec.ts-AI-Page-xs.png +0 -0
  216. package/playwright-tests/snapshots/cmd-click.spec.ts-underlined-imports.png +0 -0
  217. package/playwright-tests/snapshots/dashboard-page.spec.ts-Dashboard-page-lg.png +0 -0
  218. package/playwright-tests/snapshots/dashboard-page.spec.ts-Dashboard-page-md.png +0 -0
  219. package/playwright-tests/snapshots/dashboard-page.spec.ts-Dashboard-page-xs.png +0 -0
  220. package/playwright-tests/snapshots/editor-page.spec.ts-editor-with-snippet.png +0 -0
  221. package/playwright-tests/snapshots/error-fallback.spec.ts-error-fallback-lg.png +0 -0
  222. package/playwright-tests/snapshots/error-fallback.spec.ts-error-fallback-md.png +0 -0
  223. package/playwright-tests/snapshots/error-fallback.spec.ts-error-fallback-xs.png +0 -0
  224. package/playwright-tests/snapshots/files-dialog.spec.ts-view-snippet-files.png +0 -0
  225. package/playwright-tests/snapshots/footprint-dialog/footprint-dialog.spec.ts-footprint-preview-lg.png +0 -0
  226. package/playwright-tests/snapshots/footprint-dialog/footprint-dialog.spec.ts-footprint-preview-md.png +0 -0
  227. package/playwright-tests/snapshots/footprint-dialog/footprint-dialog.spec.ts-footprint-preview-xs.png +0 -0
  228. package/playwright-tests/snapshots/footprint-dialog/footprint-insertion.spec.ts-footprint-insertion-lg.png +0 -0
  229. package/playwright-tests/snapshots/footprint-dialog/footprint-insertion.spec.ts-footprint-insertion-md.png +0 -0
  230. package/playwright-tests/snapshots/footprint-dialog/footprint-insertion.spec.ts-footprint-insertion-xs.png +0 -0
  231. package/playwright-tests/snapshots/footprint-dialog/footprint-preview.spec.ts-footprint-preview-lg.png +0 -0
  232. package/playwright-tests/snapshots/footprint-dialog/footprint-preview.spec.ts-footprint-preview-md.png +0 -0
  233. package/playwright-tests/snapshots/footprint-dialog/footprint-preview.spec.ts-footprint-preview-xs.png +0 -0
  234. package/playwright-tests/snapshots/footprint-dialog/footprint-selection.spec.ts-footprint-preview-lg.png +0 -0
  235. package/playwright-tests/snapshots/footprint-dialog/footprint-selection.spec.ts-footprint-preview-md.png +0 -0
  236. package/playwright-tests/snapshots/footprint-dialog/footprint-selection.spec.ts-footprint-preview-xs.png +0 -0
  237. package/playwright-tests/snapshots/handle-manual-edits.spec.ts-handle-manual-edits.png +0 -0
  238. package/playwright-tests/snapshots/home-page.spec.ts-Home-page-lg.png +0 -0
  239. package/playwright-tests/snapshots/home-page.spec.ts-Home-page-md.png +0 -0
  240. package/playwright-tests/snapshots/home-page.spec.ts-Home-page-xs.png +0 -0
  241. package/playwright-tests/snapshots/images.spec.ts-pcb-image.png +0 -0
  242. package/playwright-tests/snapshots/images.spec.ts-schematic-image.png +0 -0
  243. package/playwright-tests/snapshots/manual-edits.spec.ts-editor-manual-edits.png +0 -0
  244. package/playwright-tests/snapshots/manual-edits.spec.ts-manual-edits-view.png +0 -0
  245. package/playwright-tests/snapshots/preview-page.spec.ts-preview-snippet-pcb.png +0 -0
  246. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-before-delete.png +0 -0
  247. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-delete-dialog.png +0 -0
  248. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-dropdown-open.png +0 -0
  249. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-snippets-tab.png +0 -0
  250. package/playwright-tests/snapshots/profile-page.spec.ts-profile-page-starred-tab.png +0 -0
  251. package/playwright-tests/snapshots/profile-page.spec.ts-snippet-page-open-after-star-click.png +0 -0
  252. package/playwright-tests/snapshots/quickstart-page.spec.ts-Quickstart-Pagelg.png +0 -0
  253. package/playwright-tests/snapshots/quickstart-page.spec.ts-Quickstart-Pagemd.png +0 -0
  254. package/playwright-tests/snapshots/quickstart-page.spec.ts-Quickstart-Pagexs.png +0 -0
  255. package/playwright-tests/snapshots/search-links.spec.ts-search-links.png +0 -0
  256. package/playwright-tests/snapshots/search.spec.ts-search-lg.png +0 -0
  257. package/playwright-tests/snapshots/search.spec.ts-search-md.png +0 -0
  258. package/playwright-tests/snapshots/search.spec.ts-search-xs.png +0 -0
  259. package/playwright-tests/snapshots/star.spec.ts-remove-star-button.png +0 -0
  260. package/playwright-tests/snapshots/star.spec.ts-star-button.png +0 -0
  261. package/playwright-tests/snapshots/update-description.spec.ts-update-description.png +0 -0
  262. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-after-lg.png +0 -0
  263. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-after-md.png +0 -0
  264. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-after-xs.png +0 -0
  265. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-before-lg.png +0 -0
  266. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-before-md.png +0 -0
  267. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-before-xs.png +0 -0
  268. package/playwright-tests/snapshots/view-snippet.spec.ts-view-snippet-files.png +0 -0
  269. package/playwright-tests/star.spec.ts +0 -40
  270. package/playwright-tests/update-description.spec.ts +0 -18
  271. package/playwright-tests/view-snippet.spec.ts +0 -35
  272. package/playwright-tests/viewports.ts +0 -5
  273. package/playwright.config.ts +0 -27
  274. package/postcss.config.js +0 -6
  275. package/public/robots.txt +0 -9
  276. package/renovate.json +0 -25
  277. package/scripts/generate-image-sizes.ts +0 -57
  278. package/scripts/generate-sitemap.ts +0 -103
  279. package/scripts/generate_bundle_stats.js +0 -208
  280. package/scripts/snapshot.ts +0 -35
  281. package/src/App.tsx +0 -314
  282. package/src/ContextProviders.tsx +0 -94
  283. package/src/assets/originals/editor_example_1.webp +0 -0
  284. package/src/assets/originals/editor_example_1_more_square.webp +0 -0
  285. package/src/assets/originals/editor_example_2.webp +0 -0
  286. package/src/assets/originals/example_schematic.webp +0 -0
  287. package/src/components/AiChatMessage.tsx +0 -86
  288. package/src/components/Analytics.tsx +0 -23
  289. package/src/components/BomTable.tsx +0 -69
  290. package/src/components/ChatInput.tsx +0 -53
  291. package/src/components/CircuitJsonImportDialog.tsx +0 -269
  292. package/src/components/CircuitToSvgWithMouseControl.tsx +0 -78
  293. package/src/components/CmdKMenu.tsx +0 -809
  294. package/src/components/CreateNewSnippetWithAiHero.tsx +0 -81
  295. package/src/components/CreateReleaseDialog.tsx +0 -124
  296. package/src/components/DownloadButtonAndMenu.tsx +0 -443
  297. package/src/components/ErrorFallback.tsx +0 -25
  298. package/src/components/ErrorOutline.tsx +0 -35
  299. package/src/components/ErrorTabContent.tsx +0 -122
  300. package/src/components/ExpandableText.tsx +0 -29
  301. package/src/components/FAQ.tsx +0 -189
  302. package/src/components/FileSidebar.tsx +0 -271
  303. package/src/components/Footer.tsx +0 -144
  304. package/src/components/GithubAvatarWithFallback.tsx +0 -35
  305. package/src/components/Header.tsx +0 -202
  306. package/src/components/Header2.tsx +0 -202
  307. package/src/components/HeaderDropdown.tsx +0 -88
  308. package/src/components/HeaderLogin.tsx +0 -105
  309. package/src/components/HiddenFilesDropdown.tsx +0 -42
  310. package/src/components/ImageWithFallback.tsx +0 -37
  311. package/src/components/LatestSnippets.tsx +0 -39
  312. package/src/components/NotFound.tsx +0 -37
  313. package/src/components/OptimizedImage.tsx +0 -100
  314. package/src/components/PackageBreadcrumb.tsx +0 -105
  315. package/src/components/PackageBuildsPage/ErrorObject.ts +0 -12
  316. package/src/components/PackageBuildsPage/capitalCase.ts +0 -4
  317. package/src/components/PackageBuildsPage/getColorForDisplayStatus.ts +0 -17
  318. package/src/components/PackageCard.tsx +0 -191
  319. package/src/components/PackageCardSkeleton.tsx +0 -17
  320. package/src/components/PackageLink.tsx +0 -29
  321. package/src/components/PackageSearchResults.tsx +0 -81
  322. package/src/components/PackagesList.tsx +0 -71
  323. package/src/components/PcbViewerWithContainerHeight.tsx +0 -47
  324. package/src/components/PrefetchPageLink.tsx +0 -114
  325. package/src/components/PreviewEmptyState.tsx +0 -16
  326. package/src/components/ProfileRouter.tsx +0 -30
  327. package/src/components/RunButton.tsx +0 -27
  328. package/src/components/SearchComponent.tsx +0 -282
  329. package/src/components/SentryNotFoundReporter.tsx +0 -44
  330. package/src/components/SnippetTypeIcon.tsx +0 -60
  331. package/src/components/StaticPreviewContent.tsx +0 -89
  332. package/src/components/StaticViewSnippetSidebar.tsx +0 -100
  333. package/src/components/SuspenseRunFrame.tsx +0 -28
  334. package/src/components/TableViewer/CircuitJsonTableViewer.tsx +0 -316
  335. package/src/components/TableViewer/ClickableText.tsx +0 -21
  336. package/src/components/TableViewer/HeaderCell.tsx +0 -27
  337. package/src/components/TableViewer/Modal.tsx +0 -39
  338. package/src/components/TrendingPackagesCarousel.tsx +0 -79
  339. package/src/components/TypeBadge.tsx +0 -31
  340. package/src/components/UserCard.tsx +0 -80
  341. package/src/components/ViewPackagePage/components/ShikiCodeViewer.tsx +0 -49
  342. package/src/components/ViewPackagePage/components/build-status.tsx +0 -38
  343. package/src/components/ViewPackagePage/components/important-files-view.tsx +0 -611
  344. package/src/components/ViewPackagePage/components/main-content-header.tsx +0 -181
  345. package/src/components/ViewPackagePage/components/main-content-view-selector.tsx +0 -167
  346. package/src/components/ViewPackagePage/components/markdown-viewer.tsx +0 -88
  347. package/src/components/ViewPackagePage/components/mobile-sidebar.tsx +0 -301
  348. package/src/components/ViewPackagePage/components/package-header.tsx +0 -264
  349. package/src/components/ViewPackagePage/components/preview-image-squares.tsx +0 -47
  350. package/src/components/ViewPackagePage/components/repo-page-content.tsx +0 -266
  351. package/src/components/ViewPackagePage/components/sidebar-about-section.tsx +0 -223
  352. package/src/components/ViewPackagePage/components/sidebar-packages-section.tsx +0 -16
  353. package/src/components/ViewPackagePage/components/sidebar-releases-section.tsx +0 -126
  354. package/src/components/ViewPackagePage/components/sidebar.tsx +0 -29
  355. package/src/components/ViewPackagePage/components/tab-views/3d-view.tsx +0 -43
  356. package/src/components/ViewPackagePage/components/tab-views/bom-view.tsx +0 -30
  357. package/src/components/ViewPackagePage/components/tab-views/files-view.tsx +0 -295
  358. package/src/components/ViewPackagePage/components/tab-views/pcb-view.tsx +0 -35
  359. package/src/components/ViewPackagePage/components/tab-views/schematic-view.tsx +0 -38
  360. package/src/components/ViewPackagePage/components/theme-toggle.tsx +0 -40
  361. package/src/components/ViewPackagePage/hooks/use-current-package-circuit-json.ts +0 -46
  362. package/src/components/ViewPackagePage/hooks/use-mobile.tsx +0 -19
  363. package/src/components/ViewPackagePage/hooks/use-toast.tsx +0 -69
  364. package/src/components/ViewPackagePage/utils/fuzz-search.ts +0 -121
  365. package/src/components/ViewPackagePage/utils/get-license-content.ts +0 -119
  366. package/src/components/ViewPackagePage/utils/is-hidden-file.ts +0 -55
  367. package/src/components/ViewPackagePage/utils/is-package-file-important.ts +0 -35
  368. package/src/components/ViewPackagePage/utils/is-within-directory.ts +0 -32
  369. package/src/components/dialogs/GitHubRepositorySelector.tsx +0 -300
  370. package/src/components/dialogs/confirm-delete-package-dialog.tsx +0 -74
  371. package/src/components/dialogs/confirm-discard-changes-dialog.tsx +0 -73
  372. package/src/components/dialogs/create-use-dialog.tsx +0 -40
  373. package/src/components/dialogs/edit-description-dialog.tsx +0 -96
  374. package/src/components/dialogs/edit-package-details-dialog.tsx +0 -474
  375. package/src/components/dialogs/files-dialog.tsx +0 -70
  376. package/src/components/dialogs/import-component-dialog.tsx +0 -32
  377. package/src/components/dialogs/import-package-dialog.tsx +0 -90
  378. package/src/components/dialogs/new-package-save-prompt-dialog.tsx +0 -199
  379. package/src/components/dialogs/package-visibility-settings-dialog.tsx +0 -93
  380. package/src/components/dialogs/pcb-download-dialog.tsx +0 -113
  381. package/src/components/dialogs/rename-package-dialog.tsx +0 -86
  382. package/src/components/dialogs/rename-snippet-dialog.tsx +0 -81
  383. package/src/components/dialogs/update-package-description-dialog.tsx +0 -96
  384. package/src/components/dialogs/view-ts-files-dialog.tsx +0 -664
  385. package/src/components/organization/OrganizationCard.tsx +0 -202
  386. package/src/components/organization/OrganizationCardSkeleton.tsx +0 -55
  387. package/src/components/organization/OrganizationHeader.tsx +0 -140
  388. package/src/components/organization/OrganizationMembers.tsx +0 -117
  389. package/src/components/package-port/CodeAndPreview.tsx +0 -253
  390. package/src/components/package-port/CodeEditor.tsx +0 -866
  391. package/src/components/package-port/CodeEditorHeader.tsx +0 -427
  392. package/src/components/package-port/EditorNav.tsx +0 -606
  393. package/src/components/package-port/GlobalFindReplace.tsx +0 -681
  394. package/src/components/package-port/QuickOpen.tsx +0 -241
  395. package/src/components/preview/BuildsList.tsx +0 -237
  396. package/src/components/preview/ConnectedPackagesList.tsx +0 -229
  397. package/src/components/preview/ConnectedRepoOverview.tsx +0 -588
  398. package/src/components/preview/PackageReleasesDashboard.tsx +0 -228
  399. package/src/components/preview/index.tsx +0 -54
  400. package/src/components/ui/accordion.tsx +0 -55
  401. package/src/components/ui/alert-dialog.tsx +0 -139
  402. package/src/components/ui/alert.tsx +0 -59
  403. package/src/components/ui/aspect-ratio.tsx +0 -5
  404. package/src/components/ui/avatar.tsx +0 -48
  405. package/src/components/ui/badge.tsx +0 -36
  406. package/src/components/ui/breadcrumb.tsx +0 -118
  407. package/src/components/ui/button.tsx +0 -58
  408. package/src/components/ui/calendar.tsx +0 -73
  409. package/src/components/ui/card.tsx +0 -76
  410. package/src/components/ui/carousel.tsx +0 -260
  411. package/src/components/ui/chart.tsx +0 -363
  412. package/src/components/ui/checkbox.tsx +0 -28
  413. package/src/components/ui/collapsible.tsx +0 -9
  414. package/src/components/ui/combobox.tsx +0 -178
  415. package/src/components/ui/command.tsx +0 -151
  416. package/src/components/ui/context-menu.tsx +0 -202
  417. package/src/components/ui/dialog.tsx +0 -120
  418. package/src/components/ui/drawer.tsx +0 -116
  419. package/src/components/ui/dropdown-menu.tsx +0 -203
  420. package/src/components/ui/form.tsx +0 -182
  421. package/src/components/ui/hover-card.tsx +0 -27
  422. package/src/components/ui/input.tsx +0 -25
  423. package/src/components/ui/label.tsx +0 -24
  424. package/src/components/ui/menubar.tsx +0 -238
  425. package/src/components/ui/navigation-menu.tsx +0 -129
  426. package/src/components/ui/pagination.tsx +0 -121
  427. package/src/components/ui/popover.tsx +0 -31
  428. package/src/components/ui/progress.tsx +0 -26
  429. package/src/components/ui/radio-group.tsx +0 -42
  430. package/src/components/ui/resizable.tsx +0 -43
  431. package/src/components/ui/role-badge.tsx +0 -27
  432. package/src/components/ui/scroll-area.tsx +0 -46
  433. package/src/components/ui/searchable-select.tsx +0 -94
  434. package/src/components/ui/select.tsx +0 -162
  435. package/src/components/ui/separator.tsx +0 -29
  436. package/src/components/ui/sheet.tsx +0 -141
  437. package/src/components/ui/skeleton.tsx +0 -18
  438. package/src/components/ui/slider.tsx +0 -26
  439. package/src/components/ui/sonner.tsx +0 -30
  440. package/src/components/ui/switch.tsx +0 -27
  441. package/src/components/ui/table.tsx +0 -120
  442. package/src/components/ui/tabs.tsx +0 -53
  443. package/src/components/ui/textarea.tsx +0 -24
  444. package/src/components/ui/toast.tsx +0 -128
  445. package/src/components/ui/toaster.tsx +0 -1
  446. package/src/components/ui/toggle-group.tsx +0 -59
  447. package/src/components/ui/toggle.tsx +0 -43
  448. package/src/components/ui/tooltip.tsx +0 -28
  449. package/src/components/ui/tree-view.tsx +0 -563
  450. package/src/entry-server.tsx +0 -12
  451. package/src/hooks/use-account-balance.ts +0 -25
  452. package/src/hooks/use-add-org-member-mutation.ts +0 -51
  453. package/src/hooks/use-ai-api.ts +0 -35
  454. package/src/hooks/use-ai-review.ts +0 -31
  455. package/src/hooks/use-axios.ts +0 -20
  456. package/src/hooks/use-code-completion-ai-api.ts +0 -11
  457. package/src/hooks/use-copy-to-clipboard.ts +0 -26
  458. package/src/hooks/use-create-datasheet.ts +0 -30
  459. package/src/hooks/use-create-org-mutation.ts +0 -38
  460. package/src/hooks/use-create-package-files-mutation.ts +0 -76
  461. package/src/hooks/use-create-package-mutation.ts +0 -54
  462. package/src/hooks/use-create-package-release-mutation.ts +0 -107
  463. package/src/hooks/use-create-release-dialog.ts +0 -160
  464. package/src/hooks/use-create-snippet-mutation.ts +0 -65
  465. package/src/hooks/use-current-package-id.ts +0 -16
  466. package/src/hooks/use-current-package-info.ts +0 -32
  467. package/src/hooks/use-current-package-release.ts +0 -48
  468. package/src/hooks/use-current-snippet-id.ts +0 -78
  469. package/src/hooks/use-current-snippet.ts +0 -24
  470. package/src/hooks/use-datasheet.ts +0 -18
  471. package/src/hooks/use-debounce.ts +0 -17
  472. package/src/hooks/use-delete-package.ts +0 -45
  473. package/src/hooks/use-download-zip.ts +0 -50
  474. package/src/hooks/use-fork-package-mutation.ts +0 -61
  475. package/src/hooks/use-global-store.ts +0 -36
  476. package/src/hooks/use-hotkey.ts +0 -116
  477. package/src/hooks/use-hydration.ts +0 -30
  478. package/src/hooks/use-is-using-fake-api.ts +0 -3
  479. package/src/hooks/use-jlcpcb-component-import.tsx +0 -164
  480. package/src/hooks/use-list-org-members.ts +0 -32
  481. package/src/hooks/use-list-user-orgs.ts +0 -25
  482. package/src/hooks/use-now.ts +0 -12
  483. package/src/hooks/use-org-by-github-handle.ts +0 -24
  484. package/src/hooks/use-org.ts +0 -24
  485. package/src/hooks/use-organization.ts +0 -42
  486. package/src/hooks/use-package-as-snippet.ts +0 -81
  487. package/src/hooks/use-package-builds.ts +0 -91
  488. package/src/hooks/use-package-by-package-id.ts +0 -24
  489. package/src/hooks/use-package-by-package-name.ts +0 -29
  490. package/src/hooks/use-package-details-form.ts +0 -146
  491. package/src/hooks/use-package-files.ts +0 -122
  492. package/src/hooks/use-package-release-by-id-or-version.ts +0 -45
  493. package/src/hooks/use-package-release-images.ts +0 -105
  494. package/src/hooks/use-package-release.ts +0 -124
  495. package/src/hooks/use-package-stars.ts +0 -163
  496. package/src/hooks/use-package.ts +0 -24
  497. package/src/hooks/use-packages-base-api-url.ts +0 -3
  498. package/src/hooks/use-preview-images.ts +0 -78
  499. package/src/hooks/use-rebuild-package-release-mutation.ts +0 -41
  500. package/src/hooks/use-remove-org-member-mutation.ts +0 -32
  501. package/src/hooks/use-request-ai-review-mutation.ts +0 -54
  502. package/src/hooks/use-run-tsx/eval-compiled-js.ts +0 -9
  503. package/src/hooks/use-shiki-highlighter.ts +0 -33
  504. package/src/hooks/use-sign-in.ts +0 -24
  505. package/src/hooks/use-snippet-by-name.ts +0 -25
  506. package/src/hooks/use-snippet.ts +0 -24
  507. package/src/hooks/use-toast.tsx +0 -90
  508. package/src/hooks/use-update-ai-description-mutation.ts +0 -42
  509. package/src/hooks/use-update-org-mutation.ts +0 -41
  510. package/src/hooks/use-url-params.ts +0 -31
  511. package/src/hooks/use-warn-user-on-page-change.ts +0 -90
  512. package/src/hooks/useFileManagement.ts +0 -602
  513. package/src/hooks/useForkPackageMutation.ts +0 -50
  514. package/src/hooks/useForkSnippetMutation.ts +0 -53
  515. package/src/hooks/useOptimizedPackageFilesLoader.ts +0 -136
  516. package/src/hooks/usePackageFilesLoader.ts +0 -58
  517. package/src/hooks/useUpdatePackageFilesMutation.ts +0 -131
  518. package/src/hooks/useUpdatePackageMutation.ts +0 -63
  519. package/src/index.css +0 -108
  520. package/src/lib/__tests__/constants.test.ts +0 -66
  521. package/src/lib/base64ToBytes.ts +0 -5
  522. package/src/lib/bytesToBase64.ts +0 -4
  523. package/src/lib/codemirror/basic-setup.ts +0 -67
  524. package/src/lib/constants.ts +0 -23
  525. package/src/lib/decodeUrlHashToFsMap.ts +0 -17
  526. package/src/lib/decodeUrlHashToText.ts +0 -15
  527. package/src/lib/defaultCodeForBlankCode.tsx +0 -7
  528. package/src/lib/download-fns/createBlobURL.ts +0 -4
  529. package/src/lib/download-fns/download-assembly-svg.ts +0 -12
  530. package/src/lib/download-fns/download-circuit-json-fn.ts +0 -12
  531. package/src/lib/download-fns/download-circuit-png.ts +0 -96
  532. package/src/lib/download-fns/download-dsn-file-fn.ts +0 -12
  533. package/src/lib/download-fns/download-fabrication-files.ts +0 -233
  534. package/src/lib/download-fns/download-gltf-from-circuit-json.ts +0 -44
  535. package/src/lib/download-fns/download-gltf.ts +0 -43
  536. package/src/lib/download-fns/download-kicad-files.ts +0 -38
  537. package/src/lib/download-fns/download-pcb-svg.ts +0 -35
  538. package/src/lib/download-fns/download-png-utils.ts +0 -31
  539. package/src/lib/download-fns/download-readable-netlist.ts +0 -12
  540. package/src/lib/download-fns/download-schematic-svg.ts +0 -12
  541. package/src/lib/download-fns/download-simple-route-json.ts +0 -17
  542. package/src/lib/download-fns/download-spice-file.ts +0 -13
  543. package/src/lib/download-fns/download-step.ts +0 -12
  544. package/src/lib/encodeFsMapToUrlHash.ts +0 -13
  545. package/src/lib/encodeTextToUrlHash.ts +0 -17
  546. package/src/lib/get-snippet-template.ts +0 -26
  547. package/src/lib/getLicenseFromLicenseContent.ts +0 -67
  548. package/src/lib/handleManualEditsImport.tsx +0 -65
  549. package/src/lib/handleManualEditsImportWithSupportForMultipleFiles.ts +0 -67
  550. package/src/lib/normalize-svg-for-tile.ts +0 -50
  551. package/src/lib/populate-query-cache-with-ssr-data.ts +0 -53
  552. package/src/lib/posthog.ts +0 -17
  553. package/src/lib/react-query-api-failure-tracking.ts +0 -148
  554. package/src/lib/sentry.ts +0 -14
  555. package/src/lib/templates/blank-3d-model-template.ts +0 -12
  556. package/src/lib/templates/blank-circuit-board-template.ts +0 -20
  557. package/src/lib/templates/blank-footprint-template.ts +0 -29
  558. package/src/lib/templates/blank-package-template.ts +0 -21
  559. package/src/lib/templates/blinking-led-board-template.ts +0 -64
  560. package/src/lib/templates/usb-c-led-flashlight-template.ts +0 -22
  561. package/src/lib/ts-lib-cache.ts +0 -162
  562. package/src/lib/types.ts +0 -31
  563. package/src/lib/utils/checkIfManualEditsImported.ts +0 -20
  564. package/src/lib/utils/findTargetFile.ts +0 -97
  565. package/src/lib/utils/formatTimeAgo.ts +0 -10
  566. package/src/lib/utils/getPackagePreviewImageUrl.ts +0 -15
  567. package/src/lib/utils/index.ts +0 -6
  568. package/src/lib/utils/isComponentExported.ts +0 -10
  569. package/src/lib/utils/isUuid.ts +0 -5
  570. package/src/lib/utils/isValidFileName.ts +0 -17
  571. package/src/lib/utils/load-prettier.ts +0 -23
  572. package/src/lib/utils/member-role.tsx +0 -61
  573. package/src/lib/utils/package-utils.ts +0 -7
  574. package/src/lib/utils/parseJsonOrNull.ts +0 -8
  575. package/src/lib/utils/pcbManualEditEventHandler.ts +0 -156
  576. package/src/lib/utils/resolveRelativePath.ts +0 -40
  577. package/src/lib/utils/timeAgo.ts +0 -20
  578. package/src/lib/utils/toastManualEditConflicts.tsx +0 -39
  579. package/src/lib/utils/transformFilesToTreeData.tsx +0 -195
  580. package/src/main.tsx +0 -15
  581. package/src/pages/404.tsx +0 -23
  582. package/src/pages/authorize.tsx +0 -208
  583. package/src/pages/create-organization.tsx +0 -169
  584. package/src/pages/dashboard.tsx +0 -254
  585. package/src/pages/datasheet.tsx +0 -198
  586. package/src/pages/datasheets.tsx +0 -148
  587. package/src/pages/dev-login.tsx +0 -68
  588. package/src/pages/editor.tsx +0 -54
  589. package/src/pages/landing.tsx +0 -237
  590. package/src/pages/latest.tsx +0 -145
  591. package/src/pages/my-orders.tsx +0 -54
  592. package/src/pages/organization-profile.tsx +0 -197
  593. package/src/pages/organization-settings.tsx +0 -571
  594. package/src/pages/package-editor.tsx +0 -60
  595. package/src/pages/preview-release.tsx +0 -209
  596. package/src/pages/quickstart.tsx +0 -258
  597. package/src/pages/release-builds.tsx +0 -99
  598. package/src/pages/release-detail.tsx +0 -211
  599. package/src/pages/releases.tsx +0 -55
  600. package/src/pages/search.tsx +0 -288
  601. package/src/pages/settings-redirect.tsx +0 -44
  602. package/src/pages/trending.tsx +0 -201
  603. package/src/pages/user-profile.tsx +0 -330
  604. package/src/pages/user-settings.tsx +0 -161
  605. package/src/pages/view-package.tsx +0 -90
  606. package/src/types/package.ts +0 -4
  607. package/src/vite-env.d.ts +0 -1
  608. package/tailwind.config.js +0 -47
  609. package/tsconfig.json +0 -30
  610. package/vercel.json +0 -50
  611. package/vite.config.ts +0 -236
  612. package/winterspec.config.ts +0 -6
@@ -1,809 +0,0 @@
1
- import { useAxios } from "@/hooks/use-axios"
2
- import { useGlobalStore } from "@/hooks/use-global-store"
3
- import { useHotkeyCombo } from "@/hooks/use-hotkey"
4
- import { useNotImplementedToast } from "@/hooks/use-toast"
5
- import { fuzzyMatch } from "@/components/ViewPackagePage/utils/fuzz-search"
6
- import { useImportComponentDialog } from "@/components/dialogs/import-component-dialog"
7
- import { useJlcpcbComponentImport } from "@/hooks/use-jlcpcb-component-import"
8
- import { Command } from "cmdk"
9
- import { Package, Account } from "fake-snippets-api/lib/db/schema"
10
- import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"
11
- import { useQuery } from "react-query"
12
- import {
13
- Search,
14
- Package2,
15
- CircuitBoard,
16
- Download,
17
- Sparkles,
18
- Clock,
19
- ArrowRight,
20
- Star,
21
- User,
22
- } from "lucide-react"
23
- import {
24
- Dialog,
25
- DialogContent,
26
- DialogTitle,
27
- DialogDescription,
28
- } from "@/components/ui/dialog"
29
- import { CircuitJsonImportDialog } from "./CircuitJsonImportDialog"
30
- import { JlcpcbComponentTsxLoadedPayload } from "@tscircuit/runframe/runner"
31
-
32
- type SnippetType = "board" | "package" | "model" | "footprint"
33
-
34
- interface Template {
35
- name: string
36
- type: SnippetType
37
- disabled?: boolean
38
- icon?: React.ReactNode
39
- }
40
-
41
- interface ImportOption {
42
- name: string
43
- type: SnippetType
44
- special?: boolean
45
- icon?: React.ReactNode
46
- }
47
-
48
- interface ScoredPackage extends Package {
49
- score: number
50
- matches: number[]
51
- }
52
-
53
- interface ScoredAccount extends Account {
54
- score: number
55
- matches: number[]
56
- }
57
-
58
- const CmdKMenu = () => {
59
- const [open, setOpen] = useState(false)
60
- const [searchQuery, setSearchQuery] = useState("")
61
- const [isCircuitJsonImportDialogOpen, setIsCircuitJsonImportDialogOpen] =
62
- useState(false)
63
- const [selectedIndex, setSelectedIndex] = useState(0)
64
- const toastNotImplemented = useNotImplementedToast()
65
- const axios = useAxios()
66
- const { Dialog: ImportComponentDialog, openDialog: openImportDialog } =
67
- useImportComponentDialog()
68
- const { importComponent: importJlcpcbComponent } = useJlcpcbComponentImport()
69
- const session = useGlobalStore((s) => s.session)
70
- const currentUser = session?.github_username
71
- const jlcpcbProxyRequestHeaders = useMemo(
72
- () =>
73
- session?.token
74
- ? {
75
- Authorization: `Bearer ${session.token}`,
76
- }
77
- : undefined,
78
- [session?.token],
79
- )
80
- const handleJlcpcbComponentSelected = useCallback(
81
- async (payload: JlcpcbComponentTsxLoadedPayload) => {
82
- await importJlcpcbComponent(payload)
83
- },
84
- [importJlcpcbComponent],
85
- )
86
- const selectedItemRef = useRef<HTMLDivElement>(null)
87
-
88
- const blankTemplates = useMemo(
89
- (): Template[] => [
90
- {
91
- name: "Blank Circuit Board",
92
- type: "board",
93
- icon: <CircuitBoard className="w-4 h-4 text-green-500" />,
94
- },
95
- {
96
- name: "Blank Circuit Module",
97
- type: "package",
98
- icon: <Package2 className="w-4 h-4 text-blue-500" />,
99
- },
100
- ],
101
- [],
102
- )
103
-
104
- const templates = useMemo(
105
- (): Template[] => [
106
- {
107
- name: "Blinking LED Board",
108
- type: "board",
109
- icon: <Sparkles className="w-4 h-4 text-yellow-500" />,
110
- },
111
- {
112
- name: "USB-C LED Flashlight",
113
- type: "board",
114
- icon: <Sparkles className="w-4 h-4 text-yellow-500" />,
115
- },
116
- ],
117
- [],
118
- )
119
-
120
- const importOptions = useMemo(
121
- (): ImportOption[] => [
122
- {
123
- name: "Circuit JSON",
124
- type: "package",
125
- special: true,
126
- icon: <Download className="w-4 h-4 text-red-500" />,
127
- },
128
- {
129
- name: "JLCPCB Component",
130
- type: "package",
131
- special: true,
132
- icon: <Download className="w-4 h-4 text-red-500" />,
133
- },
134
- ],
135
- [],
136
- )
137
-
138
- const { data: allPackages = [], isLoading: isSearching } = useQuery(
139
- ["packageSearch", searchQuery],
140
- async () => {
141
- if (!searchQuery) return []
142
- try {
143
- const { data } = await axios.post("/packages/search", {
144
- query: searchQuery,
145
- })
146
- return data.packages || []
147
- } catch (error) {
148
- console.warn("Failed to fetch packages:", error)
149
- return []
150
- }
151
- },
152
- {
153
- enabled: Boolean(searchQuery),
154
- retry: false,
155
- refetchOnWindowFocus: false,
156
- },
157
- )
158
-
159
- const { data: allAccounts = [], isLoading: isSearchingAccounts } = useQuery(
160
- ["accountSearch", searchQuery],
161
- async () => {
162
- if (!searchQuery) return []
163
- try {
164
- const { data } = await axios.post("/accounts/search", {
165
- query: searchQuery,
166
- limit: 5,
167
- })
168
- return data.accounts || []
169
- } catch (error) {
170
- console.warn("Failed to fetch accounts:", error)
171
- return []
172
- }
173
- },
174
- {
175
- enabled: Boolean(searchQuery) && Boolean(currentUser),
176
- retry: false,
177
- refetchOnWindowFocus: false,
178
- },
179
- )
180
-
181
- const searchResults = useMemo((): ScoredPackage[] => {
182
- if (!searchQuery || !allPackages.length) return []
183
-
184
- return allPackages
185
- .map((pkg: Package) => {
186
- const { score, matches } = fuzzyMatch(searchQuery, pkg.name)
187
- return { ...pkg, score, matches }
188
- })
189
- .filter((pkg: ScoredPackage) => pkg.score >= 0)
190
- .sort((a: ScoredPackage, b: ScoredPackage) => b.score - a.score)
191
- .slice(0, 6)
192
- }, [allPackages, searchQuery])
193
-
194
- const accountSearchResults = useMemo((): ScoredAccount[] => {
195
- if (!searchQuery || !allAccounts.length) return []
196
-
197
- return allAccounts
198
- .map((account: Account) => {
199
- const { score, matches } = fuzzyMatch(
200
- searchQuery,
201
- account.github_username,
202
- )
203
- return { ...account, score, matches }
204
- })
205
- .filter((account: ScoredAccount) => account.score >= 0)
206
- .sort((a: ScoredAccount, b: ScoredAccount) => b.score - a.score)
207
- .slice(0, 5)
208
- }, [allAccounts, searchQuery])
209
-
210
- const { data: recentPackages = [] } = useQuery<Package[]>(
211
- ["cmdKMenuPackages", currentUser],
212
- async () => {
213
- if (!currentUser) return []
214
- try {
215
- const response = await axios.post(`/packages/list`, {
216
- owner_github_username: currentUser,
217
- limit: 5,
218
- })
219
- return response.data.packages || []
220
- } catch (error) {
221
- console.warn("Failed to fetch recent packages:", error)
222
- return []
223
- }
224
- },
225
- {
226
- enabled: !!currentUser && !searchQuery,
227
- retry: false,
228
- refetchOnWindowFocus: false,
229
- refetchOnMount: false,
230
- cacheTime: 24 * 60 * 60 * 1000,
231
- },
232
- )
233
-
234
- const filteredStaticOptions = useMemo(() => {
235
- if (!searchQuery) {
236
- return {
237
- blankTemplates: blankTemplates,
238
- templates: templates,
239
- importOptions: importOptions,
240
- }
241
- }
242
-
243
- const searchBlankTemplates = blankTemplates
244
- .map((template) => {
245
- const { score, matches } = fuzzyMatch(searchQuery, template.name)
246
- return { ...template, score, matches }
247
- })
248
- .filter((template) => template.score >= 0)
249
- .sort((a, b) => b.score - a.score)
250
-
251
- const searchTemplates = templates
252
- .map((template) => {
253
- const { score, matches } = fuzzyMatch(searchQuery, template.name)
254
- return { ...template, score, matches }
255
- })
256
- .filter((template) => template.score >= 0)
257
- .sort((a, b) => b.score - a.score)
258
-
259
- const searchImportOptions = importOptions
260
- .map((option) => {
261
- const { score, matches } = fuzzyMatch(
262
- searchQuery,
263
- `Import ${option.name}`,
264
- )
265
- return { ...option, score, matches }
266
- })
267
- .filter((option) => option.score >= 0)
268
- .sort((a, b) => b.score - a.score)
269
-
270
- return {
271
- blankTemplates: searchBlankTemplates,
272
- templates: searchTemplates,
273
- importOptions: searchImportOptions,
274
- }
275
- }, [searchQuery, blankTemplates, templates, importOptions])
276
-
277
- const allItems = useMemo(() => {
278
- const items: Array<{
279
- type: "package" | "account" | "recent" | "template" | "blank" | "import"
280
- item: any
281
- disabled?: boolean
282
- }> = []
283
-
284
- if (searchQuery && searchResults.length > 0) {
285
- searchResults.forEach((pkg) => {
286
- items.push({ type: "package", item: pkg })
287
- })
288
- }
289
-
290
- if (searchQuery && accountSearchResults.length > 0) {
291
- accountSearchResults.forEach((account) => {
292
- items.push({ type: "account", item: account })
293
- })
294
- }
295
-
296
- if (!searchQuery && recentPackages.length > 0) {
297
- recentPackages.slice(0, 6).forEach((pkg) => {
298
- items.push({ type: "recent", item: pkg })
299
- })
300
- }
301
-
302
- filteredStaticOptions.blankTemplates.forEach((template) => {
303
- items.push({ type: "blank", item: template, disabled: template.disabled })
304
- })
305
-
306
- filteredStaticOptions.templates.forEach((template) => {
307
- items.push({ type: "template", item: template })
308
- })
309
-
310
- filteredStaticOptions.importOptions.forEach((option) => {
311
- items.push({ type: "import", item: option })
312
- })
313
-
314
- return items
315
- }, [
316
- searchQuery,
317
- searchResults,
318
- accountSearchResults,
319
- recentPackages,
320
- filteredStaticOptions,
321
- ])
322
-
323
- useHotkeyCombo("cmd+k", () => {
324
- setOpen((prev) => !prev)
325
- })
326
-
327
- useEffect(() => {
328
- setSelectedIndex(0)
329
- }, [allItems.length])
330
-
331
- useEffect(() => {
332
- if (selectedItemRef.current) {
333
- selectedItemRef.current.scrollIntoView({
334
- behavior: "smooth",
335
- block: "nearest",
336
- })
337
- }
338
- }, [selectedIndex])
339
-
340
- const handleKeyDown = useCallback(
341
- (e: React.KeyboardEvent) => {
342
- if (e.key === "ArrowDown") {
343
- e.preventDefault()
344
- e.stopPropagation()
345
- setSelectedIndex((prev) => {
346
- const next = Math.min(prev + 1, allItems.length - 1)
347
- return next
348
- })
349
- } else if (e.key === "ArrowUp") {
350
- e.preventDefault()
351
- e.stopPropagation()
352
- setSelectedIndex((prev) => {
353
- const next = Math.max(prev - 1, 0)
354
- return next
355
- })
356
- } else if (e.key === "Enter") {
357
- e.preventDefault()
358
- e.stopPropagation()
359
- if (allItems[selectedIndex] && !allItems[selectedIndex].disabled) {
360
- handleItemSelect(allItems[selectedIndex])
361
- }
362
- } else if (e.key === "Escape") {
363
- e.preventDefault()
364
- e.stopPropagation()
365
- setOpen(false)
366
- }
367
- },
368
- [selectedIndex, allItems.length],
369
- )
370
-
371
- const handleItemSelect = useCallback(
372
- (selectedItem: any) => {
373
- const { type, item } = selectedItem
374
-
375
- switch (type) {
376
- case "package":
377
- case "recent":
378
- window.location.href = `/${item.name}`
379
- setOpen(false)
380
- break
381
- case "account":
382
- window.location.href = `/${item.github_username}`
383
- setOpen(false)
384
- break
385
- case "blank":
386
- case "template":
387
- if (!item.disabled) {
388
- window.location.href = `/editor?template=${item.name.toLowerCase().replace(/ /g, "-")}`
389
- setOpen(false)
390
- }
391
- break
392
- case "import":
393
- if (item.special) {
394
- switch (item.name) {
395
- case "Circuit JSON":
396
- setOpen(false)
397
- setIsCircuitJsonImportDialogOpen(true)
398
- break
399
- case "JLCPCB Component":
400
- setOpen(false)
401
- openImportDialog()
402
- break
403
- }
404
- } else {
405
- setOpen(false)
406
- toastNotImplemented(`${item.name} Import`)
407
- }
408
- break
409
- }
410
- },
411
- [toastNotImplemented],
412
- )
413
-
414
- const renderHighlighted = useCallback(
415
- (item: any, text: string) => {
416
- if (!searchQuery || !item.matches) return text
417
-
418
- const chars = text.split("")
419
- return chars.map((char, i) => (
420
- <span key={i} className={item.matches.includes(i) ? "bg-blue-200" : ""}>
421
- {char}
422
- </span>
423
- ))
424
- },
425
- [searchQuery],
426
- )
427
-
428
- const renderItem = useCallback(
429
- (item: any, index: number) => {
430
- const { type, item: data, disabled } = item
431
- const isSelected = index === selectedIndex
432
-
433
- const baseClasses = `
434
- group flex items-center justify-between px-2 sm:px-3 py-2 rounded-md cursor-pointer
435
- transition-all duration-150 border border-transparent text-sm w-full
436
- ${isSelected ? "bg-blue-50 border-blue-200" : "hover:bg-gray-50"}
437
- ${disabled ? "opacity-50 cursor-not-allowed" : ""}
438
- `
439
-
440
- switch (type) {
441
- case "package":
442
- case "recent":
443
- return (
444
- <div
445
- key={`${type}-${data.package_id}`}
446
- ref={isSelected ? selectedItemRef : null}
447
- className={baseClasses}
448
- onClick={() => !disabled && handleItemSelect(item)}
449
- >
450
- <div className="flex items-center gap-2 min-w-0 flex-1 overflow-hidden">
451
- <Package2 className="w-4 h-4 text-blue-500 flex-shrink-0" />
452
- <div className="flex flex-col min-w-0 flex-1 overflow-hidden">
453
- <span className="font-medium text-gray-900 truncate max-w-full">
454
- {type === "package"
455
- ? renderHighlighted(data, data.name)
456
- : data.name}
457
- </span>
458
- {data.description && (
459
- <span className="text-xs text-gray-500 truncate max-w-full">
460
- {data.description}
461
- </span>
462
- )}
463
- {type === "recent" && (
464
- <span className="text-xs text-gray-400 hidden sm:block truncate">
465
- {new Date(data.updated_at).toLocaleDateString()}
466
- </span>
467
- )}
468
- </div>
469
- </div>
470
- <div className="flex items-center gap-1 sm:gap-2 flex-shrink-0">
471
- <div className="flex items-center gap-1 text-gray-500">
472
- <Star className="w-3 h-3 fill-yellow-400 text-yellow-400" />
473
- <span className="text-xs">{data.star_count ?? 0}</span>
474
- </div>
475
- <span className="text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded hidden sm:inline">
476
- package
477
- </span>
478
- {isSelected && <ArrowRight className="w-3 h-3 text-gray-400" />}
479
- </div>
480
- </div>
481
- )
482
-
483
- case "account":
484
- return (
485
- <div
486
- key={`account-${data.account_id}`}
487
- ref={isSelected ? selectedItemRef : null}
488
- className={baseClasses}
489
- onClick={() => !disabled && handleItemSelect(item)}
490
- >
491
- <div className="flex items-center gap-2 min-w-0 flex-1">
492
- <img
493
- src={`https://github.com/${data.github_username}.png`}
494
- alt={`${data.github_username} avatar`}
495
- className="w-6 h-6 rounded-full flex-shrink-0"
496
- onError={(e) => {
497
- const target = e.target as HTMLImageElement
498
- target.style.display = "none"
499
- target.nextElementSibling?.classList.remove("hidden")
500
- }}
501
- />
502
- <User className="w-6 h-6 text-gray-400 flex-shrink-0 hidden" />
503
- <div className="flex flex-col min-w-0 flex-1">
504
- <span className="font-medium text-gray-900 truncate">
505
- {renderHighlighted(data, data.github_username)}
506
- </span>
507
- </div>
508
- </div>
509
- <div className="flex items-center gap-1 flex-shrink-0">
510
- <span className="text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded hidden sm:inline">
511
- user
512
- </span>
513
- {isSelected && <ArrowRight className="w-3 h-3 text-gray-400" />}
514
- </div>
515
- </div>
516
- )
517
-
518
- case "blank":
519
- case "template":
520
- return (
521
- <div
522
- key={`${type}-${data.name}`}
523
- ref={isSelected ? selectedItemRef : null}
524
- className={baseClasses}
525
- onClick={() => !disabled && handleItemSelect(item)}
526
- >
527
- <div className="flex items-center gap-2 min-w-0 flex-1">
528
- {data.icon}
529
- <span className="font-medium text-gray-900 truncate">
530
- {renderHighlighted(data, data.name)}
531
- </span>
532
- </div>
533
- <div className="flex items-center gap-1 flex-shrink-0">
534
- <span className="text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded hidden sm:inline">
535
- {data.type}
536
- </span>
537
- {isSelected && <ArrowRight className="w-3 h-3 text-gray-400" />}
538
- </div>
539
- </div>
540
- )
541
-
542
- case "import":
543
- return (
544
- <div
545
- key={`import-${data.name}`}
546
- ref={isSelected ? selectedItemRef : null}
547
- className={baseClasses}
548
- onClick={() => handleItemSelect(item)}
549
- >
550
- <div className="flex items-center gap-2 min-w-0 flex-1">
551
- {data.icon}
552
- <span className="font-medium text-gray-900 truncate">
553
- Import {renderHighlighted(data, data.name)}
554
- </span>
555
- </div>
556
- <div className="flex items-center gap-1 flex-shrink-0">
557
- <span className="text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded hidden sm:inline">
558
- {data.type}
559
- </span>
560
- {isSelected && <ArrowRight className="w-3 h-3 text-gray-400" />}
561
- </div>
562
- </div>
563
- )
564
-
565
- default:
566
- return null
567
- }
568
- },
569
- [selectedIndex, handleItemSelect, renderHighlighted],
570
- )
571
-
572
- if (!open)
573
- return (
574
- <>
575
- <ImportComponentDialog
576
- onJlcpcbComponentTsxLoaded={handleJlcpcbComponentSelected}
577
- jlcpcbProxyRequestHeaders={jlcpcbProxyRequestHeaders}
578
- />
579
- <CircuitJsonImportDialog
580
- open={isCircuitJsonImportDialogOpen}
581
- onOpenChange={setIsCircuitJsonImportDialogOpen}
582
- />
583
- </>
584
- )
585
-
586
- return (
587
- <>
588
- <Dialog open={open} onOpenChange={setOpen}>
589
- <DialogContent className="max-w-xl lg:max-w-2xl w-[95vw] bg-white rounded-lg shadow-xl border border-gray-200 p-0 top-[10vh] translate-y-0">
590
- <DialogTitle className="sr-only">Command Menu</DialogTitle>
591
- <DialogDescription className="sr-only">
592
- Use this menu to search packages and commands.
593
- </DialogDescription>
594
- <Command
595
- className="w-full overflow-hidden"
596
- loop={false}
597
- onKeyDown={handleKeyDown}
598
- >
599
- <div className="flex items-center border-b border-gray-200 px-3 sm:px-4 py-3">
600
- <Search className="w-4 h-4 mr-2 text-gray-400 flex-shrink-0" />
601
- <Command.Input
602
- placeholder="Search packages and commands..."
603
- value={searchQuery}
604
- onValueChange={setSearchQuery}
605
- className="w-full bg-transparent border-none outline-none text-sm text-gray-900 placeholder-gray-500"
606
- />
607
- </div>
608
-
609
- <Command.List className="max-h-[60vh] sm:max-h-[50vh] overflow-y-auto p-2 sm:p-3 space-y-3 no-scrollbar">
610
- {isSearching || isSearchingAccounts ? (
611
- <Command.Loading className="p-6 text-center text-gray-500">
612
- <div className="flex items-center justify-center gap-2">
613
- <div className="w-3 h-3 border-2 border-gray-300 border-t-gray-600 rounded-full animate-spin"></div>
614
- Loading...
615
- </div>
616
- </Command.Loading>
617
- ) : (
618
- <>
619
- {searchQuery && searchResults.length > 0 && (
620
- <div>
621
- <h3 className="text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2 px-2">
622
- Packages
623
- </h3>
624
- <div className="space-y-1">
625
- {searchResults.slice(0, 8).map((pkg, localIndex) => {
626
- const globalIndex = localIndex
627
- return renderItem(
628
- { type: "package", item: pkg },
629
- globalIndex,
630
- )
631
- })}
632
- </div>
633
- </div>
634
- )}
635
-
636
- {searchQuery && accountSearchResults.length > 0 && (
637
- <div>
638
- <h3 className="text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2 px-2">
639
- Users
640
- </h3>
641
- <div className="space-y-1">
642
- {accountSearchResults
643
- .slice(0, 5)
644
- .map((account, localIndex) => {
645
- const globalIndex =
646
- searchResults.length + localIndex
647
- return renderItem(
648
- { type: "account", item: account },
649
- globalIndex,
650
- )
651
- })}
652
- </div>
653
- </div>
654
- )}
655
-
656
- {!searchQuery && recentPackages.length > 0 && (
657
- <div>
658
- <h3 className="text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2 px-2 flex items-center gap-1">
659
- <Clock className="w-3 h-3" />
660
- Recent
661
- </h3>
662
- <div className="space-y-1">
663
- {recentPackages.slice(0, 6).map((pkg, localIndex) => {
664
- const globalIndex = localIndex
665
- return renderItem(
666
- { type: "recent", item: pkg },
667
- globalIndex,
668
- )
669
- })}
670
- </div>
671
- </div>
672
- )}
673
-
674
- {filteredStaticOptions.blankTemplates.length > 0 && (
675
- <div>
676
- <h3 className="text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2 px-2">
677
- Create
678
- </h3>
679
- <div className="space-y-1">
680
- {filteredStaticOptions.blankTemplates.map(
681
- (template, localIndex) => {
682
- const globalIndex =
683
- (searchQuery
684
- ? searchResults.length +
685
- accountSearchResults.length
686
- : recentPackages.length) + localIndex
687
- return renderItem(
688
- {
689
- type: "blank",
690
- item: template,
691
- disabled: template.disabled,
692
- },
693
- globalIndex,
694
- )
695
- },
696
- )}
697
- </div>
698
- </div>
699
- )}
700
-
701
- {filteredStaticOptions.templates.length > 0 && (
702
- <div>
703
- <h3 className="text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2 px-2">
704
- Templates
705
- </h3>
706
- <div className="space-y-1">
707
- {filteredStaticOptions.templates.map(
708
- (template, localIndex) => {
709
- const globalIndex =
710
- (searchQuery
711
- ? searchResults.length +
712
- accountSearchResults.length
713
- : recentPackages.length) +
714
- filteredStaticOptions.blankTemplates.length +
715
- localIndex
716
- return renderItem(
717
- { type: "template", item: template },
718
- globalIndex,
719
- )
720
- },
721
- )}
722
- </div>
723
- </div>
724
- )}
725
-
726
- {filteredStaticOptions.importOptions.length > 0 && (
727
- <div>
728
- <h3 className="text-xs font-semibold text-gray-500 uppercase tracking-wide mb-2 px-2">
729
- Import
730
- </h3>
731
- <div className="space-y-1">
732
- {filteredStaticOptions.importOptions.map(
733
- (option, localIndex) => {
734
- const globalIndex =
735
- (searchQuery
736
- ? searchResults.length +
737
- accountSearchResults.length
738
- : recentPackages.length) +
739
- filteredStaticOptions.blankTemplates.length +
740
- filteredStaticOptions.templates.length +
741
- localIndex
742
- return renderItem(
743
- { type: "import", item: option },
744
- globalIndex,
745
- )
746
- },
747
- )}
748
- </div>
749
- </div>
750
- )}
751
-
752
- {searchQuery &&
753
- !searchResults.length &&
754
- !accountSearchResults.length &&
755
- !filteredStaticOptions.blankTemplates.length &&
756
- !filteredStaticOptions.templates.length &&
757
- !filteredStaticOptions.importOptions.length &&
758
- !isSearching &&
759
- !isSearchingAccounts && (
760
- <Command.Empty className="py-8 text-center">
761
- <div className="text-gray-400 mb-1">
762
- No results found
763
- </div>
764
- <div className="text-gray-500 text-xs">
765
- Try different search terms
766
- </div>
767
- </Command.Empty>
768
- )}
769
- </>
770
- )}
771
- </Command.List>
772
-
773
- <div className="border-t border-gray-200 px-2 py-2 bg-gray-50/50 rounded-b-lg">
774
- <div className="flex justify-between items-center text-[11px] sm:text-xs text-gray-500">
775
- <div className="flex items-center gap-1.5 sm:gap-3">
776
- <div className="flex items-center gap-1">
777
- <kbd className="px-1 py-0.5 font-mono bg-white border border-gray-200 shadow-sm rounded text-[10px] sm:text-xs">
778
- ↑↓
779
- </kbd>
780
- <span className="hidden sm:inline">navigate</span>
781
- </div>
782
- <div className="flex items-center gap-1">
783
- <kbd className="px-1 py-0.5 font-mono bg-white border border-gray-200 shadow-sm rounded text-[10px] sm:text-xs">
784
-
785
- </kbd>
786
- <span className="hidden sm:inline">select</span>
787
- </div>
788
- </div>
789
- <div className="flex items-center gap-1">
790
- <kbd className="px-1 py-0.5 font-mono bg-white border border-gray-200 shadow-sm rounded text-[10px] sm:text-xs">
791
- ⌘K
792
- </kbd>
793
- <span className="hidden sm:inline">close</span>
794
- </div>
795
- </div>
796
- </div>
797
- </Command>
798
- </DialogContent>
799
- </Dialog>
800
-
801
- <ImportComponentDialog
802
- onJlcpcbComponentTsxLoaded={handleJlcpcbComponentSelected}
803
- jlcpcbProxyRequestHeaders={jlcpcbProxyRequestHeaders}
804
- />
805
- </>
806
- )
807
- }
808
-
809
- export default CmdKMenu