@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,14 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M34.9013 7.2002H10.604C9.83641 7.2002 9.09532 7.84723 8.91004 8.66305L4.03999 31.3373C3.85472 32.1532 4.33113 32.8002 5.0987 32.8002H29.396C30.1636 32.8002 30.9047 32.1532 31.09 31.3373L35.96 8.69118C36.1453 7.87536 35.6689 7.2002 34.9013 7.2002Z" fill="url(#paint0_linear_5437_79143)"/>
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M19.7489 26.5009H25.2421C25.8826 26.5009 26.3999 27.0942 26.3999 27.8223C26.3999 28.5505 25.8826 29.1438 25.2421 29.1438H19.7489C19.1085 29.1438 18.5912 28.5505 18.5912 27.8223C18.5912 27.0942 19.1085 26.5009 19.7489 26.5009ZM23.3208 20.6216C23.2222 20.8374 23.0252 21.0531 22.6803 21.3228L12.4575 29.3596C11.8909 29.7911 11.1027 29.6293 10.6593 28.982C10.2405 28.3347 10.339 27.4448 10.881 27.0133L20.0938 19.7047V19.5429L14.305 12.8006C13.837 12.2612 13.8862 11.3713 14.4035 10.8049C14.9455 10.2655 15.7584 10.2655 16.2264 10.8049L23.173 18.8956C23.5917 19.408 23.6163 20.1092 23.3208 20.6216Z" fill="#2C5591"/>
4
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M23.2368 20.6216C23.1387 20.8374 22.9426 21.0531 22.5993 21.3228L12.448 29.3596C11.8841 29.7911 11.0994 29.6293 10.6581 28.982C10.2412 28.3347 10.3393 27.4448 10.8788 27.0133L20.0492 19.7047V19.5429L14.287 12.8006C13.8212 12.2612 13.8702 11.3713 14.3851 10.8049C14.9246 10.2655 15.7337 10.2655 16.1996 10.8049L23.1142 18.8956C23.5311 19.3811 23.5556 20.0822 23.2368 20.6216ZM19.7795 26.6357H25.2475C25.885 26.6357 26.3999 27.202 26.3999 27.8763C26.3999 28.5775 25.885 29.1168 25.2475 29.1168H19.7795C19.142 29.1168 18.6271 28.5505 18.6271 27.8763C18.6271 27.1751 19.142 26.6357 19.7795 26.6357Z" fill="white"/>
5
+ <defs>
6
+ <linearGradient id="paint0_linear_5437_79143" x1="9.76654" y1="10.3425" x2="29.068" y2="26.4694" gradientUnits="userSpaceOnUse">
7
+ <stop stop-color="#2D4664"/>
8
+ <stop offset="0.169" stop-color="#29405B"/>
9
+ <stop offset="0.445" stop-color="#1E2F43"/>
10
+ <stop offset="0.79" stop-color="#0C131B"/>
11
+ <stop offset="1"/>
12
+ </linearGradient>
13
+ </defs>
14
+ </svg>
@@ -0,0 +1,17 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_5436_78897)">
3
+ <path d="M35.911 20.0773C35.911 19.7026 35.552 19.4866 35.1114 19.5939L4.79962 27.0055C4.35812 27.1135 4 27.5052 4 27.8792V35.4541C4 35.8288 4.35812 36.0455 4.79962 35.9375L35.1114 28.5266C35.552 28.4187 35.911 28.0269 35.911 27.6523V20.0774V20.0773Z" fill="url(#paint0_linear_5436_78897)"/>
4
+ <path d="M4 19.8353C4 20.21 4.35812 20.6016 4.79962 20.7097L35.1159 28.1219C35.5573 28.2299 35.9155 28.0133 35.9155 27.6393V20.0637C35.9155 19.6897 35.5573 19.298 35.1159 19.19L4.79962 11.7778C4.35812 11.6699 4 11.8858 4 12.2603V19.8353V19.8353Z" fill="#FF9800"/>
5
+ <path d="M35.911 4.51106C35.911 4.1365 35.552 3.91973 35.1114 4.02778L4.79962 11.4387C4.35812 11.5466 4 11.9383 4 12.313V19.8879C4 20.2626 4.35812 20.4786 4.79962 20.3712L35.1114 12.9596C35.552 12.8517 35.911 12.46 35.911 12.086V4.51106Z" fill="#FF9800"/>
6
+ </g>
7
+ <defs>
8
+ <linearGradient id="paint0_linear_5436_78897" x1="1762.84" y1="981.852" x2="1845.15" y2="624.882" gradientUnits="userSpaceOnUse">
9
+ <stop stop-color="#FF9700"/>
10
+ <stop offset="0.53" stop-color="#F48E00"/>
11
+ <stop offset="1" stop-color="#D06F00"/>
12
+ </linearGradient>
13
+ <clipPath id="clip0_5436_78897">
14
+ <rect width="32" height="32" fill="white" transform="translate(4 4)"/>
15
+ </clipPath>
16
+ </defs>
17
+ </svg>
@@ -0,0 +1,39 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <mask id="mask0_5437_79124" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="30" height="30">
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M26.0227 34.1285C26.2519 34.2179 26.4969 34.2592 26.7427 34.2497C26.9884 34.2403 27.2296 34.1804 27.4512 34.0738L33.3809 31.2206C33.6863 31.0736 33.9439 30.8433 34.1243 30.5563C34.3046 30.2693 34.4002 29.9372 34.4001 29.5983V10.2522C34.4001 9.91323 34.3044 9.58119 34.1241 9.29424C33.9437 9.00729 33.686 8.77709 33.3806 8.63014L27.4518 5.77692C27.1167 5.6157 26.7398 5.56263 26.3733 5.62507C26.0067 5.6875 25.6687 5.86235 25.4059 6.1254L14.0543 16.4807L9.10994 12.7281C8.88691 12.5587 8.61163 12.4728 8.33186 12.4852C8.05209 12.4976 7.78549 12.6076 7.57835 12.7961L5.99262 14.2387C5.86908 14.3511 5.77035 14.488 5.70276 14.6408C5.63517 14.7935 5.60021 14.9587 5.6001 15.1257C5.59999 15.2928 5.63474 15.458 5.70213 15.6108C5.76952 15.7636 5.86807 15.9007 5.99147 16.0133L10.2792 19.9252L5.99176 23.8371C5.86836 23.9497 5.76981 24.0868 5.70242 24.2396C5.63503 24.3925 5.60028 24.5577 5.60039 24.7247C5.60049 24.8917 5.63546 25.0569 5.70305 25.2097C5.77064 25.3624 5.86936 25.4994 5.99291 25.6118L7.57864 27.0547C7.78578 27.2431 8.05237 27.3531 8.33214 27.3655C8.61191 27.3779 8.8872 27.292 9.11022 27.1226L14.0546 23.3694L25.4059 33.7253C25.5814 33.9011 25.7913 34.0384 26.0227 34.1285ZM27.2044 13.3876L18.5918 19.9252L27.2047 26.4631L27.2044 13.3876Z" fill="white"/>
4
+ </mask>
5
+ <g mask="url(#mask0_5437_79124)">
6
+ <path d="M33.3807 8.6342L27.4467 5.77724C27.1116 5.61588 26.7346 5.56266 26.368 5.62494C26.0013 5.68722 25.663 5.86191 25.3999 6.12486L5.97403 23.8369C5.85059 23.9494 5.75201 24.0865 5.68459 24.2393C5.61718 24.3922 5.58241 24.5574 5.58252 24.7245C5.58263 24.8915 5.61761 25.0567 5.68522 25.2094C5.75284 25.3622 5.8516 25.4991 5.97518 25.6115L7.56206 27.0541C7.76938 27.2425 8.03605 27.3524 8.31587 27.3648C8.59569 27.3772 8.87105 27.2913 9.09422 27.1221L32.4879 9.37551C33.2727 8.78022 34.3999 9.3398 34.3999 10.3251V10.2559C34.3999 9.91713 34.3042 9.58524 34.1239 9.2984C33.9436 9.01157 33.686 8.78145 33.3807 8.63449V8.6342Z" fill="#0065A9"/>
7
+ <g filter="url(#filter0_d_5437_79124)">
8
+ <path d="M33.3807 31.2161L27.4467 34.0731C27.1116 34.2345 26.7346 34.2877 26.3679 34.2255C26.0012 34.1632 25.663 33.9885 25.3999 33.7255L5.97403 16.0135C5.85059 15.9009 5.75201 15.7638 5.68459 15.611C5.61718 15.4582 5.58241 15.2929 5.58252 15.1259C5.58263 14.9588 5.61761 14.7937 5.68522 14.6409C5.75284 14.4882 5.8516 14.3512 5.97518 14.2388L7.56206 12.7962C7.76938 12.6079 8.03605 12.498 8.31587 12.4856C8.59569 12.4731 8.87105 12.559 9.09422 12.7282L32.4879 30.4748C33.2727 31.0701 34.3999 30.5105 34.3999 29.5253V29.5944C34.3999 29.9332 34.3042 30.2651 34.1239 30.5519C33.9436 30.8388 33.686 31.0692 33.3807 31.2161Z" fill="#007ACC"/>
9
+ </g>
10
+ <g filter="url(#filter1_d_5437_79124)">
11
+ <path d="M27.447 34.0738C27.1118 34.235 26.7347 34.2881 26.3679 34.2257C26.0012 34.1633 25.6629 33.9884 25.3999 33.7253C26.064 34.3898 27.1999 33.9194 27.1999 32.98V6.87104C27.1999 5.93159 26.064 5.46128 25.3999 6.12541C25.6629 5.86234 26.0012 5.68749 26.3679 5.62506C26.7347 5.56263 27.1118 5.6157 27.447 5.77693L33.3798 8.63044C33.6853 8.77731 33.9432 9.00748 34.1236 9.29443C34.3041 9.58139 34.3999 9.91347 34.3999 10.2525V29.5986C34.3999 29.9376 34.3042 30.2697 34.1238 30.5567C33.9434 30.8437 33.6856 31.0739 33.3801 31.2209L27.447 34.0738Z" fill="#1F9CF0"/>
12
+ </g>
13
+ <path opacity="0.25" fill-rule="evenodd" clip-rule="evenodd" d="M26.0052 34.1285C26.2343 34.2179 26.4793 34.2591 26.7251 34.2497C26.9709 34.2403 27.212 34.1804 27.4336 34.0738L33.3633 31.2206C33.6687 31.0736 33.9265 30.8434 34.1068 30.5564C34.2872 30.2694 34.3829 29.9372 34.3828 29.5983V10.2522C34.3828 9.91323 34.2871 9.58119 34.1068 9.29424C33.9264 9.00729 33.6687 8.77709 33.3633 8.63014L27.4339 5.77692C27.0989 5.6157 26.722 5.56263 26.3554 5.62507C25.9889 5.6875 25.6508 5.86235 25.388 6.1254L14.0367 16.4807L9.09236 12.7281C8.86936 12.5588 8.59413 12.4729 8.31442 12.4853C8.03472 12.4977 7.76818 12.6077 7.56106 12.7961L5.97504 14.2387C5.8515 14.3511 5.75277 14.488 5.68518 14.6408C5.6176 14.7935 5.58263 14.9587 5.58252 15.1257C5.58241 15.2928 5.61716 15.458 5.68456 15.6108C5.75195 15.7636 5.85049 15.9007 5.97389 16.0133L10.2616 19.9252L5.97389 23.8371C5.85049 23.9497 5.75195 24.0868 5.68456 24.2396C5.61716 24.3925 5.58241 24.5577 5.58252 24.7247C5.58263 24.8917 5.6176 25.0569 5.68518 25.2097C5.75277 25.3624 5.8515 25.4994 5.97504 25.6118L7.56106 27.0544C7.76818 27.2428 8.03472 27.3527 8.31442 27.3651C8.59413 27.3775 8.86936 27.2916 9.09236 27.1223L14.0367 23.3697L25.388 33.7256C25.5635 33.9014 25.7737 34.0384 26.0052 34.1285ZM27.1868 13.3876L18.5739 19.9252L27.1868 26.4631V13.3876Z" fill="url(#paint0_linear_5437_79124)" style="mix-blend-mode:overlay"/>
14
+ </g>
15
+ <defs>
16
+ <filter id="filter0_d_5437_79124" x="-7.75188" y="-0.850024" width="55.4862" height="48.4354" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
17
+ <feFlood flood-opacity="0" result="BackgroundImageFix"/>
18
+ <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
19
+ <feOffset/>
20
+ <feGaussianBlur stdDeviation="6.6672"/>
21
+ <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
22
+ <feBlend mode="overlay" in2="BackgroundImageFix" result="effect1_dropShadow_5437_79124"/>
23
+ <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5437_79124" result="shape"/>
24
+ </filter>
25
+ <filter id="filter1_d_5437_79124" x="12.0655" y="-7.73479" width="35.6688" height="55.3202" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
26
+ <feFlood flood-opacity="0" result="BackgroundImageFix"/>
27
+ <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
28
+ <feOffset/>
29
+ <feGaussianBlur stdDeviation="6.6672"/>
30
+ <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
31
+ <feBlend mode="overlay" in2="BackgroundImageFix" result="effect1_dropShadow_5437_79124"/>
32
+ <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5437_79124" result="shape"/>
33
+ </filter>
34
+ <linearGradient id="paint0_linear_5437_79124" x1="19.9825" y1="5.59951" x2="19.9825" y2="34.2509" gradientUnits="userSpaceOnUse">
35
+ <stop stop-color="white"/>
36
+ <stop offset="1" stop-color="white" stop-opacity="0"/>
37
+ </linearGradient>
38
+ </defs>
39
+ </svg>
Binary file
Binary file
@@ -0,0 +1,15 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_5437_79100)">
3
+ <mask id="mask0_5437_79100" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="5" y="5" width="30" height="30">
4
+ <path d="M5.6001 5.59961H34.4001V34.3996H5.6001V5.59961Z" fill="white"/>
5
+ </mask>
6
+ <g mask="url(#mask0_5437_79100)">
7
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M8.3001 7.39961C8.0614 7.39961 7.83248 7.49443 7.6637 7.66321C7.49492 7.832 7.4001 8.06091 7.4001 8.29961V28.0996H5.6001V8.29961C5.6001 7.58352 5.88456 6.89677 6.39091 6.39042C6.89726 5.88407 7.58401 5.59961 8.3001 5.59961H32.4138C33.6165 5.59961 34.2186 7.05371 33.3684 7.90421L18.5166 22.7557H22.7001V20.8996H24.5001V23.206C24.5001 23.5641 24.3579 23.9074 24.1047 24.1606C23.8515 24.4138 23.5081 24.556 23.1501 24.556H16.7166L13.623 27.6496H27.6501V16.3996H29.4501V27.6496C29.4501 28.127 29.2605 28.5848 28.9229 28.9224C28.5853 29.26 28.1275 29.4496 27.6501 29.4496H11.823L8.673 32.5996H31.7001C31.9388 32.5996 32.1677 32.5048 32.3365 32.336C32.5053 32.1672 32.6001 31.9383 32.6001 31.6996V11.8996H34.4001V31.6996C34.4001 32.4157 34.1156 33.1024 33.6093 33.6088C33.1029 34.1151 32.4162 34.3996 31.7001 34.3996H7.5864C6.3837 34.3996 5.7816 32.9455 6.6318 32.095L21.4272 17.2996H17.3001V19.0996H15.5001V16.8496C15.5001 16.4916 15.6423 16.1482 15.8955 15.895C16.1487 15.6418 16.4921 15.4996 16.8501 15.4996H23.2272L26.3772 12.3496H12.3501V23.5996H10.5501V12.3496C10.5501 11.8722 10.7397 11.4144 11.0773 11.0768C11.4149 10.7393 11.8727 10.5496 12.3501 10.5496H28.1772L31.3272 7.39961H8.3001Z" fill="white"/>
8
+ </g>
9
+ </g>
10
+ <defs>
11
+ <clipPath id="clip0_5437_79100">
12
+ <rect width="28.8" height="28.8" fill="white" transform="translate(5.6001 5.59961)"/>
13
+ </clipPath>
14
+ </defs>
15
+ </svg>
@@ -0,0 +1,15 @@
1
+ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_5437_79109)">
3
+ <mask id="mask0_5437_79109" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="5" y="5" width="30" height="30">
4
+ <path d="M5.6001 5.59961H34.4001V34.3996H5.6001V5.59961Z" fill="white"/>
5
+ </mask>
6
+ <g mask="url(#mask0_5437_79109)">
7
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M8.3001 7.39961C8.0614 7.39961 7.83248 7.49443 7.6637 7.66321C7.49492 7.832 7.4001 8.06091 7.4001 8.29961V28.0996H5.6001V8.29961C5.6001 7.58352 5.88456 6.89677 6.39091 6.39042C6.89726 5.88407 7.58401 5.59961 8.3001 5.59961H32.4138C33.6165 5.59961 34.2186 7.05371 33.3684 7.90421L18.5166 22.7557H22.7001V20.8996H24.5001V23.206C24.5001 23.5641 24.3579 23.9074 24.1047 24.1606C23.8515 24.4138 23.5081 24.556 23.1501 24.556H16.7166L13.623 27.6496H27.6501V16.3996H29.4501V27.6496C29.4501 28.127 29.2605 28.5848 28.9229 28.9224C28.5853 29.26 28.1275 29.4496 27.6501 29.4496H11.823L8.673 32.5996H31.7001C31.9388 32.5996 32.1677 32.5048 32.3365 32.336C32.5053 32.1672 32.6001 31.9383 32.6001 31.6996V11.8996H34.4001V31.6996C34.4001 32.4157 34.1156 33.1024 33.6093 33.6088C33.1029 34.1151 32.4162 34.3996 31.7001 34.3996H7.5864C6.3837 34.3996 5.7816 32.9455 6.6318 32.095L21.4272 17.2996H17.3001V19.0996H15.5001V16.8496C15.5001 16.4916 15.6423 16.1482 15.8955 15.895C16.1487 15.6418 16.4921 15.4996 16.8501 15.4996H23.2272L26.3772 12.3496H12.3501V23.5996H10.5501V12.3496C10.5501 11.8722 10.7397 11.4144 11.0773 11.0768C11.4149 10.7393 11.8727 10.5496 12.3501 10.5496H28.1772L31.3272 7.39961H8.3001Z" fill="black"/>
8
+ </g>
9
+ </g>
10
+ <defs>
11
+ <clipPath id="clip0_5437_79109">
12
+ <rect width="28.8" height="28.8" fill="white" transform="translate(5.6001 5.59961)"/>
13
+ </clipPath>
14
+ </defs>
15
+ </svg>
@@ -0,0 +1,123 @@
1
+ [data-component="accordion"] {
2
+ display: flex;
3
+ flex-direction: column;
4
+ align-items: flex-start;
5
+ gap: 0px;
6
+ align-self: stretch;
7
+
8
+ [data-slot="accordion-item"] {
9
+ width: 100%;
10
+ display: flex;
11
+ flex-direction: column;
12
+ align-items: flex-start;
13
+ align-self: stretch;
14
+ overflow: visible;
15
+
16
+ & + [data-slot="accordion-item"] {
17
+ margin-top: -1px;
18
+ }
19
+
20
+ [data-slot="accordion-header"] {
21
+ width: 100%;
22
+ display: flex;
23
+ align-items: center;
24
+ margin: 0;
25
+ padding: 0;
26
+
27
+ [data-slot="accordion-trigger"] {
28
+ width: 100%;
29
+ display: flex;
30
+ height: 32px;
31
+ padding: 8px 12px;
32
+ justify-content: space-between;
33
+ align-items: center;
34
+ align-self: stretch;
35
+ cursor: default;
36
+ user-select: none;
37
+
38
+ background-color: var(--background-stronger);
39
+ border: 1px solid var(--border-weak-base);
40
+ border-radius: 0;
41
+ box-shadow: none;
42
+ overflow: clip;
43
+ color: var(--text-strong);
44
+ transition: background-color 0.15s ease;
45
+
46
+ /* text-12-regular */
47
+ font-family: var(--font-family-sans);
48
+ font-size: var(--font-size-small);
49
+ font-style: normal;
50
+ font-weight: var(--font-weight-regular);
51
+ line-height: var(--line-height-large); /* 166.667% */
52
+ letter-spacing: var(--letter-spacing-normal);
53
+
54
+ &:hover:not([data-disabled]) {
55
+ background-color: var(--surface-base-hover);
56
+ }
57
+ &:active:not([data-disabled]) {
58
+ background-color: var(--surface-base-active);
59
+ }
60
+ &:focus-visible {
61
+ outline: none;
62
+ }
63
+ &[data-disabled] {
64
+ cursor: not-allowed;
65
+ }
66
+ }
67
+ }
68
+
69
+ &:first-child {
70
+ [data-slot="accordion-header"] [data-slot="accordion-trigger"] {
71
+ border-top-left-radius: var(--radius-lg);
72
+ border-top-right-radius: var(--radius-lg);
73
+ }
74
+ }
75
+
76
+ &:last-child:not([data-expanded]) {
77
+ [data-slot="accordion-header"] [data-slot="accordion-trigger"] {
78
+ border-bottom-left-radius: var(--radius-lg);
79
+ border-bottom-right-radius: var(--radius-lg);
80
+ }
81
+ }
82
+
83
+ &[data-expanded] {
84
+ [data-slot="accordion-content"] {
85
+ border: 1px solid var(--border-weak-base);
86
+ border-top: 0;
87
+ background-color: var(--background-stronger);
88
+ }
89
+ }
90
+
91
+ &:last-child[data-expanded] {
92
+ [data-slot="accordion-content"] {
93
+ border-bottom-left-radius: var(--radius-lg);
94
+ border-bottom-right-radius: var(--radius-lg);
95
+ }
96
+ }
97
+
98
+ [data-slot="accordion-content"] {
99
+ overflow: hidden;
100
+ width: 100%;
101
+ border: 0;
102
+ background-color: transparent;
103
+ }
104
+ }
105
+ }
106
+
107
+ @keyframes slideDown {
108
+ from {
109
+ height: 0;
110
+ }
111
+ to {
112
+ height: var(--kb-accordion-content-height);
113
+ }
114
+ }
115
+
116
+ @keyframes slideUp {
117
+ from {
118
+ height: var(--kb-accordion-content-height);
119
+ }
120
+ to {
121
+ height: 0;
122
+ }
123
+ }
@@ -0,0 +1,92 @@
1
+ import { Accordion as Kobalte } from "@kobalte/core/accordion"
2
+ import { splitProps } from "solid-js"
3
+ import type { ComponentProps, ParentProps } from "solid-js"
4
+
5
+ export interface AccordionProps extends ComponentProps<typeof Kobalte> {}
6
+ export interface AccordionItemProps extends ComponentProps<typeof Kobalte.Item> {}
7
+ export interface AccordionHeaderProps extends ComponentProps<typeof Kobalte.Header> {}
8
+ export interface AccordionTriggerProps extends ComponentProps<typeof Kobalte.Trigger> {}
9
+ export interface AccordionContentProps extends ComponentProps<typeof Kobalte.Content> {}
10
+
11
+ function AccordionRoot(props: AccordionProps) {
12
+ const [split, rest] = splitProps(props, ["class", "classList"])
13
+ return (
14
+ <Kobalte
15
+ {...rest}
16
+ data-component="accordion"
17
+ classList={{
18
+ ...split.classList,
19
+ [split.class ?? ""]: !!split.class,
20
+ }}
21
+ />
22
+ )
23
+ }
24
+
25
+ function AccordionItem(props: AccordionItemProps) {
26
+ const [split, rest] = splitProps(props, ["class", "classList"])
27
+ return (
28
+ <Kobalte.Item
29
+ {...rest}
30
+ data-slot="accordion-item"
31
+ classList={{
32
+ ...split.classList,
33
+ [split.class ?? ""]: !!split.class,
34
+ }}
35
+ />
36
+ )
37
+ }
38
+
39
+ function AccordionHeader(props: ParentProps<AccordionHeaderProps>) {
40
+ const [split, rest] = splitProps(props, ["class", "classList", "children"])
41
+ return (
42
+ <Kobalte.Header
43
+ {...rest}
44
+ data-slot="accordion-header"
45
+ classList={{
46
+ ...split.classList,
47
+ [split.class ?? ""]: !!split.class,
48
+ }}
49
+ >
50
+ {split.children}
51
+ </Kobalte.Header>
52
+ )
53
+ }
54
+
55
+ function AccordionTrigger(props: ParentProps<AccordionTriggerProps>) {
56
+ const [split, rest] = splitProps(props, ["class", "classList", "children"])
57
+ return (
58
+ <Kobalte.Trigger
59
+ {...rest}
60
+ data-slot="accordion-trigger"
61
+ classList={{
62
+ ...split.classList,
63
+ [split.class ?? ""]: !!split.class,
64
+ }}
65
+ >
66
+ {split.children}
67
+ </Kobalte.Trigger>
68
+ )
69
+ }
70
+
71
+ function AccordionContent(props: ParentProps<AccordionContentProps>) {
72
+ const [split, rest] = splitProps(props, ["class", "classList", "children"])
73
+ return (
74
+ <Kobalte.Content
75
+ {...rest}
76
+ data-slot="accordion-content"
77
+ classList={{
78
+ ...split.classList,
79
+ [split.class ?? ""]: !!split.class,
80
+ }}
81
+ >
82
+ {split.children}
83
+ </Kobalte.Content>
84
+ )
85
+ }
86
+
87
+ export const Accordion = Object.assign(AccordionRoot, {
88
+ Item: AccordionItem,
89
+ Header: AccordionHeader,
90
+ Trigger: AccordionTrigger,
91
+ Content: AccordionContent,
92
+ })
@@ -0,0 +1,75 @@
1
+ [data-component="animated-number"] {
2
+ display: inline-flex;
3
+ align-items: baseline;
4
+ vertical-align: baseline;
5
+ line-height: inherit;
6
+ font-variant-numeric: tabular-nums;
7
+
8
+ [data-slot="animated-number-value"] {
9
+ display: inline-flex;
10
+ flex-direction: row-reverse;
11
+ align-items: baseline;
12
+ justify-content: flex-end;
13
+ line-height: inherit;
14
+ width: var(--animated-number-width, 1ch);
15
+ overflow: hidden;
16
+ transition: width var(--tool-motion-spring-ms, 560ms) var(--tool-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));
17
+ }
18
+
19
+ [data-slot="animated-number-digit"] {
20
+ display: inline-block;
21
+ width: 1ch;
22
+ height: 1em;
23
+ line-height: 1em;
24
+ overflow: hidden;
25
+ vertical-align: baseline;
26
+ -webkit-mask-image: linear-gradient(
27
+ to bottom,
28
+ transparent 0%,
29
+ #000 var(--tool-motion-mask, 18%),
30
+ #000 calc(100% - var(--tool-motion-mask, 18%)),
31
+ transparent 100%
32
+ );
33
+ mask-image: linear-gradient(
34
+ to bottom,
35
+ transparent 0%,
36
+ #000 var(--tool-motion-mask, 18%),
37
+ #000 calc(100% - var(--tool-motion-mask, 18%)),
38
+ transparent 100%
39
+ );
40
+ -webkit-mask-repeat: no-repeat;
41
+ mask-repeat: no-repeat;
42
+ }
43
+
44
+ [data-slot="animated-number-strip"] {
45
+ display: inline-flex;
46
+ flex-direction: column;
47
+ transform: translateY(calc(var(--animated-number-offset, 10) * -1em));
48
+ transition-property: transform;
49
+ transition-duration: var(--animated-number-duration, 560ms);
50
+ transition-timing-function: var(--tool-motion-ease, cubic-bezier(0.22, 1, 0.36, 1));
51
+ }
52
+
53
+ [data-slot="animated-number-strip"][data-animating="false"] {
54
+ transition-duration: 0ms;
55
+ }
56
+
57
+ [data-slot="animated-number-cell"] {
58
+ display: inline-flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ width: 1ch;
62
+ height: 1em;
63
+ line-height: 1em;
64
+ }
65
+ }
66
+
67
+ @media (prefers-reduced-motion: reduce) {
68
+ [data-component="animated-number"] [data-slot="animated-number-value"] {
69
+ transition-duration: 0ms;
70
+ }
71
+
72
+ [data-component="animated-number"] [data-slot="animated-number-strip"] {
73
+ transition-duration: 0ms;
74
+ }
75
+ }
@@ -0,0 +1,109 @@
1
+ import { For, Index, createEffect, createMemo, on } from "solid-js"
2
+ import { createStore } from "solid-js/store"
3
+
4
+ const TRACK = Array.from({ length: 30 }, (_, index) => index % 10)
5
+ const DURATION = 600
6
+
7
+ function normalize(value: number) {
8
+ return ((value % 10) + 10) % 10
9
+ }
10
+
11
+ function spin(from: number, to: number, direction: 1 | -1) {
12
+ if (from === to) return 0
13
+ if (direction > 0) return (to - from + 10) % 10
14
+ return -((from - to + 10) % 10)
15
+ }
16
+
17
+ function Digit(props: { value: number; direction: 1 | -1 }) {
18
+ const [state, setState] = createStore({
19
+ step: props.value + 10,
20
+ animating: false,
21
+ })
22
+ const step = () => state.step
23
+ const animating = () => state.animating
24
+ let last = props.value
25
+
26
+ createEffect(
27
+ on(
28
+ () => props.value,
29
+ (next) => {
30
+ const delta = spin(last, next, props.direction)
31
+ last = next
32
+ if (!delta) {
33
+ setState("animating", false)
34
+ setState("step", next + 10)
35
+ return
36
+ }
37
+
38
+ setState("animating", true)
39
+ setState("step", (value) => value + delta)
40
+ },
41
+ { defer: true },
42
+ ),
43
+ )
44
+
45
+ return (
46
+ <span data-slot="animated-number-digit">
47
+ <span
48
+ data-slot="animated-number-strip"
49
+ data-animating={animating() ? "true" : "false"}
50
+ onTransitionEnd={() => {
51
+ setState("animating", false)
52
+ setState("step", (value) => normalize(value) + 10)
53
+ }}
54
+ style={{
55
+ "--animated-number-offset": `${step()}`,
56
+ "--animated-number-duration": `var(--tool-motion-odometer-ms, ${DURATION}ms)`,
57
+ }}
58
+ >
59
+ <For each={TRACK}>{(value) => <span data-slot="animated-number-cell">{value}</span>}</For>
60
+ </span>
61
+ </span>
62
+ )
63
+ }
64
+
65
+ export function AnimatedNumber(props: { value: number; class?: string }) {
66
+ const target = createMemo(() => {
67
+ if (!Number.isFinite(props.value)) return 0
68
+ return Math.max(0, Math.round(props.value))
69
+ })
70
+
71
+ const [state, setState] = createStore({
72
+ value: target(),
73
+ direction: 1 as 1 | -1,
74
+ })
75
+ const value = () => state.value
76
+ const direction = () => state.direction
77
+
78
+ createEffect(
79
+ on(
80
+ target,
81
+ (next) => {
82
+ const current = value()
83
+ if (next === current) return
84
+
85
+ setState("direction", next > current ? 1 : -1)
86
+ setState("value", next)
87
+ },
88
+ { defer: true },
89
+ ),
90
+ )
91
+
92
+ const label = createMemo(() => value().toString())
93
+ const digits = createMemo(() =>
94
+ Array.from(label(), (char) => {
95
+ const code = char.charCodeAt(0) - 48
96
+ if (code < 0 || code > 9) return 0
97
+ return code
98
+ }).reverse(),
99
+ )
100
+ const width = createMemo(() => `${digits().length}ch`)
101
+
102
+ return (
103
+ <span data-component="animated-number" class={props.class} aria-label={label()}>
104
+ <span data-slot="animated-number-value" style={{ "--animated-number-width": width() }}>
105
+ <Index each={digits()}>{(digit) => <Digit value={digit()} direction={direction()} />}</Index>
106
+ </span>
107
+ </span>
108
+ )
109
+ }
@@ -0,0 +1,5 @@
1
+ img[data-component="app-icon"] {
2
+ display: block;
3
+ box-sizing: border-box;
4
+ object-fit: contain;
5
+ }
@@ -0,0 +1,85 @@
1
+ import type { Component, ComponentProps } from "solid-js"
2
+ import { createSignal, onCleanup, onMount, splitProps } from "solid-js"
3
+ import type { IconName } from "./app-icons/types"
4
+
5
+ import androidStudio from "../assets/icons/app/android-studio.svg"
6
+ import antigravity from "../assets/icons/app/antigravity.svg"
7
+ import cursor from "../assets/icons/app/cursor.svg"
8
+ import fileExplorer from "../assets/icons/app/file-explorer.svg"
9
+ import finder from "../assets/icons/app/finder.png"
10
+ import ghostty from "../assets/icons/app/ghostty.svg"
11
+ import iterm2 from "../assets/icons/app/iterm2.svg"
12
+ import powershell from "../assets/icons/app/powershell.svg"
13
+ import terminal from "../assets/icons/app/terminal.png"
14
+ import textmate from "../assets/icons/app/textmate.png"
15
+ import vscode from "../assets/icons/app/vscode.svg"
16
+ import warp from "../assets/icons/app/warp.png"
17
+ import xcode from "../assets/icons/app/xcode.png"
18
+ import zed from "../assets/icons/app/zed.svg"
19
+ import zedDark from "../assets/icons/app/zed-dark.svg"
20
+ import sublimetext from "../assets/icons/app/sublimetext.svg"
21
+
22
+ const icons = {
23
+ vscode,
24
+ cursor,
25
+ zed,
26
+ "file-explorer": fileExplorer,
27
+ finder,
28
+ terminal,
29
+ iterm2,
30
+ ghostty,
31
+ warp,
32
+ xcode,
33
+ "android-studio": androidStudio,
34
+ antigravity,
35
+ textmate,
36
+ powershell,
37
+ "sublime-text": sublimetext,
38
+ } satisfies Record<IconName, string>
39
+
40
+ const themed: Partial<Record<IconName, { light: string; dark: string }>> = {
41
+ zed: {
42
+ light: zed,
43
+ dark: zedDark,
44
+ },
45
+ }
46
+
47
+ const scheme = () => {
48
+ if (typeof document !== "object") return "light" as const
49
+ if (document.documentElement.dataset.colorScheme === "dark") return "dark" as const
50
+ return "light" as const
51
+ }
52
+
53
+ export type AppIconProps = Omit<ComponentProps<"img">, "src"> & {
54
+ id: IconName
55
+ }
56
+
57
+ export const AppIcon: Component<AppIconProps> = (props) => {
58
+ const [local, rest] = splitProps(props, ["id", "class", "classList", "alt", "draggable"])
59
+ const [mode, setMode] = createSignal(scheme())
60
+
61
+ onMount(() => {
62
+ const sync = () => setMode(scheme())
63
+ const observer = new MutationObserver(sync)
64
+ observer.observe(document.documentElement, {
65
+ attributes: true,
66
+ attributeFilter: ["data-color-scheme"],
67
+ })
68
+ sync()
69
+ onCleanup(() => observer.disconnect())
70
+ })
71
+
72
+ return (
73
+ <img
74
+ data-component="app-icon"
75
+ {...rest}
76
+ src={themed[local.id]?.[mode()] ?? icons[local.id]}
77
+ alt={local.alt ?? ""}
78
+ draggable={local.draggable ?? false}
79
+ classList={{
80
+ ...local.classList,
81
+ [local.class ?? ""]: !!local.class,
82
+ }}
83
+ />
84
+ )
85
+ }