@opencode-ai/ui 0.0.0-beta-202606251302

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 (346) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +110 -0
  3. package/src/assets/audio/alert-01.aac +0 -0
  4. package/src/assets/audio/alert-01.mp3 +0 -0
  5. package/src/assets/audio/alert-02.aac +0 -0
  6. package/src/assets/audio/alert-02.mp3 +0 -0
  7. package/src/assets/audio/alert-03.aac +0 -0
  8. package/src/assets/audio/alert-03.mp3 +0 -0
  9. package/src/assets/audio/alert-04.aac +0 -0
  10. package/src/assets/audio/alert-04.mp3 +0 -0
  11. package/src/assets/audio/alert-05.aac +0 -0
  12. package/src/assets/audio/alert-05.mp3 +0 -0
  13. package/src/assets/audio/alert-06.aac +0 -0
  14. package/src/assets/audio/alert-06.mp3 +0 -0
  15. package/src/assets/audio/alert-07.aac +0 -0
  16. package/src/assets/audio/alert-07.mp3 +0 -0
  17. package/src/assets/audio/alert-08.aac +0 -0
  18. package/src/assets/audio/alert-08.mp3 +0 -0
  19. package/src/assets/audio/alert-09.aac +0 -0
  20. package/src/assets/audio/alert-09.mp3 +0 -0
  21. package/src/assets/audio/alert-10.aac +0 -0
  22. package/src/assets/audio/alert-10.mp3 +0 -0
  23. package/src/assets/audio/bip-bop-01.aac +0 -0
  24. package/src/assets/audio/bip-bop-01.mp3 +0 -0
  25. package/src/assets/audio/bip-bop-02.aac +0 -0
  26. package/src/assets/audio/bip-bop-02.mp3 +0 -0
  27. package/src/assets/audio/bip-bop-03.aac +0 -0
  28. package/src/assets/audio/bip-bop-03.mp3 +0 -0
  29. package/src/assets/audio/bip-bop-04.aac +0 -0
  30. package/src/assets/audio/bip-bop-04.mp3 +0 -0
  31. package/src/assets/audio/bip-bop-05.aac +0 -0
  32. package/src/assets/audio/bip-bop-05.mp3 +0 -0
  33. package/src/assets/audio/bip-bop-06.aac +0 -0
  34. package/src/assets/audio/bip-bop-06.mp3 +0 -0
  35. package/src/assets/audio/bip-bop-07.aac +0 -0
  36. package/src/assets/audio/bip-bop-07.mp3 +0 -0
  37. package/src/assets/audio/bip-bop-08.aac +0 -0
  38. package/src/assets/audio/bip-bop-08.mp3 +0 -0
  39. package/src/assets/audio/bip-bop-09.aac +0 -0
  40. package/src/assets/audio/bip-bop-09.mp3 +0 -0
  41. package/src/assets/audio/bip-bop-10.aac +0 -0
  42. package/src/assets/audio/bip-bop-10.mp3 +0 -0
  43. package/src/assets/audio/nope-01.aac +0 -0
  44. package/src/assets/audio/nope-01.mp3 +0 -0
  45. package/src/assets/audio/nope-02.aac +0 -0
  46. package/src/assets/audio/nope-02.mp3 +0 -0
  47. package/src/assets/audio/nope-03.aac +0 -0
  48. package/src/assets/audio/nope-03.mp3 +0 -0
  49. package/src/assets/audio/nope-04.aac +0 -0
  50. package/src/assets/audio/nope-04.mp3 +0 -0
  51. package/src/assets/audio/nope-05.aac +0 -0
  52. package/src/assets/audio/nope-05.mp3 +0 -0
  53. package/src/assets/audio/nope-06.aac +0 -0
  54. package/src/assets/audio/nope-06.mp3 +0 -0
  55. package/src/assets/audio/nope-07.aac +0 -0
  56. package/src/assets/audio/nope-07.mp3 +0 -0
  57. package/src/assets/audio/nope-08.aac +0 -0
  58. package/src/assets/audio/nope-08.mp3 +0 -0
  59. package/src/assets/audio/nope-09.aac +0 -0
  60. package/src/assets/audio/nope-09.mp3 +0 -0
  61. package/src/assets/audio/nope-10.aac +0 -0
  62. package/src/assets/audio/nope-10.mp3 +0 -0
  63. package/src/assets/audio/nope-11.aac +0 -0
  64. package/src/assets/audio/nope-11.mp3 +0 -0
  65. package/src/assets/audio/nope-12.aac +0 -0
  66. package/src/assets/audio/nope-12.mp3 +0 -0
  67. package/src/assets/audio/staplebops-01.aac +0 -0
  68. package/src/assets/audio/staplebops-01.mp3 +0 -0
  69. package/src/assets/audio/staplebops-02.aac +0 -0
  70. package/src/assets/audio/staplebops-02.mp3 +0 -0
  71. package/src/assets/audio/staplebops-03.aac +0 -0
  72. package/src/assets/audio/staplebops-03.mp3 +0 -0
  73. package/src/assets/audio/staplebops-04.aac +0 -0
  74. package/src/assets/audio/staplebops-04.mp3 +0 -0
  75. package/src/assets/audio/staplebops-05.aac +0 -0
  76. package/src/assets/audio/staplebops-05.mp3 +0 -0
  77. package/src/assets/audio/staplebops-06.aac +0 -0
  78. package/src/assets/audio/staplebops-06.mp3 +0 -0
  79. package/src/assets/audio/staplebops-07.aac +0 -0
  80. package/src/assets/audio/staplebops-07.mp3 +0 -0
  81. package/src/assets/audio/yup-01.aac +0 -0
  82. package/src/assets/audio/yup-01.mp3 +0 -0
  83. package/src/assets/audio/yup-02.aac +0 -0
  84. package/src/assets/audio/yup-02.mp3 +0 -0
  85. package/src/assets/audio/yup-03.aac +0 -0
  86. package/src/assets/audio/yup-03.mp3 +0 -0
  87. package/src/assets/audio/yup-04.aac +0 -0
  88. package/src/assets/audio/yup-04.mp3 +0 -0
  89. package/src/assets/audio/yup-05.aac +0 -0
  90. package/src/assets/audio/yup-05.mp3 +0 -0
  91. package/src/assets/audio/yup-06.aac +0 -0
  92. package/src/assets/audio/yup-06.mp3 +0 -0
  93. package/src/assets/fonts/Inter.ttf +0 -0
  94. package/src/assets/fonts/JetBrainsMonoNerdFontMono-Regular.woff2 +0 -0
  95. package/src/assets/icons/app/android-studio.svg +369 -0
  96. package/src/assets/icons/app/antigravity.svg +97 -0
  97. package/src/assets/icons/app/cursor.svg +16 -0
  98. package/src/assets/icons/app/file-explorer.svg +20 -0
  99. package/src/assets/icons/app/finder.png +0 -0
  100. package/src/assets/icons/app/ghostty.svg +13 -0
  101. package/src/assets/icons/app/iterm2.svg +13 -0
  102. package/src/assets/icons/app/powershell.svg +14 -0
  103. package/src/assets/icons/app/sublimetext.svg +17 -0
  104. package/src/assets/icons/app/terminal.png +0 -0
  105. package/src/assets/icons/app/textmate.png +0 -0
  106. package/src/assets/icons/app/vscode.svg +39 -0
  107. package/src/assets/icons/app/warp.png +0 -0
  108. package/src/assets/icons/app/xcode.png +0 -0
  109. package/src/assets/icons/app/zed-dark.svg +15 -0
  110. package/src/assets/icons/app/zed.svg +15 -0
  111. package/src/components/accordion.css +123 -0
  112. package/src/components/accordion.tsx +92 -0
  113. package/src/components/animated-number.css +75 -0
  114. package/src/components/animated-number.tsx +109 -0
  115. package/src/components/app-icon.css +5 -0
  116. package/src/components/app-icon.tsx +85 -0
  117. package/src/components/app-icons/sprite.svg +114 -0
  118. package/src/components/app-icons/types.ts +21 -0
  119. package/src/components/avatar.css +49 -0
  120. package/src/components/avatar.tsx +55 -0
  121. package/src/components/button.css +194 -0
  122. package/src/components/button.tsx +33 -0
  123. package/src/components/card.css +94 -0
  124. package/src/components/card.tsx +123 -0
  125. package/src/components/checkbox.css +131 -0
  126. package/src/components/checkbox.tsx +43 -0
  127. package/src/components/collapsible.css +148 -0
  128. package/src/components/collapsible.tsx +48 -0
  129. package/src/components/context-menu.css +134 -0
  130. package/src/components/context-menu.tsx +308 -0
  131. package/src/components/dialog.css +181 -0
  132. package/src/components/dialog.tsx +72 -0
  133. package/src/components/diff-changes.css +42 -0
  134. package/src/components/diff-changes.tsx +115 -0
  135. package/src/components/dock-surface.css +23 -0
  136. package/src/components/dock-surface.tsx +54 -0
  137. package/src/components/dropdown-menu.css +135 -0
  138. package/src/components/dropdown-menu.tsx +308 -0
  139. package/src/components/favicon.tsx +13 -0
  140. package/src/components/file-icon.css +26 -0
  141. package/src/components/file-icon.tsx +588 -0
  142. package/src/components/file-icons/sprite.svg +11707 -0
  143. package/src/components/file-icons/types.ts +1095 -0
  144. package/src/components/font.tsx +1 -0
  145. package/src/components/hover-card.css +61 -0
  146. package/src/components/hover-card.tsx +32 -0
  147. package/src/components/icon-button.css +181 -0
  148. package/src/components/icon-button.tsx +29 -0
  149. package/src/components/icon.css +34 -0
  150. package/src/components/icon.tsx +169 -0
  151. package/src/components/image-preview.css +63 -0
  152. package/src/components/image-preview.tsx +32 -0
  153. package/src/components/inline-input.css +17 -0
  154. package/src/components/inline-input.tsx +22 -0
  155. package/src/components/keybind.css +18 -0
  156. package/src/components/keybind.tsx +20 -0
  157. package/src/components/list.css +331 -0
  158. package/src/components/list.tsx +394 -0
  159. package/src/components/logo.css +4 -0
  160. package/src/components/logo.tsx +62 -0
  161. package/src/components/motion-spring.tsx +58 -0
  162. package/src/components/popover.css +98 -0
  163. package/src/components/popover.tsx +153 -0
  164. package/src/components/progress-circle.css +12 -0
  165. package/src/components/progress-circle.tsx +57 -0
  166. package/src/components/progress.css +63 -0
  167. package/src/components/progress.tsx +39 -0
  168. package/src/components/provider-icon.css +5 -0
  169. package/src/components/provider-icon.tsx +25 -0
  170. package/src/components/provider-icons/sprite.svg +1135 -0
  171. package/src/components/provider-icons/types.ts +105 -0
  172. package/src/components/radio-group.css +187 -0
  173. package/src/components/radio-group.tsx +83 -0
  174. package/src/components/resize-handle.css +58 -0
  175. package/src/components/resize-handle.tsx +82 -0
  176. package/src/components/scroll-view.css +66 -0
  177. package/src/components/scroll-view.tsx +250 -0
  178. package/src/components/select.css +202 -0
  179. package/src/components/select.tsx +174 -0
  180. package/src/components/spinner.css +6 -0
  181. package/src/components/spinner.tsx +52 -0
  182. package/src/components/sticky-accordion-header.css +6 -0
  183. package/src/components/sticky-accordion-header.tsx +18 -0
  184. package/src/components/switch.css +132 -0
  185. package/src/components/switch.tsx +29 -0
  186. package/src/components/tabs.css +635 -0
  187. package/src/components/tabs.tsx +125 -0
  188. package/src/components/tag.css +37 -0
  189. package/src/components/tag.tsx +22 -0
  190. package/src/components/text-field.css +134 -0
  191. package/src/components/text-field.tsx +128 -0
  192. package/src/components/text-reveal.css +150 -0
  193. package/src/components/text-reveal.tsx +143 -0
  194. package/src/components/text-shimmer.css +119 -0
  195. package/src/components/text-shimmer.tsx +62 -0
  196. package/src/components/text-strikethrough.css +27 -0
  197. package/src/components/text-strikethrough.tsx +84 -0
  198. package/src/components/toast.css +236 -0
  199. package/src/components/toast.tsx +185 -0
  200. package/src/components/tooltip.css +74 -0
  201. package/src/components/tooltip.tsx +161 -0
  202. package/src/components/typewriter.css +14 -0
  203. package/src/components/typewriter.tsx +55 -0
  204. package/src/context/dialog.tsx +197 -0
  205. package/src/context/file.tsx +10 -0
  206. package/src/context/helper.tsx +38 -0
  207. package/src/context/i18n.tsx +38 -0
  208. package/src/context/index.ts +4 -0
  209. package/src/context/marked.tsx +522 -0
  210. package/src/context/worker-pool.tsx +20 -0
  211. package/src/custom-elements.d.ts +17 -0
  212. package/src/hooks/create-auto-scroll.tsx +237 -0
  213. package/src/hooks/index.ts +2 -0
  214. package/src/hooks/use-filtered-list.tsx +134 -0
  215. package/src/i18n/ar.ts +168 -0
  216. package/src/i18n/br.ts +168 -0
  217. package/src/i18n/bs.ts +172 -0
  218. package/src/i18n/da.ts +167 -0
  219. package/src/i18n/de.ts +173 -0
  220. package/src/i18n/en.ts +176 -0
  221. package/src/i18n/es.ts +168 -0
  222. package/src/i18n/fr.ts +168 -0
  223. package/src/i18n/ja.ts +167 -0
  224. package/src/i18n/ko.ts +168 -0
  225. package/src/i18n/no.ts +171 -0
  226. package/src/i18n/pl.ts +167 -0
  227. package/src/i18n/ru.ts +167 -0
  228. package/src/i18n/th.ts +169 -0
  229. package/src/i18n/tr.ts +174 -0
  230. package/src/i18n/uk.ts +167 -0
  231. package/src/i18n/zh.ts +171 -0
  232. package/src/i18n/zht.ts +171 -0
  233. package/src/storybook/fixtures.ts +51 -0
  234. package/src/storybook/scaffold.tsx +62 -0
  235. package/src/styles/animations.css +141 -0
  236. package/src/styles/base.css +404 -0
  237. package/src/styles/colors.css +772 -0
  238. package/src/styles/index.css +53 -0
  239. package/src/styles/tailwind/colors.css +285 -0
  240. package/src/styles/tailwind/index.css +78 -0
  241. package/src/styles/tailwind/utilities.css +131 -0
  242. package/src/styles/theme.css +609 -0
  243. package/src/styles/utilities.css +118 -0
  244. package/src/theme/color.ts +299 -0
  245. package/src/theme/context.tsx +370 -0
  246. package/src/theme/default-themes.ts +116 -0
  247. package/src/theme/index.ts +78 -0
  248. package/src/theme/loader.ts +112 -0
  249. package/src/theme/resolve.ts +540 -0
  250. package/src/theme/themes/amoled.json +49 -0
  251. package/src/theme/themes/aura.json +51 -0
  252. package/src/theme/themes/ayu.json +51 -0
  253. package/src/theme/themes/carbonfox.json +53 -0
  254. package/src/theme/themes/catppuccin-frappe.json +85 -0
  255. package/src/theme/themes/catppuccin-macchiato.json +85 -0
  256. package/src/theme/themes/catppuccin.json +45 -0
  257. package/src/theme/themes/cobalt2.json +87 -0
  258. package/src/theme/themes/cursor.json +91 -0
  259. package/src/theme/themes/dracula.json +49 -0
  260. package/src/theme/themes/everforest.json +89 -0
  261. package/src/theme/themes/flexoki.json +86 -0
  262. package/src/theme/themes/github.json +85 -0
  263. package/src/theme/themes/gruvbox.json +45 -0
  264. package/src/theme/themes/kanagawa.json +89 -0
  265. package/src/theme/themes/lucent-orng.json +87 -0
  266. package/src/theme/themes/material.json +87 -0
  267. package/src/theme/themes/matrix.json +113 -0
  268. package/src/theme/themes/mercury.json +86 -0
  269. package/src/theme/themes/monokai.json +49 -0
  270. package/src/theme/themes/nightowl.json +46 -0
  271. package/src/theme/themes/nord.json +46 -0
  272. package/src/theme/themes/oc-2.json +468 -0
  273. package/src/theme/themes/one-dark.json +89 -0
  274. package/src/theme/themes/onedarkpro.json +45 -0
  275. package/src/theme/themes/opencode.json +89 -0
  276. package/src/theme/themes/orng.json +87 -0
  277. package/src/theme/themes/osaka-jade.json +88 -0
  278. package/src/theme/themes/palenight.json +85 -0
  279. package/src/theme/themes/rosepine.json +85 -0
  280. package/src/theme/themes/shadesofpurple.json +51 -0
  281. package/src/theme/themes/solarized.json +49 -0
  282. package/src/theme/themes/synthwave84.json +87 -0
  283. package/src/theme/themes/tokyonight.json +47 -0
  284. package/src/theme/themes/vercel.json +90 -0
  285. package/src/theme/themes/vesper.json +51 -0
  286. package/src/theme/themes/zenburn.json +87 -0
  287. package/src/theme/types.ts +75 -0
  288. package/src/theme/v2/avatar.ts +48 -0
  289. package/src/theme/v2/default-primitives.ts +114 -0
  290. package/src/theme/v2/foreground.ts +60 -0
  291. package/src/theme/v2/mapping.ts +138 -0
  292. package/src/theme/v2/resolve.ts +153 -0
  293. package/src/v2/components/accordion-v2.css +139 -0
  294. package/src/v2/components/accordion-v2.tsx +86 -0
  295. package/src/v2/components/avatar-v2.css +70 -0
  296. package/src/v2/components/avatar-v2.tsx +59 -0
  297. package/src/v2/components/badge-v2.css +27 -0
  298. package/src/v2/components/badge-v2.tsx +20 -0
  299. package/src/v2/components/button-v2.css +186 -0
  300. package/src/v2/components/button-v2.tsx +35 -0
  301. package/src/v2/components/checkbox-v2.css +184 -0
  302. package/src/v2/components/checkbox-v2.tsx +65 -0
  303. package/src/v2/components/dialog-v2.css +150 -0
  304. package/src/v2/components/dialog-v2.tsx +93 -0
  305. package/src/v2/components/diff-changes-v2.css +24 -0
  306. package/src/v2/components/diff-changes-v2.tsx +28 -0
  307. package/src/v2/components/field-v2.css +94 -0
  308. package/src/v2/components/field-v2.tsx +265 -0
  309. package/src/v2/components/icon-button-v2.css +155 -0
  310. package/src/v2/components/icon-button-v2.tsx +37 -0
  311. package/src/v2/components/icon.tsx +129 -0
  312. package/src/v2/components/inline-input-v2.css +218 -0
  313. package/src/v2/components/inline-input-v2.tsx +90 -0
  314. package/src/v2/components/keybind-v2.css +76 -0
  315. package/src/v2/components/keybind-v2.tsx +30 -0
  316. package/src/v2/components/line-comment-v2.css +204 -0
  317. package/src/v2/components/line-comment-v2.tsx +155 -0
  318. package/src/v2/components/menu-v2.css +190 -0
  319. package/src/v2/components/menu-v2.tsx +225 -0
  320. package/src/v2/components/project-avatar-v2.css +126 -0
  321. package/src/v2/components/project-avatar-v2.tsx +64 -0
  322. package/src/v2/components/radio-v2.css +202 -0
  323. package/src/v2/components/radio-v2.tsx +72 -0
  324. package/src/v2/components/segmented-control-v2.css +80 -0
  325. package/src/v2/components/segmented-control-v2.tsx +208 -0
  326. package/src/v2/components/select-v2.css +285 -0
  327. package/src/v2/components/select-v2.tsx +208 -0
  328. package/src/v2/components/switch-v2.css +154 -0
  329. package/src/v2/components/switch-v2.tsx +28 -0
  330. package/src/v2/components/tab-state-indicator.tsx +37 -0
  331. package/src/v2/components/tabs-v2.css +225 -0
  332. package/src/v2/components/tabs-v2.tsx +147 -0
  333. package/src/v2/components/text-input-v2.css +145 -0
  334. package/src/v2/components/text-input-v2.tsx +67 -0
  335. package/src/v2/components/text-shimmer-v2.css +125 -0
  336. package/src/v2/components/text-shimmer-v2.tsx +63 -0
  337. package/src/v2/components/textarea-v2.css +78 -0
  338. package/src/v2/components/textarea-v2.tsx +31 -0
  339. package/src/v2/components/toast-v2.css +215 -0
  340. package/src/v2/components/toast-v2.tsx +144 -0
  341. package/src/v2/components/tooltip-v2.css +53 -0
  342. package/src/v2/components/tooltip-v2.tsx +146 -0
  343. package/src/v2/components/wordmark-v2.tsx +92 -0
  344. package/src/v2/styles/colors.css +172 -0
  345. package/src/v2/styles/tailwind.css +2 -0
  346. package/src/v2/styles/theme.css +441 -0
@@ -0,0 +1,588 @@
1
+ import type { Component, JSX } from "solid-js"
2
+ import { createMemo, createUniqueId, splitProps, Show } from "solid-js"
3
+ import sprite from "./file-icons/sprite.svg"
4
+ import type { IconName } from "./file-icons/types"
5
+
6
+ export type FileIconProps = JSX.GSVGAttributes<SVGSVGElement> & {
7
+ node: { path: string; type: "file" | "directory" }
8
+ expanded?: boolean
9
+ mono?: boolean
10
+ }
11
+
12
+ export const FileIcon: Component<FileIconProps> = (props) => {
13
+ const [local, rest] = splitProps(props, ["node", "class", "classList", "expanded", "mono"])
14
+ const name = createMemo(() => chooseIconName(local.node.path, local.node.type, local.expanded || false))
15
+ const id = `file-icon-mono-${createUniqueId()}`
16
+ return (
17
+ <svg
18
+ data-component="file-icon"
19
+ {...rest}
20
+ classList={{
21
+ ...local.classList,
22
+ [local.class ?? ""]: !!local.class,
23
+ }}
24
+ >
25
+ <Show when={local.mono} fallback={<use href={`${sprite}#${name()}`} />}>
26
+ <defs>
27
+ <mask id={id} mask-type="alpha">
28
+ <use href={`${sprite}#${name()}`} />
29
+ </mask>
30
+ </defs>
31
+ <rect width="100%" height="100%" fill="currentColor" mask={`url(#${id})`} />
32
+ </Show>
33
+ </svg>
34
+ )
35
+ }
36
+
37
+ type IconMaps = {
38
+ fileNames: Record<string, IconName>
39
+ fileExtensions: Record<string, IconName>
40
+ folderNames: Record<string, IconName>
41
+ defaults: {
42
+ file: IconName
43
+ folder: IconName
44
+ folderOpen: IconName
45
+ }
46
+ }
47
+
48
+ const ICON_MAPS: IconMaps = {
49
+ fileNames: {
50
+ // Documentation files
51
+ "readme.md": "Readme",
52
+ "changelog.md": "Changelog",
53
+ "contributing.md": "Contributing",
54
+ "conduct.md": "Conduct",
55
+ license: "Certificate",
56
+ authors: "Authors",
57
+ credits: "Credits",
58
+ install: "Installation",
59
+
60
+ // Node.js files
61
+ "package.json": "Nodejs",
62
+ "package-lock.json": "Nodejs",
63
+ "yarn.lock": "Yarn",
64
+ "pnpm-lock.yaml": "Pnpm",
65
+ "bun.lock": "Bun",
66
+ "bun.lockb": "Bun",
67
+ "bunfig.toml": "Bun",
68
+ ".nvmrc": "Nodejs",
69
+ ".node-version": "Nodejs",
70
+
71
+ // Docker files
72
+ dockerfile: "Docker",
73
+ "docker-compose.yml": "Docker",
74
+ "docker-compose.yaml": "Docker",
75
+ ".dockerignore": "Docker",
76
+
77
+ // Config files
78
+ "jest.config.js": "Jest",
79
+ "jest.config.ts": "Jest",
80
+ "jest.config.mjs": "Jest",
81
+ "vitest.config.js": "Vitest",
82
+ "vitest.config.ts": "Vitest",
83
+ "tailwind.config.js": "Tailwindcss",
84
+ "tailwind.config.ts": "Tailwindcss",
85
+ "turbo.json": "Turborepo",
86
+ "tsconfig.json": "Tsconfig",
87
+ "jsconfig.json": "Jsconfig",
88
+ ".eslintrc": "Eslint",
89
+ ".eslintrc.js": "Eslint",
90
+ ".eslintrc.json": "Eslint",
91
+ ".prettierrc": "Prettier",
92
+ ".prettierrc.js": "Prettier",
93
+ ".prettierrc.json": "Prettier",
94
+ "vite.config.js": "Vite",
95
+ "vite.config.ts": "Vite",
96
+ "webpack.config.js": "Webpack",
97
+ "rollup.config.js": "Rollup",
98
+ "astro.config.mjs": "AstroConfig",
99
+ "astro.config.js": "AstroConfig",
100
+ "next.config.js": "Next",
101
+ "next.config.mjs": "Next",
102
+ "nuxt.config.js": "Nuxt",
103
+ "nuxt.config.ts": "Nuxt",
104
+ "svelte.config.js": "Svelte",
105
+ "gatsby-config.js": "Gatsby",
106
+ "remix.config.js": "Remix",
107
+ "prisma.schema": "Prisma",
108
+ ".gitignore": "Git",
109
+ ".gitattributes": "Git",
110
+ makefile: "Makefile",
111
+ cmake: "Cmake",
112
+ "cargo.toml": "Rust",
113
+ "go.mod": "GoMod",
114
+ "go.sum": "GoMod",
115
+ "requirements.txt": "Python",
116
+ "pyproject.toml": "Python",
117
+ pipfile: "Python",
118
+ "poetry.lock": "Poetry",
119
+ gemfile: "Gemfile",
120
+ rakefile: "Ruby",
121
+ "composer.json": "Php",
122
+ "build.gradle": "Gradle",
123
+ "pom.xml": "Maven",
124
+ "deno.json": "Deno",
125
+ "deno.jsonc": "Deno",
126
+ "vercel.json": "Vercel",
127
+ "netlify.toml": "Netlify",
128
+ ".env": "Tune",
129
+ ".env.local": "Tune",
130
+ ".env.development": "Tune",
131
+ ".env.production": "Tune",
132
+ ".env.example": "Tune",
133
+ ".editorconfig": "Editorconfig",
134
+ "robots.txt": "Robots",
135
+ "favicon.ico": "Favicon",
136
+ browserlist: "Browserlist",
137
+ ".babelrc": "Babel",
138
+ "babel.config.js": "Babel",
139
+ "gulpfile.js": "Gulp",
140
+ "gruntfile.js": "Grunt",
141
+ "capacitor.config.json": "Capacitor",
142
+ "ionic.config.json": "Ionic",
143
+ "angular.json": "Angular",
144
+ ".storybook": "Storybook",
145
+ "storybook.config.js": "Storybook",
146
+ "cypress.config.js": "Cypress",
147
+ "playwright.config.js": "Playwright",
148
+ "puppeteer.config.js": "Puppeteer",
149
+ "wrangler.toml": "Wrangler",
150
+ "firebase.json": "Firebase",
151
+ supabase: "Supabase",
152
+ terraform: "Terraform",
153
+ kubernetes: "Kubernetes",
154
+ ".gitpod.yml": "Gitpod",
155
+ ".devcontainer": "Vscode",
156
+ "travis.yml": "Travis",
157
+ "appveyor.yml": "Appveyor",
158
+ ".circleci": "Circleci",
159
+ "renovate.json": "Renovate",
160
+ "dependabot.yml": "Dependabot",
161
+ "lerna.json": "Lerna",
162
+ "nx.json": "Nx",
163
+ },
164
+ fileExtensions: {
165
+ // Test files
166
+ "spec.ts": "TestTs",
167
+ "test.ts": "TestTs",
168
+ "spec.tsx": "TestJsx",
169
+ "test.tsx": "TestJsx",
170
+ "spec.js": "TestJs",
171
+ "test.js": "TestJs",
172
+ "spec.jsx": "TestJsx",
173
+ "test.jsx": "TestJsx",
174
+
175
+ // JavaScript/TypeScript
176
+ "js.map": "JavascriptMap",
177
+ "d.ts": "TypescriptDef",
178
+ ts: "Typescript",
179
+ tsx: "React_ts",
180
+ js: "Javascript",
181
+ jsx: "React",
182
+ mjs: "Javascript",
183
+ cjs: "Javascript",
184
+
185
+ // Web languages
186
+ html: "Html",
187
+ htm: "Html",
188
+ css: "Css",
189
+ scss: "Sass",
190
+ sass: "Sass",
191
+ less: "Less",
192
+ styl: "Stylus",
193
+
194
+ // Data formats
195
+ json: "Json",
196
+ xml: "Xml",
197
+ yml: "Yaml",
198
+ yaml: "Yaml",
199
+ toml: "Toml",
200
+ hjson: "Hjson",
201
+
202
+ // Documentation
203
+ md: "Markdown",
204
+ mdx: "Mdx",
205
+ tex: "Tex",
206
+
207
+ // Programming languages
208
+ py: "Python",
209
+ pyx: "Python",
210
+ pyw: "Python",
211
+ rs: "Rust",
212
+ go: "Go",
213
+ java: "Java",
214
+ kt: "Kotlin",
215
+ scala: "Scala",
216
+ php: "Php",
217
+ rb: "Ruby",
218
+ cs: "Csharp",
219
+ vb: "Visualstudio",
220
+ cpp: "Cpp",
221
+ cc: "Cpp",
222
+ cxx: "Cpp",
223
+ c: "C",
224
+ h: "H",
225
+ hpp: "Hpp",
226
+ swift: "Swift",
227
+ m: "ObjectiveC",
228
+ mm: "ObjectiveCpp",
229
+ dart: "Dart",
230
+ lua: "Lua",
231
+ pl: "Perl",
232
+ r: "R",
233
+ jl: "Julia",
234
+ hs: "Haskell",
235
+ elm: "Elm",
236
+ ml: "Ocaml",
237
+ clj: "Clojure",
238
+ cljs: "Clojure",
239
+ erl: "Erlang",
240
+ ex: "Elixir",
241
+ exs: "Elixir",
242
+ nim: "Nim",
243
+ zig: "Zig",
244
+ v: "Vlang",
245
+ odin: "Odin",
246
+ gleam: "Gleam",
247
+ grain: "Grain",
248
+ roc: "Rocket",
249
+ fs: "Fsharp",
250
+
251
+ // Shell scripts
252
+ sh: "Console",
253
+ bash: "Console",
254
+ zsh: "Console",
255
+ fish: "Console",
256
+ ps1: "Powershell",
257
+
258
+ // Config/build files
259
+ cfg: "Settings",
260
+ ini: "Settings",
261
+ conf: "Settings",
262
+ properties: "Settings",
263
+
264
+ // Media files
265
+ svg: "Svg",
266
+ png: "Image",
267
+ jpg: "Image",
268
+ jpeg: "Image",
269
+ gif: "Image",
270
+ webp: "Image",
271
+ bmp: "Image",
272
+ ico: "Favicon",
273
+ mp4: "Video",
274
+ mov: "Video",
275
+ avi: "Video",
276
+ webm: "Video",
277
+ mp3: "Audio",
278
+ wav: "Audio",
279
+ flac: "Audio",
280
+
281
+ // Archive files
282
+ zip: "Zip",
283
+ tar: "Zip",
284
+ gz: "Zip",
285
+ rar: "Zip",
286
+ "7z": "Zip",
287
+
288
+ // Document files
289
+ pdf: "Pdf",
290
+ doc: "Word",
291
+ docx: "Word",
292
+ ppt: "Powerpoint",
293
+ pptx: "Powerpoint",
294
+ xls: "Document",
295
+ xlsx: "Document",
296
+
297
+ // Database files
298
+ sql: "Database",
299
+ db: "Database",
300
+ sqlite: "Database",
301
+
302
+ // Other
303
+ env: "Tune",
304
+ log: "Log",
305
+ lock: "Lock",
306
+ key: "Key",
307
+ pem: "Certificate",
308
+ crt: "Certificate",
309
+ proto: "Proto",
310
+ graphql: "Graphql",
311
+ gql: "Graphql",
312
+ wasm: "Webassembly",
313
+ dockerfile: "Docker",
314
+ },
315
+ folderNames: {
316
+ // Source code
317
+ src: "FolderSrc",
318
+ source: "FolderSrc",
319
+ lib: "FolderLib",
320
+ libs: "FolderLib",
321
+
322
+ // Testing
323
+ test: "FolderTest",
324
+ tests: "FolderTest",
325
+ testing: "FolderTest",
326
+ spec: "FolderTest",
327
+ specs: "FolderTest",
328
+ __tests__: "FolderTest",
329
+ e2e: "FolderTest",
330
+ integration: "FolderTest",
331
+ unit: "FolderTest",
332
+ cypress: "FolderCypress",
333
+
334
+ // Dependencies
335
+ node_modules: "FolderNode",
336
+ vendor: "FolderPackages",
337
+ packages: "FolderPackages",
338
+ deps: "FolderPackages",
339
+
340
+ // Build/dist
341
+ build: "FolderBuildkite",
342
+ dist: "FolderDist",
343
+ out: "FolderDist",
344
+ output: "FolderDist",
345
+ target: "FolderTarget",
346
+
347
+ // Configuration
348
+ config: "FolderConfig",
349
+ configs: "FolderConfig",
350
+ configuration: "FolderConfig",
351
+ settings: "FolderConfig",
352
+ env: "FolderEnvironment",
353
+ environments: "FolderEnvironment",
354
+
355
+ // Docker
356
+ docker: "FolderDocker",
357
+ dockerfiles: "FolderDocker",
358
+ containers: "FolderDocker",
359
+
360
+ // Documentation
361
+ docs: "FolderDocs",
362
+ doc: "FolderDocs",
363
+ documentation: "FolderDocs",
364
+ readme: "FolderDocs",
365
+
366
+ // Public/assets
367
+ public: "FolderPublic",
368
+ static: "FolderPublic",
369
+ assets: "FolderImages",
370
+ images: "FolderImages",
371
+ img: "FolderImages",
372
+ icons: "FolderImages",
373
+ media: "FolderImages",
374
+ fonts: "FolderFont",
375
+ styles: "FolderCss",
376
+ stylesheets: "FolderCss",
377
+ css: "FolderCss",
378
+ sass: "FolderSass",
379
+ scss: "FolderSass",
380
+ less: "FolderLess",
381
+
382
+ // Scripts
383
+ scripts: "FolderScripts",
384
+ script: "FolderScripts",
385
+ tools: "FolderTools",
386
+ utils: "FolderUtils",
387
+ utilities: "FolderUtils",
388
+ helpers: "FolderHelper",
389
+
390
+ // Framework specific
391
+ components: "FolderComponents",
392
+ component: "FolderComponents",
393
+ views: "FolderViews",
394
+ view: "FolderViews",
395
+ layouts: "FolderLayout",
396
+ layout: "FolderLayout",
397
+ templates: "FolderTemplate",
398
+ template: "FolderTemplate",
399
+ hooks: "FolderHook",
400
+ hook: "FolderHook",
401
+ store: "FolderStore",
402
+ stores: "FolderStore",
403
+ state: "FolderNgrxStore",
404
+ reducers: "FolderReduxReducer",
405
+ reducer: "FolderReduxReducer",
406
+ services: "FolderApi",
407
+ service: "FolderApi",
408
+ api: "FolderApi",
409
+ apis: "FolderApi",
410
+ routes: "FolderRoutes",
411
+ route: "FolderRoutes",
412
+ routing: "FolderRoutes",
413
+ middleware: "FolderMiddleware",
414
+ middlewares: "FolderMiddleware",
415
+ controllers: "FolderController",
416
+ controller: "FolderController",
417
+ models: "FolderDatabase",
418
+ model: "FolderDatabase",
419
+ schemas: "FolderDatabase",
420
+ schema: "FolderDatabase",
421
+ migrations: "FolderDatabase",
422
+ migration: "FolderDatabase",
423
+ seeders: "FolderSeeders",
424
+ seeder: "FolderSeeders",
425
+
426
+ // TypeScript
427
+ types: "FolderTypescript",
428
+ typing: "FolderTypescript",
429
+ typings: "FolderTypescript",
430
+ "@types": "FolderTypescript",
431
+ interfaces: "FolderInterface",
432
+ interface: "FolderInterface",
433
+
434
+ // Mobile
435
+ android: "FolderAndroid",
436
+ ios: "FolderIos",
437
+ mobile: "FolderMobile",
438
+ flutter: "FolderFlutter",
439
+
440
+ // Infrastructure
441
+ kubernetes: "FolderKubernetes",
442
+ k8s: "FolderKubernetes",
443
+ terraform: "FolderTerraform",
444
+ aws: "FolderAws",
445
+ azure: "FolderAzurePipelines",
446
+ firebase: "FolderFirebase",
447
+ supabase: "FolderSupabase",
448
+ vercel: "FolderVercel",
449
+ netlify: "FolderNetlify",
450
+
451
+ // CI/CD
452
+ ".github": "FolderGithub",
453
+ ".gitlab": "FolderGitlab",
454
+ ".circleci": "FolderCircleci",
455
+ ci: "FolderCi",
456
+ ".ci": "FolderCi",
457
+ workflows: "FolderGhWorkflows",
458
+
459
+ // Git
460
+ ".git": "FolderGit",
461
+
462
+ // Development tools
463
+ ".vscode": "FolderVscode",
464
+ ".idea": "FolderIntellij",
465
+ ".cursor": "FolderCursor",
466
+ ".devcontainer": "FolderContainer",
467
+ ".storybook": "FolderStorybook",
468
+
469
+ // Localization
470
+ i18n: "FolderI18n",
471
+ locales: "FolderI18n",
472
+ locale: "FolderI18n",
473
+ lang: "FolderI18n",
474
+ languages: "FolderI18n",
475
+
476
+ // Other common patterns
477
+ temp: "FolderTemp",
478
+ tmp: "FolderTemp",
479
+ logs: "FolderLog",
480
+ log: "FolderLog",
481
+ backup: "FolderBackup",
482
+ backups: "FolderBackup",
483
+ examples: "FolderExamples",
484
+ example: "FolderExamples",
485
+ demo: "FolderExamples",
486
+ demos: "FolderExamples",
487
+ samples: "FolderExamples",
488
+ sample: "FolderExamples",
489
+ fixtures: "FolderTest",
490
+ mocks: "FolderMock",
491
+ mock: "FolderMock",
492
+ data: "FolderDatabase",
493
+ database: "FolderDatabase",
494
+ db: "FolderDatabase",
495
+ sql: "FolderDatabase",
496
+ prisma: "FolderPrisma",
497
+ drizzle: "FolderDrizzle",
498
+
499
+ // Security
500
+ security: "FolderSecure",
501
+ auth: "FolderSecure",
502
+ authentication: "FolderSecure",
503
+ authorization: "FolderSecure",
504
+ keys: "FolderKeys",
505
+ certs: "FolderKeys",
506
+ certificates: "FolderKeys",
507
+
508
+ // Content
509
+ content: "FolderContent",
510
+ posts: "FolderContent",
511
+ articles: "FolderContent",
512
+ blog: "FolderContent",
513
+
514
+ // Functions
515
+ functions: "FolderFunctions",
516
+ function: "FolderFunctions",
517
+ lambda: "FolderFunctions",
518
+ lambdas: "FolderFunctions",
519
+ serverless: "FolderServerless",
520
+
521
+ // Jobs/tasks
522
+ jobs: "FolderJob",
523
+ job: "FolderJob",
524
+ tasks: "FolderTasks",
525
+ task: "FolderTasks",
526
+ cron: "FolderTasks",
527
+ queue: "FolderQueue",
528
+ queues: "FolderQueue",
529
+
530
+ // Desktop platforms
531
+ desktop: "FolderDesktop",
532
+ windows: "FolderWindows",
533
+ macos: "FolderMacos",
534
+ linux: "FolderLinux",
535
+ },
536
+ defaults: {
537
+ file: "Document",
538
+ folder: "Folder",
539
+ folderOpen: "FolderOpen",
540
+ },
541
+ }
542
+
543
+ const toOpenVariant = (icon: IconName): IconName => {
544
+ if (!icon.startsWith("Folder")) return icon
545
+ if (icon.endsWith("_light")) return icon.replace("_light", "Open_light") as IconName
546
+ if (!icon.endsWith("Open")) return (icon + "Open") as IconName
547
+ return icon
548
+ }
549
+
550
+ const basenameOf = (p: string) => p.split("\\").join("/").split("/").filter(Boolean).pop() ?? ""
551
+
552
+ const folderNameVariants = (name: string) => {
553
+ const n = name.toLowerCase()
554
+ return [n, `.${n}`, `_${n}`, `__${n}__`]
555
+ }
556
+
557
+ const dottedSuffixesDesc = (name: string) => {
558
+ const n = name.toLowerCase()
559
+ const idxs: number[] = []
560
+ for (let i = 0; i < n.length; i++) if (n[i] === ".") idxs.push(i)
561
+ const out = new Set<string>()
562
+ out.add(n) // allow exact whole-name "extensions" like "dockerfile"
563
+ for (const i of idxs) if (i + 1 < n.length) out.add(n.slice(i + 1))
564
+ return Array.from(out).sort((a, b) => b.length - a.length) // longest first
565
+ }
566
+
567
+ export function chooseIconName(path: string, type: "directory" | "file", expanded: boolean): IconName {
568
+ const base = basenameOf(path)
569
+ const baseLower = base.toLowerCase()
570
+
571
+ if (type === "directory") {
572
+ for (const cand of folderNameVariants(baseLower)) {
573
+ const icon = ICON_MAPS.folderNames[cand]
574
+ if (icon) return expanded ? toOpenVariant(icon) : icon
575
+ }
576
+ return expanded ? ICON_MAPS.defaults.folderOpen : ICON_MAPS.defaults.folder
577
+ }
578
+
579
+ const byName = ICON_MAPS.fileNames[baseLower]
580
+ if (byName) return byName
581
+
582
+ for (const ext of dottedSuffixesDesc(baseLower)) {
583
+ const icon = ICON_MAPS.fileExtensions[ext]
584
+ if (icon) return icon
585
+ }
586
+
587
+ return ICON_MAPS.defaults.file
588
+ }