@hoardodile/ui 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +70 -0
  3. package/dist/components/alert.d.ts +13 -0
  4. package/dist/components/alert.js +97 -0
  5. package/dist/components/alert.js.map +1 -0
  6. package/dist/components/app-dialog.d.ts +62 -0
  7. package/dist/components/app-dialog.js +656 -0
  8. package/dist/components/app-dialog.js.map +1 -0
  9. package/dist/components/badge.d.ts +11 -0
  10. package/dist/components/badge.js +70 -0
  11. package/dist/components/badge.js.map +1 -0
  12. package/dist/components/breadcrumb.d.ts +12 -0
  13. package/dist/components/breadcrumb.js +617 -0
  14. package/dist/components/breadcrumb.js.map +1 -0
  15. package/dist/components/button.d.ts +17 -0
  16. package/dist/components/button.js +78 -0
  17. package/dist/components/button.js.map +1 -0
  18. package/dist/components/caption-bar.d.ts +44 -0
  19. package/dist/components/caption-bar.js +827 -0
  20. package/dist/components/caption-bar.js.map +1 -0
  21. package/dist/components/chart-card.d.ts +15 -0
  22. package/dist/components/chart-card.js +27 -0
  23. package/dist/components/chart-card.js.map +1 -0
  24. package/dist/components/checkbox.d.ts +6 -0
  25. package/dist/components/checkbox.js +76 -0
  26. package/dist/components/checkbox.js.map +1 -0
  27. package/dist/components/chip-button.d.ts +28 -0
  28. package/dist/components/chip-button.js +87 -0
  29. package/dist/components/chip-button.js.map +1 -0
  30. package/dist/components/close-confirm-dialog.d.ts +19 -0
  31. package/dist/components/close-confirm-dialog.js +743 -0
  32. package/dist/components/close-confirm-dialog.js.map +1 -0
  33. package/dist/components/color-picker.d.ts +32 -0
  34. package/dist/components/color-picker.js +667 -0
  35. package/dist/components/color-picker.js.map +1 -0
  36. package/dist/components/combobox.d.ts +32 -0
  37. package/dist/components/combobox.js +1211 -0
  38. package/dist/components/combobox.js.map +1 -0
  39. package/dist/components/confirm-by-typing-dialog.d.ts +48 -0
  40. package/dist/components/confirm-by-typing-dialog.js +759 -0
  41. package/dist/components/confirm-by-typing-dialog.js.map +1 -0
  42. package/dist/components/confirm-dialog.d.ts +34 -0
  43. package/dist/components/confirm-dialog.js +710 -0
  44. package/dist/components/confirm-dialog.js.map +1 -0
  45. package/dist/components/count-badge.d.ts +13 -0
  46. package/dist/components/count-badge.js +39 -0
  47. package/dist/components/count-badge.js.map +1 -0
  48. package/dist/components/dialog.d.ts +40 -0
  49. package/dist/components/dialog.js +571 -0
  50. package/dist/components/dialog.js.map +1 -0
  51. package/dist/components/dropdown-menu.d.ts +45 -0
  52. package/dist/components/dropdown-menu.js +1003 -0
  53. package/dist/components/dropdown-menu.js.map +1 -0
  54. package/dist/components/dropdown-select.d.ts +29 -0
  55. package/dist/components/dropdown-select.js +1036 -0
  56. package/dist/components/dropdown-select.js.map +1 -0
  57. package/dist/components/empty.d.ts +15 -0
  58. package/dist/components/empty.js +119 -0
  59. package/dist/components/empty.js.map +1 -0
  60. package/dist/components/filter-rail.d.ts +48 -0
  61. package/dist/components/filter-rail.js +231 -0
  62. package/dist/components/filter-rail.js.map +1 -0
  63. package/dist/components/fixed-action-bar.d.ts +24 -0
  64. package/dist/components/fixed-action-bar.js +48 -0
  65. package/dist/components/fixed-action-bar.js.map +1 -0
  66. package/dist/components/font-picker.d.ts +45 -0
  67. package/dist/components/font-picker.js +759 -0
  68. package/dist/components/font-picker.js.map +1 -0
  69. package/dist/components/form.d.ts +17 -0
  70. package/dist/components/form.js +150 -0
  71. package/dist/components/form.js.map +1 -0
  72. package/dist/components/group-label.d.ts +12 -0
  73. package/dist/components/group-label.js +10 -0
  74. package/dist/components/group-label.js.map +1 -0
  75. package/dist/components/icon-tile.d.ts +16 -0
  76. package/dist/components/icon-tile.js +67 -0
  77. package/dist/components/icon-tile.js.map +1 -0
  78. package/dist/components/icon-toggle.d.ts +24 -0
  79. package/dist/components/icon-toggle.js +81 -0
  80. package/dist/components/icon-toggle.js.map +1 -0
  81. package/dist/components/icon.d.ts +2 -0
  82. package/dist/components/icon.js +49 -0
  83. package/dist/components/icon.js.map +1 -0
  84. package/dist/components/image-crop-panel.d.ts +80 -0
  85. package/dist/components/image-crop-panel.js +1104 -0
  86. package/dist/components/image-crop-panel.js.map +1 -0
  87. package/dist/components/image-cropper.d.ts +63 -0
  88. package/dist/components/image-cropper.js +166 -0
  89. package/dist/components/image-cropper.js.map +1 -0
  90. package/dist/components/input-group.d.ts +22 -0
  91. package/dist/components/input-group.js +270 -0
  92. package/dist/components/input-group.js.map +1 -0
  93. package/dist/components/input.d.ts +16 -0
  94. package/dist/components/input.js +60 -0
  95. package/dist/components/input.js.map +1 -0
  96. package/dist/components/label.d.ts +5 -0
  97. package/dist/components/label.js +40 -0
  98. package/dist/components/label.js.map +1 -0
  99. package/dist/components/list-empty-row.d.ts +16 -0
  100. package/dist/components/list-empty-row.js +40 -0
  101. package/dist/components/list-empty-row.js.map +1 -0
  102. package/dist/components/management-empty.d.ts +14 -0
  103. package/dist/components/management-empty.js +40 -0
  104. package/dist/components/management-empty.js.map +1 -0
  105. package/dist/components/management-skeleton.d.ts +11 -0
  106. package/dist/components/management-skeleton.js +72 -0
  107. package/dist/components/management-skeleton.js.map +1 -0
  108. package/dist/components/meta-chip.d.ts +17 -0
  109. package/dist/components/meta-chip.js +49 -0
  110. package/dist/components/meta-chip.js.map +1 -0
  111. package/dist/components/mobile-drawer.d.ts +29 -0
  112. package/dist/components/mobile-drawer.js +331 -0
  113. package/dist/components/mobile-drawer.js.map +1 -0
  114. package/dist/components/page-header.d.ts +20 -0
  115. package/dist/components/page-header.js +44 -0
  116. package/dist/components/page-header.js.map +1 -0
  117. package/dist/components/page-scaffold.d.ts +34 -0
  118. package/dist/components/page-scaffold.js +157 -0
  119. package/dist/components/page-scaffold.js.map +1 -0
  120. package/dist/components/pagination-bar.d.ts +22 -0
  121. package/dist/components/pagination-bar.js +703 -0
  122. package/dist/components/pagination-bar.js.map +1 -0
  123. package/dist/components/pagination.d.ts +22 -0
  124. package/dist/components/pagination.js +680 -0
  125. package/dist/components/pagination.js.map +1 -0
  126. package/dist/components/panel-toolbar.d.ts +37 -0
  127. package/dist/components/panel-toolbar.js +781 -0
  128. package/dist/components/panel-toolbar.js.map +1 -0
  129. package/dist/components/pill-tabs.d.ts +33 -0
  130. package/dist/components/pill-tabs.js +66 -0
  131. package/dist/components/pill-tabs.js.map +1 -0
  132. package/dist/components/plugin-download-consent.d.ts +52 -0
  133. package/dist/components/plugin-download-consent.js +780 -0
  134. package/dist/components/plugin-download-consent.js.map +1 -0
  135. package/dist/components/popover.d.ts +26 -0
  136. package/dist/components/popover.js +343 -0
  137. package/dist/components/popover.js.map +1 -0
  138. package/dist/components/progress.d.ts +10 -0
  139. package/dist/components/progress.js +103 -0
  140. package/dist/components/progress.js.map +1 -0
  141. package/dist/components/query-state-view.d.ts +36 -0
  142. package/dist/components/query-state-view.js +17 -0
  143. package/dist/components/query-state-view.js.map +1 -0
  144. package/dist/components/radio-group.d.ts +8 -0
  145. package/dist/components/radio-group.js +60 -0
  146. package/dist/components/radio-group.js.map +1 -0
  147. package/dist/components/scroll-area.d.ts +7 -0
  148. package/dist/components/scroll-area.js +80 -0
  149. package/dist/components/scroll-area.js.map +1 -0
  150. package/dist/components/search-field.d.ts +49 -0
  151. package/dist/components/search-field.js +586 -0
  152. package/dist/components/search-field.js.map +1 -0
  153. package/dist/components/secondary-stat.d.ts +13 -0
  154. package/dist/components/secondary-stat.js +56 -0
  155. package/dist/components/secondary-stat.js.map +1 -0
  156. package/dist/components/section-header.d.ts +23 -0
  157. package/dist/components/section-header.js +76 -0
  158. package/dist/components/section-header.js.map +1 -0
  159. package/dist/components/section-label.d.ts +20 -0
  160. package/dist/components/section-label.js +46 -0
  161. package/dist/components/section-label.js.map +1 -0
  162. package/dist/components/section-tabs.d.ts +47 -0
  163. package/dist/components/section-tabs.js +145 -0
  164. package/dist/components/section-tabs.js.map +1 -0
  165. package/dist/components/separator.d.ts +14 -0
  166. package/dist/components/separator.js +49 -0
  167. package/dist/components/separator.js.map +1 -0
  168. package/dist/components/sheet.d.ts +22 -0
  169. package/dist/components/sheet.js +469 -0
  170. package/dist/components/sheet.js.map +1 -0
  171. package/dist/components/sidebar.d.ts +69 -0
  172. package/dist/components/sidebar.js +1645 -0
  173. package/dist/components/sidebar.js.map +1 -0
  174. package/dist/components/skeleton.d.ts +8 -0
  175. package/dist/components/skeleton.js +41 -0
  176. package/dist/components/skeleton.js.map +1 -0
  177. package/dist/components/slider.d.ts +6 -0
  178. package/dist/components/slider.js +75 -0
  179. package/dist/components/slider.js.map +1 -0
  180. package/dist/components/sortable-chip-list.d.ts +26 -0
  181. package/dist/components/sortable-chip-list.js +59 -0
  182. package/dist/components/sortable-chip-list.js.map +1 -0
  183. package/dist/components/spinner.d.ts +5 -0
  184. package/dist/components/spinner.js +65 -0
  185. package/dist/components/spinner.js.map +1 -0
  186. package/dist/components/surface.d.ts +13 -0
  187. package/dist/components/surface.js +51 -0
  188. package/dist/components/surface.js.map +1 -0
  189. package/dist/components/switch.d.ts +8 -0
  190. package/dist/components/switch.js +53 -0
  191. package/dist/components/switch.js.map +1 -0
  192. package/dist/components/table.d.ts +12 -0
  193. package/dist/components/table.js +129 -0
  194. package/dist/components/table.js.map +1 -0
  195. package/dist/components/textarea.d.ts +15 -0
  196. package/dist/components/textarea.js +58 -0
  197. package/dist/components/textarea.js.map +1 -0
  198. package/dist/components/toast.d.ts +19 -0
  199. package/dist/components/toast.js +805 -0
  200. package/dist/components/toast.js.map +1 -0
  201. package/dist/components/toggle.d.ts +12 -0
  202. package/dist/components/toggle.js +63 -0
  203. package/dist/components/toggle.js.map +1 -0
  204. package/dist/components/tooltip.d.ts +9 -0
  205. package/dist/components/tooltip.js +82 -0
  206. package/dist/components/tooltip.js.map +1 -0
  207. package/dist/hooks/use-dialog-footer-actions.d.ts +18 -0
  208. package/dist/hooks/use-dialog-footer-actions.js +11 -0
  209. package/dist/hooks/use-dialog-footer-actions.js.map +1 -0
  210. package/dist/hooks/use-form-field.d.ts +33 -0
  211. package/dist/hooks/use-form-field.js +36 -0
  212. package/dist/hooks/use-form-field.js.map +1 -0
  213. package/dist/hooks/use-mobile.d.ts +34 -0
  214. package/dist/hooks/use-mobile.js +29 -0
  215. package/dist/hooks/use-mobile.js.map +1 -0
  216. package/dist/hooks/use-pinch-pan.d.ts +56 -0
  217. package/dist/hooks/use-pinch-pan.js +223 -0
  218. package/dist/hooks/use-pinch-pan.js.map +1 -0
  219. package/dist/hooks/useMobileBackToClose.d.ts +61 -0
  220. package/dist/hooks/useMobileBackToClose.js +234 -0
  221. package/dist/hooks/useMobileBackToClose.js.map +1 -0
  222. package/dist/icon-BOgL5bpL.d.ts +85 -0
  223. package/dist/icons/actions.d.ts +4 -0
  224. package/dist/icons/actions.js +520 -0
  225. package/dist/icons/actions.js.map +1 -0
  226. package/dist/icons/icon-style.d.ts +2 -0
  227. package/dist/icons/icon-style.js +51 -0
  228. package/dist/icons/icon-style.js.map +1 -0
  229. package/dist/icons/marks.d.ts +15 -0
  230. package/dist/icons/marks.js +48 -0
  231. package/dist/icons/marks.js.map +1 -0
  232. package/dist/icons/registry.d.ts +177 -0
  233. package/dist/icons/registry.js +1180 -0
  234. package/dist/icons/registry.js.map +1 -0
  235. package/dist/index.d.ts +6 -0
  236. package/dist/index.js +653 -0
  237. package/dist/index.js.map +1 -0
  238. package/dist/lib/merge-config.d.ts +15 -0
  239. package/dist/lib/merge-config.js +20 -0
  240. package/dist/lib/merge-config.js.map +1 -0
  241. package/dist/lib/pagination.d.ts +19 -0
  242. package/dist/lib/pagination.js +26 -0
  243. package/dist/lib/pagination.js.map +1 -0
  244. package/dist/lib/utils.d.ts +5 -0
  245. package/dist/lib/utils.js +26 -0
  246. package/dist/lib/utils.js.map +1 -0
  247. package/dist/styles/theme.css +480 -0
  248. package/dist/styles/theme.css.map +1 -0
  249. package/dist/styles/theme.d.ts +2 -0
  250. package/dist/viewport.d.ts +64 -0
  251. package/dist/viewport.js +13 -0
  252. package/dist/viewport.js.map +1 -0
  253. package/package.json +122 -0
  254. package/src/components/alert.tsx +76 -0
  255. package/src/components/app-dialog.tsx +187 -0
  256. package/src/components/badge.tsx +52 -0
  257. package/src/components/breadcrumb.tsx +129 -0
  258. package/src/components/button.tsx +70 -0
  259. package/src/components/caption-bar.test.tsx +151 -0
  260. package/src/components/caption-bar.tsx +392 -0
  261. package/src/components/chart-card.tsx +31 -0
  262. package/src/components/checkbox.tsx +28 -0
  263. package/src/components/chip-button.tsx +69 -0
  264. package/src/components/close-confirm-dialog.tsx +99 -0
  265. package/src/components/color-picker.tsx +186 -0
  266. package/src/components/combobox.tsx +335 -0
  267. package/src/components/confirm-by-typing-dialog.tsx +130 -0
  268. package/src/components/confirm-dialog.test.tsx +39 -0
  269. package/src/components/confirm-dialog.tsx +98 -0
  270. package/src/components/count-badge.tsx +23 -0
  271. package/src/components/dialog.tsx +315 -0
  272. package/src/components/dropdown-menu.tsx +311 -0
  273. package/src/components/dropdown-select.tsx +211 -0
  274. package/src/components/empty.tsx +104 -0
  275. package/src/components/filter-rail.tsx +139 -0
  276. package/src/components/fixed-action-bar.tsx +46 -0
  277. package/src/components/font-picker.tsx +257 -0
  278. package/src/components/form.tsx +127 -0
  279. package/src/components/group-label.tsx +13 -0
  280. package/src/components/icon-tile.tsx +35 -0
  281. package/src/components/icon-toggle.tsx +57 -0
  282. package/src/components/icon.tsx +66 -0
  283. package/src/components/image-crop-panel.test.tsx +167 -0
  284. package/src/components/image-crop-panel.tsx +465 -0
  285. package/src/components/image-cropper.test.tsx +144 -0
  286. package/src/components/image-cropper.tsx +265 -0
  287. package/src/components/input-group.tsx +156 -0
  288. package/src/components/input.tsx +45 -0
  289. package/src/components/label.tsx +20 -0
  290. package/src/components/list-empty-row.tsx +27 -0
  291. package/src/components/management-empty.tsx +25 -0
  292. package/src/components/management-skeleton.tsx +23 -0
  293. package/src/components/meta-chip.tsx +40 -0
  294. package/src/components/mobile-drawer.test.tsx +52 -0
  295. package/src/components/mobile-drawer.tsx +98 -0
  296. package/src/components/page-header.tsx +47 -0
  297. package/src/components/page-scaffold.test.tsx +24 -0
  298. package/src/components/page-scaffold.tsx +131 -0
  299. package/src/components/pagination-bar.test.tsx +87 -0
  300. package/src/components/pagination-bar.tsx +139 -0
  301. package/src/components/pagination.tsx +139 -0
  302. package/src/components/panel-toolbar.tsx +99 -0
  303. package/src/components/pill-tabs.test.tsx +84 -0
  304. package/src/components/pill-tabs.tsx +77 -0
  305. package/src/components/plugin-download-consent.test.tsx +90 -0
  306. package/src/components/plugin-download-consent.tsx +183 -0
  307. package/src/components/popover.tsx +133 -0
  308. package/src/components/progress.tsx +88 -0
  309. package/src/components/query-state-view.tsx +47 -0
  310. package/src/components/radio-group.tsx +36 -0
  311. package/src/components/scroll-area.tsx +52 -0
  312. package/src/components/search-field.test.tsx +86 -0
  313. package/src/components/search-field.tsx +119 -0
  314. package/src/components/secondary-stat.tsx +24 -0
  315. package/src/components/section-header.tsx +54 -0
  316. package/src/components/section-label.tsx +40 -0
  317. package/src/components/section-tabs.test.tsx +154 -0
  318. package/src/components/section-tabs.tsx +190 -0
  319. package/src/components/separator.tsx +38 -0
  320. package/src/components/sheet.tsx +170 -0
  321. package/src/components/sidebar.tsx +725 -0
  322. package/src/components/skeleton.tsx +18 -0
  323. package/src/components/slider.tsx +52 -0
  324. package/src/components/sortable-chip-list.tsx +56 -0
  325. package/src/components/spinner.tsx +35 -0
  326. package/src/components/surface.tsx +37 -0
  327. package/src/components/switch.tsx +30 -0
  328. package/src/components/table.tsx +116 -0
  329. package/src/components/textarea.tsx +41 -0
  330. package/src/components/toast.tsx +239 -0
  331. package/src/components/toggle.tsx +45 -0
  332. package/src/components/tooltip.tsx +64 -0
  333. package/src/hooks/use-dialog-footer-actions.ts +23 -0
  334. package/src/hooks/use-form-field.ts +62 -0
  335. package/src/hooks/use-mobile.ts +54 -0
  336. package/src/hooks/use-pinch-pan.test.tsx +42 -0
  337. package/src/hooks/use-pinch-pan.ts +340 -0
  338. package/src/hooks/useMobileBackToClose.test.tsx +140 -0
  339. package/src/hooks/useMobileBackToClose.ts +508 -0
  340. package/src/icons/actions.ts +10 -0
  341. package/src/icons/icon-style.test.tsx +69 -0
  342. package/src/icons/icon-style.ts +104 -0
  343. package/src/icons/marks.tsx +72 -0
  344. package/src/icons/registry.test.ts +65 -0
  345. package/src/icons/registry.ts +1163 -0
  346. package/src/index.ts +22 -0
  347. package/src/lib/merge-config.test.ts +109 -0
  348. package/src/lib/merge-config.ts +22 -0
  349. package/src/lib/pagination.test.ts +55 -0
  350. package/src/lib/pagination.ts +42 -0
  351. package/src/lib/utils.ts +6 -0
  352. package/src/styles/scan-contract.test.ts +74 -0
  353. package/src/styles/theme.css +798 -0
  354. package/src/test/i18n.tsx +22 -0
  355. package/src/test/setup.ts +104 -0
  356. package/src/viewport.ts +69 -0
@@ -0,0 +1,480 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @import "shadcn/tailwind.css";
4
+
5
+ /* src/styles/theme.css */
6
+ @custom-variant dark (&:is(.dark *));
7
+ @custom-variant desktop-shell (&:is(html.desktop-shell *));
8
+ @theme inline { --text-tiny: 0.6875rem; --text-tiny--line-height: 1rem; --text-ui: 0.8125rem; --text-ui--line-height: 1.25rem; --text-doc: 1.1875rem; --text-doc--line-height: 1.9; --text-doc-title: 3rem; --text-doc-title--line-height: 1.15; --text-doc-heading: 1.75rem; --text-doc-heading--line-height: 1.3; --text-quote: 1.125rem; --text-quote--line-height: 1.65; --tracking-label: 0.1em; --font-heading: var(--font-sans); --font-doc: Georgia, "Times New Roman", serif; --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Hiragino Sans", "Yu Gothic UI", "Meiryo", sans-serif; --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar: var(--sidebar); --color-ring: var(--ring); --color-input: var(--input); --color-border: var(--border); --color-border-strong: var(--border-strong); --color-destructive: var(--destructive); --color-accent-foreground: var(--accent-foreground); --color-accent: var(--accent); --color-muted-foreground: var(--muted-foreground); --color-muted: var(--muted); --color-secondary-foreground: var(--secondary-foreground); --color-secondary: var(--secondary); --color-primary-foreground: var(--primary-foreground); --color-primary: var(--primary); --color-popover-foreground: var(--popover-foreground); --color-popover: var(--popover); --color-card-foreground: var(--card-foreground); --color-card: var(--card); --color-foreground: var(--foreground); --color-background: var(--background); --color-chart: var(--icon-tone, var(--foreground)); --color-icon-tone: var(--icon-tone, var(--foreground)); --radius: 0.625rem; --radius-sm: calc(var(--radius) * 0.6); --radius-md: calc(var(--radius) * 0.8); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) * 1.2); --radius-2xl: calc(var(--radius) * 1.8); --radius-3xl: calc(var(--radius) * 2.2); --radius-4xl: calc(var(--radius) * 2.6); --shadow-card: 0 1px 3px rgb(0 0 0 / 0.04); --shadow-dialog: 0 1px 2px rgb(0 0 0 / 0.04), 0 24px 48px -16px rgb(0 0 0 / 0.16); --container-reading: 680px; --container-medium: 800px; --container-content: 1200px; --spacing-chip: 1.75rem; --spacing-control: 2rem; --spacing-nav: 2.375rem; --spacing-sidebar: 16.5rem; --spacing-panel: 20rem; --duration-1: 100ms; --duration-2: 160ms; --duration-3: 240ms; --duration-4: 320ms; --ease-out: cubic-bezier(0.16, 1, 0.3, 1); --ease-in: cubic-bezier(0.7, 0, 0.84, 0); --ease-standard: cubic-bezier(0.2, 0, 0, 1); --animate-skel: skel 1.6s ease-in-out infinite; @keyframes skel { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } } --animate-pop: pop 240ms cubic-bezier(0.16, 1, 0.3, 1); @keyframes pop { from { opacity: 0; transform: scale(0.8); } } --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; --breakpoint-xl: 80rem; --breakpoint-2xl: 96rem; --breakpoint-sidebar: 1150px; --breakpoint-panel: 1440px; }
9
+ :root {
10
+ --background: #fbfbfb;
11
+ --foreground: #101010;
12
+ --card: #ffffff;
13
+ --card-foreground: #101010;
14
+ --popover: #ffffff;
15
+ --popover-foreground: #101010;
16
+ --primary: #101010;
17
+ --primary-foreground: #ffffff;
18
+ --secondary: #f1f0f1;
19
+ --secondary-foreground: #4a4a48;
20
+ --muted: #f1f0f1;
21
+ --muted-foreground: #9a9a96;
22
+ --accent: #e7e7e9;
23
+ --accent-foreground: #101010;
24
+ --destructive: oklch(0.577 0.245 27.325);
25
+ --destructive-foreground: oklch(1 0 0);
26
+ --border: #eaeaeb;
27
+ --border-strong: #d6d6d8;
28
+ --input: #eaeaeb;
29
+ --ring: oklch(0.4 0 0);
30
+ --sidebar: #fbfbfb;
31
+ --sidebar-foreground: #101010;
32
+ --sidebar-primary: #101010;
33
+ --sidebar-primary-foreground: #ffffff;
34
+ --sidebar-accent: #f1f0f1;
35
+ --sidebar-accent-foreground: #101010;
36
+ --sidebar-border: #eaeaeb;
37
+ --sidebar-ring: oklch(0.4 0 0);
38
+ --shadow-color: oklch(0 0 0);
39
+ }
40
+ .dark {
41
+ --background: oklch(0.12 0 0);
42
+ --foreground: oklch(0.96 0 0);
43
+ --card: oklch(0.16 0 0);
44
+ --card-foreground: oklch(0.96 0 0);
45
+ --popover: oklch(0.18 0 0);
46
+ --popover-foreground: oklch(0.96 0 0);
47
+ --primary: oklch(0.95 0 0);
48
+ --primary-foreground: oklch(0.13 0 0);
49
+ --secondary: oklch(0.18 0 0);
50
+ --secondary-foreground: oklch(0.95 0 0);
51
+ --muted: oklch(0.18 0 0);
52
+ --muted-foreground: oklch(0.65 0 0);
53
+ --accent: oklch(0.22 0 0);
54
+ --accent-foreground: oklch(0.96 0 0);
55
+ --destructive: oklch(0.704 0.191 22.216);
56
+ --destructive-foreground: oklch(0.96 0 0);
57
+ --border: oklch(0.24 0 0);
58
+ --border-strong: oklch(0.28 0 0);
59
+ --input: oklch(0.28 0 0);
60
+ --ring: oklch(0.7 0 0);
61
+ --sidebar: oklch(0.08 0 0);
62
+ --sidebar-foreground: oklch(0.96 0 0);
63
+ --sidebar-primary: oklch(0.95 0 0);
64
+ --sidebar-primary-foreground: oklch(0.13 0 0);
65
+ --sidebar-accent: oklch(0.18 0 0);
66
+ --sidebar-accent-foreground: oklch(0.96 0 0);
67
+ --sidebar-border: oklch(0.24 0 0);
68
+ --sidebar-ring: oklch(0.7 0 0);
69
+ --shadow-color: oklch(0 0 0);
70
+ }
71
+ .theme-sage {
72
+ --background: #f5f6f0;
73
+ --foreground: #212920;
74
+ --card: #eef0ea;
75
+ --card-foreground: #212920;
76
+ --popover: #eef0ea;
77
+ --popover-foreground: #212920;
78
+ --primary: #525f4c;
79
+ --primary-foreground: #f2f4ec;
80
+ --secondary: #e7eae1;
81
+ --secondary-foreground: #55604f;
82
+ --muted: #e7eae1;
83
+ --muted-foreground: #8a9083;
84
+ --accent: #dee2d6;
85
+ --accent-foreground: #212920;
86
+ --destructive: oklch(0.55 0.18 28);
87
+ --destructive-foreground: #fbfbf8;
88
+ --border: #e0e4d9;
89
+ --border-strong: #cdd3c1;
90
+ --input: #e0e4d9;
91
+ --ring: #525f4c;
92
+ --sidebar: #e7eae1;
93
+ --sidebar-foreground: #212920;
94
+ --sidebar-primary: #525f4c;
95
+ --sidebar-primary-foreground: #f2f4ec;
96
+ --sidebar-accent: #dee2d6;
97
+ --sidebar-accent-foreground: #212920;
98
+ --sidebar-border: #e0e4d9;
99
+ --sidebar-ring: #525f4c;
100
+ --icon-tone: #5f6d5b;
101
+ }
102
+ html.dark.theme-sage,
103
+ .dark .theme-sage {
104
+ --background: #0a100e;
105
+ --foreground: #d8cfbf;
106
+ --card: #101a15;
107
+ --card-foreground: #d8cfbf;
108
+ --popover: #152019;
109
+ --popover-foreground: #d8cfbf;
110
+ --primary: #a8bd96;
111
+ --primary-foreground: #101a15;
112
+ --secondary: #152019;
113
+ --secondary-foreground: #a9a79b;
114
+ --muted: #152019;
115
+ --muted-foreground: #7d7e74;
116
+ --accent: #1b2a20;
117
+ --accent-foreground: #ddd7c8;
118
+ --destructive: oklch(0.63 0.155 25);
119
+ --destructive-foreground: #e4e9e0;
120
+ --border: #1d2a22;
121
+ --border-strong: #28392d;
122
+ --input: #1d2a22;
123
+ --ring: #a8bd96;
124
+ --sidebar: #070d0b;
125
+ --sidebar-foreground: #d8cfbf;
126
+ --sidebar-primary: #a8bd96;
127
+ --sidebar-primary-foreground: #101a15;
128
+ --sidebar-accent: #1b2a20;
129
+ --sidebar-accent-foreground: #ddd7c8;
130
+ --sidebar-border: #1d2a22;
131
+ --sidebar-ring: #a8bd96;
132
+ --icon-tone: #75855a;
133
+ }
134
+ .theme-parchment {
135
+ --background: #d9c7a3;
136
+ --foreground: #302202;
137
+ --card: #ccb991;
138
+ --card-foreground: #302202;
139
+ --popover: #ccb991;
140
+ --popover-foreground: #302202;
141
+ --primary: #7d5600;
142
+ --primary-foreground: #f3e8ce;
143
+ --secondary: #c0ac87;
144
+ --secondary-foreground: #6a5a39;
145
+ --muted: #c0ac87;
146
+ --muted-foreground: #9e8c63;
147
+ --accent: #bfa87a;
148
+ --accent-foreground: #302202;
149
+ --destructive: oklch(0.577 0.245 27.325);
150
+ --destructive-foreground: oklch(1 0 0);
151
+ --border: #b7a175;
152
+ --border-strong: #a38c5c;
153
+ --input: #b7a175;
154
+ --ring: #7d5600;
155
+ --sidebar: #c0ac87;
156
+ --sidebar-foreground: #302202;
157
+ --sidebar-primary: #7d5600;
158
+ --sidebar-primary-foreground: #f3e8ce;
159
+ --sidebar-accent: #bfa87a;
160
+ --sidebar-accent-foreground: #302202;
161
+ --sidebar-border: #b7a175;
162
+ --sidebar-ring: #7d5600;
163
+ --icon-tone: #966500;
164
+ }
165
+ html.dark.theme-parchment,
166
+ .dark .theme-parchment {
167
+ --background: #181818;
168
+ --foreground: #b8b8b8;
169
+ --card: #262626;
170
+ --card-foreground: #b8b8b8;
171
+ --popover: #2e2e2e;
172
+ --popover-foreground: #b8b8b8;
173
+ --primary: #d9a856;
174
+ --primary-foreground: #302202;
175
+ --secondary: #2e2e2e;
176
+ --secondary-foreground: #969696;
177
+ --muted: #2e2e2e;
178
+ --muted-foreground: #717171;
179
+ --accent: #3d2a2b;
180
+ --accent-foreground: #b8b8b8;
181
+ --destructive: oklch(0.704 0.191 22.216);
182
+ --destructive-foreground: oklch(0.96 0 0);
183
+ --border: #333333;
184
+ --border-strong: #454545;
185
+ --input: #333333;
186
+ --ring: #d9a856;
187
+ --sidebar: #101010;
188
+ --sidebar-foreground: #b8b8b8;
189
+ --sidebar-primary: #d9a856;
190
+ --sidebar-primary-foreground: #302202;
191
+ --sidebar-accent: #3d2a2b;
192
+ --sidebar-accent-foreground: #b8b8b8;
193
+ --sidebar-border: #333333;
194
+ --sidebar-ring: #d9a856;
195
+ --icon-tone: #966500;
196
+ }
197
+ .theme-azure {
198
+ --background: #fbfbfc;
199
+ --foreground: #161718;
200
+ --card: #ffffff;
201
+ --card-foreground: #161718;
202
+ --popover: #ffffff;
203
+ --popover-foreground: #161718;
204
+ --primary: #0277bd;
205
+ --primary-foreground: #ffffff;
206
+ --secondary: #f0f1f6;
207
+ --secondary-foreground: #5e6267;
208
+ --muted: #f0f1f6;
209
+ --muted-foreground: #95979a;
210
+ --accent: #e3f4fb;
211
+ --accent-foreground: #161718;
212
+ --destructive: oklch(0.577 0.245 27.325);
213
+ --destructive-foreground: oklch(1 0 0);
214
+ --border: #e4e5e7;
215
+ --border-strong: #d0d2d8;
216
+ --input: #e4e5e7;
217
+ --ring: #0277bd;
218
+ --sidebar: #f0f1f6;
219
+ --sidebar-foreground: #161718;
220
+ --sidebar-primary: #0277bd;
221
+ --sidebar-primary-foreground: #ffffff;
222
+ --sidebar-accent: #e3f4fb;
223
+ --sidebar-accent-foreground: #161718;
224
+ --sidebar-border: #e4e5e7;
225
+ --sidebar-ring: #0277bd;
226
+ --icon-tone: #02aeee;
227
+ }
228
+ html.dark.theme-azure,
229
+ .dark .theme-azure {
230
+ --background: #191a1c;
231
+ --foreground: #d7d4d0;
232
+ --card: #202224;
233
+ --card-foreground: #d7d4d0;
234
+ --popover: #292b2d;
235
+ --popover-foreground: #d7d4d0;
236
+ --primary: #02aeee;
237
+ --primary-foreground: #0d1f26;
238
+ --secondary: #292b2d;
239
+ --secondary-foreground: #a7a097;
240
+ --muted: #292b2d;
241
+ --muted-foreground: #8a857d;
242
+ --accent: #1d2c38;
243
+ --accent-foreground: #d7d4d0;
244
+ --destructive: oklch(0.704 0.191 22.216);
245
+ --destructive-foreground: oklch(0.96 0 0);
246
+ --border: #2c2f32;
247
+ --border-strong: #3a3e42;
248
+ --input: #2c2f32;
249
+ --ring: #02aeee;
250
+ --sidebar: #121316;
251
+ --sidebar-foreground: #d7d4d0;
252
+ --sidebar-primary: #02aeee;
253
+ --sidebar-primary-foreground: #0d1f26;
254
+ --sidebar-accent: #1d2c38;
255
+ --sidebar-accent-foreground: #d7d4d0;
256
+ --sidebar-border: #2c2f32;
257
+ --sidebar-ring: #02aeee;
258
+ --icon-tone: #008dc0;
259
+ }
260
+ .theme-hoardodile {
261
+ --background: #fbfbfb;
262
+ --foreground: #272822;
263
+ --card: #ffffff;
264
+ --card-foreground: #272822;
265
+ --popover: #ffffff;
266
+ --popover-foreground: #272822;
267
+ --primary: #5f721f;
268
+ --primary-foreground: #f8f8f2;
269
+ --secondary: #edede3;
270
+ --secondary-foreground: #5c5d50;
271
+ --muted: #edede3;
272
+ --muted-foreground: #93917e;
273
+ --accent: #e9f4ce;
274
+ --accent-foreground: #272822;
275
+ --destructive: oklch(0.577 0.245 27.325);
276
+ --destructive-foreground: oklch(1 0 0);
277
+ --border: #e3e3d4;
278
+ --border-strong: #cfcfba;
279
+ --input: #e3e3d4;
280
+ --ring: #5f721f;
281
+ --sidebar: #edede3;
282
+ --sidebar-foreground: #272822;
283
+ --sidebar-primary: #5f721f;
284
+ --sidebar-primary-foreground: #f8f8f2;
285
+ --sidebar-accent: #e9f4ce;
286
+ --sidebar-accent-foreground: #272822;
287
+ --sidebar-border: #e3e3d4;
288
+ --sidebar-ring: #5f721f;
289
+ --icon-tone: #758a23;
290
+ }
291
+ html.dark.theme-hoardodile,
292
+ .dark .theme-hoardodile {
293
+ --background: #272822;
294
+ --foreground: #f8f8f2;
295
+ --card: #2f3028;
296
+ --card-foreground: #f8f8f2;
297
+ --popover: #34352c;
298
+ --popover-foreground: #f8f8f2;
299
+ --primary: #bcd03b;
300
+ --primary-foreground: #272822;
301
+ --secondary: #34352c;
302
+ --secondary-foreground: #bcbfb0;
303
+ --muted: #34352c;
304
+ --muted-foreground: #75715e;
305
+ --accent: #49483e;
306
+ --accent-foreground: #f8f8f2;
307
+ --destructive: oklch(0.704 0.191 22.216);
308
+ --destructive-foreground: oklch(0.96 0 0);
309
+ --border: #3a3b32;
310
+ --border-strong: #4c4d41;
311
+ --input: #3a3b32;
312
+ --ring: #bcd03b;
313
+ --sidebar: #1f201b;
314
+ --sidebar-foreground: #f8f8f2;
315
+ --sidebar-primary: #bcd03b;
316
+ --sidebar-primary-foreground: #272822;
317
+ --sidebar-accent: #49483e;
318
+ --sidebar-accent-foreground: #f8f8f2;
319
+ --sidebar-border: #3a3b32;
320
+ --sidebar-ring: #bcd03b;
321
+ --icon-tone: #bcd03b;
322
+ }
323
+ .theme-mono {
324
+ --background: #fbfbfb;
325
+ --foreground: #101010;
326
+ --card: #ffffff;
327
+ --card-foreground: #101010;
328
+ --popover: #ffffff;
329
+ --popover-foreground: #101010;
330
+ --primary: #101010;
331
+ --primary-foreground: #ffffff;
332
+ --secondary: #f1f0f1;
333
+ --secondary-foreground: #4a4a48;
334
+ --muted: #f1f0f1;
335
+ --muted-foreground: #9a9a96;
336
+ --accent: #e7e7e9;
337
+ --accent-foreground: #101010;
338
+ --destructive: oklch(0.577 0.245 27.325);
339
+ --destructive-foreground: oklch(1 0 0);
340
+ --border: #eaeaeb;
341
+ --border-strong: #d6d6d8;
342
+ --input: #eaeaeb;
343
+ --ring: oklch(0.4 0 0);
344
+ --sidebar: #fbfbfb;
345
+ --sidebar-foreground: #101010;
346
+ --sidebar-primary: #101010;
347
+ --sidebar-primary-foreground: #ffffff;
348
+ --sidebar-accent: #f1f0f1;
349
+ --sidebar-accent-foreground: #101010;
350
+ --sidebar-border: #eaeaeb;
351
+ --sidebar-ring: oklch(0.4 0 0);
352
+ --shadow-color: oklch(0 0 0);
353
+ }
354
+ html.dark.theme-mono,
355
+ .dark .theme-mono {
356
+ --background: oklch(0.12 0 0);
357
+ --foreground: oklch(0.96 0 0);
358
+ --card: oklch(0.16 0 0);
359
+ --card-foreground: oklch(0.96 0 0);
360
+ --popover: oklch(0.18 0 0);
361
+ --popover-foreground: oklch(0.96 0 0);
362
+ --primary: oklch(0.95 0 0);
363
+ --primary-foreground: oklch(0.13 0 0);
364
+ --secondary: oklch(0.18 0 0);
365
+ --secondary-foreground: oklch(0.95 0 0);
366
+ --muted: oklch(0.18 0 0);
367
+ --muted-foreground: oklch(0.65 0 0);
368
+ --accent: oklch(0.22 0 0);
369
+ --accent-foreground: oklch(0.96 0 0);
370
+ --destructive: oklch(0.704 0.191 22.216);
371
+ --destructive-foreground: oklch(0.96 0 0);
372
+ --border: oklch(0.24 0 0);
373
+ --border-strong: oklch(0.28 0 0);
374
+ --input: oklch(0.28 0 0);
375
+ --ring: oklch(0.7 0 0);
376
+ --sidebar: oklch(0.08 0 0);
377
+ --sidebar-foreground: oklch(0.96 0 0);
378
+ --sidebar-primary: oklch(0.95 0 0);
379
+ --sidebar-primary-foreground: oklch(0.13 0 0);
380
+ --sidebar-accent: oklch(0.18 0 0);
381
+ --sidebar-accent-foreground: oklch(0.96 0 0);
382
+ --sidebar-border: oklch(0.24 0 0);
383
+ --sidebar-ring: oklch(0.7 0 0);
384
+ }
385
+ @layer base {
386
+ * {
387
+ @apply border-border;
388
+ &::-webkit-scrollbar {
389
+ width: 10px;
390
+ height: 10px;
391
+ }
392
+ &::-webkit-scrollbar-track {
393
+ background: transparent;
394
+ }
395
+ &::-webkit-scrollbar-thumb {
396
+ background: color-mix(in oklab, var(--muted-foreground) 28%, transparent);
397
+ border-radius: 8px;
398
+ border: 3px solid transparent;
399
+ background-clip: padding-box;
400
+ }
401
+ &::-webkit-scrollbar-thumb:hover {
402
+ background: color-mix(in oklab, var(--muted-foreground) 45%, transparent);
403
+ background-clip: padding-box;
404
+ }
405
+ }
406
+ ::-webkit-scrollbar {
407
+ width: 10px;
408
+ height: 10px;
409
+ }
410
+ ::-webkit-scrollbar-track {
411
+ background: transparent;
412
+ }
413
+ ::-webkit-scrollbar-thumb {
414
+ background: color-mix(in oklab, var(--muted-foreground) 28%, transparent);
415
+ border-radius: 8px;
416
+ border: 3px solid transparent;
417
+ background-clip: padding-box;
418
+ }
419
+ ::-webkit-scrollbar-thumb:hover {
420
+ background: color-mix(in oklab, var(--muted-foreground) 45%, transparent);
421
+ background-clip: padding-box;
422
+ }
423
+ ::-webkit-scrollbar-button {
424
+ display: none;
425
+ }
426
+ @supports not selector(::-webkit-scrollbar) {
427
+ * {
428
+ scrollbar-width: thin;
429
+ scrollbar-color: color-mix(in oklab, var(--muted-foreground) 28%, transparent) transparent;
430
+ }
431
+ }
432
+ body {
433
+ @apply text-foreground;
434
+ }
435
+ html {
436
+ @apply font-sans;
437
+ }
438
+ html:lang(zh) .text-tiny {
439
+ font-size: 0.75rem;
440
+ }
441
+ button {
442
+ appearance: none;
443
+ border: 0;
444
+ background: transparent;
445
+ padding: 0;
446
+ color: inherit;
447
+ font: inherit;
448
+ text-align: inherit;
449
+ border-radius: 0;
450
+ cursor: pointer;
451
+ }
452
+ button:disabled {
453
+ cursor: default;
454
+ }
455
+ }
456
+ @utility no-scrollbar { scrollbar-width: none; &::-webkit-scrollbar { display: none; } }
457
+ @utility strip-scroll { &::-webkit-scrollbar { width: 4px; height: 4px; } &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 2px; } &::-webkit-scrollbar-button { display: none; } @supports not selector(::-webkit-scrollbar) { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; } }
458
+ :root {
459
+ --solar-size: 1em;
460
+ }
461
+ .hd-icon {
462
+ --solar-secondary-color: var(--icon-tone);
463
+ }
464
+ [data-icon-style=grayscale] .hd-icon {
465
+ --solar-secondary-color: currentColor;
466
+ }
467
+ @source "../**/*.{js,ts,tsx}";
468
+ @keyframes enter {
469
+ from {
470
+ opacity: var(--tw-enter-opacity, 1);
471
+ transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));
472
+ }
473
+ }
474
+ @keyframes exit {
475
+ to {
476
+ opacity: var(--tw-exit-opacity, 1);
477
+ transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));
478
+ }
479
+ }
480
+ /*# sourceMappingURL=theme.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/styles/theme.css"],"sourcesContent":["@import \"tailwindcss\";\n@import \"tw-animate-css\";\n@import \"shadcn/tailwind.css\";\n\n@custom-variant dark (&:is(.dark *));\n/* Same shape as `dark`, so it stacks (`desktop-shell:sidebar:`,\n `desktop-shell:md:`). Electron app minWidth is 800px, so `max-md:`\n never matches in the shell. */\n@custom-variant desktop-shell (&:is(html.desktop-shell *));\n\n@theme inline {\n\t/* Type scale (DESIGN.md — Typography) — layout constants. */\n\t--text-tiny: 0.6875rem;\n\t--text-tiny--line-height: 1rem;\n\t--text-ui: 0.8125rem;\n\t--text-ui--line-height: 1.25rem;\n\t--text-doc: 1.1875rem;\n\t--text-doc--line-height: 1.9;\n\t--text-doc-title: 3rem;\n\t--text-doc-title--line-height: 1.15;\n\t--text-doc-heading: 1.75rem;\n\t--text-doc-heading--line-height: 1.3;\n\t--text-quote: 1.125rem;\n\t--text-quote--line-height: 1.65;\n\t--tracking-label: 0.1em;\n\t--font-heading: var(--font-sans);\n\t/* Doc serif — the documents feature's reading serif; per-slot overrides\n\t (user font prefs) live in the app's CSS variables. */\n\t--font-doc: Georgia, \"Times New Roman\", serif;\n\t/* UI stack (-apple-system … Arial) plus CJK fallbacks. Keep in sync\n\t with SYSTEM_FONT_TAGS in apps/web/src/lib/fonts.ts. */\n\t--font-sans:\n\t\t-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\",\n\t\tArial, \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\",\n\t\t\"Hiragino Sans\", \"Yu Gothic UI\", \"Meiryo\", sans-serif;\n\t--color-sidebar-ring: var(--sidebar-ring);\n\t--color-sidebar-border: var(--sidebar-border);\n\t--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n\t--color-sidebar-accent: var(--sidebar-accent);\n\t--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n\t--color-sidebar-primary: var(--sidebar-primary);\n\t--color-sidebar-foreground: var(--sidebar-foreground);\n\t--color-sidebar: var(--sidebar);\n\t--color-ring: var(--ring);\n\t--color-input: var(--input);\n\t--color-border: var(--border);\n\t--color-border-strong: var(--border-strong);\n\t--color-destructive: var(--destructive);\n\t--color-accent-foreground: var(--accent-foreground);\n\t--color-accent: var(--accent);\n\t--color-muted-foreground: var(--muted-foreground);\n\t--color-muted: var(--muted);\n\t--color-secondary-foreground: var(--secondary-foreground);\n\t--color-secondary: var(--secondary);\n\t--color-primary-foreground: var(--primary-foreground);\n\t--color-primary: var(--primary);\n\t--color-popover-foreground: var(--popover-foreground);\n\t--color-popover: var(--popover);\n\t--color-card-foreground: var(--card-foreground);\n\t--color-card: var(--card);\n\t--color-foreground: var(--foreground);\n\t--color-background: var(--background);\n\t/* Chart ink — data ink follows the palette hue (--icon-tone), falling\n\t back to plain foreground ink in mono, which defines no hue. Same\n\t fallback chain as the duotone icon second tone (`--color-icon-tone`). */\n\t--color-chart: var(--icon-tone, var(--foreground));\n\t--color-icon-tone: var(--icon-tone, var(--foreground));\n\t--radius: 0.625rem;\n\t--radius-sm: calc(var(--radius) * 0.6);\n\t--radius-md: calc(var(--radius) * 0.8);\n\t--radius-lg: var(--radius);\n\t--radius-xl: calc(var(--radius) * 1.2);\n\t--radius-2xl: calc(var(--radius) * 1.8);\n\t--radius-3xl: calc(var(--radius) * 2.2);\n\t--radius-4xl: calc(var(--radius) * 2.6);\n\t--shadow-card: 0 1px 3px rgb(0 0 0 / 0.04);\n\t/* Dialog float — the one shadow deeper than `card`: dialogs hover on a\n\t taller surface (scrim + blur below), so the drop has two steps. */\n\t--shadow-dialog:\n\t\t0 1px 2px rgb(0 0 0 / 0.04), 0 24px 48px -16px rgb(0 0 0 / 0.16);\n\n\t/* Content widths (DESIGN.md — Layout) — `--container-*` powers\n\t max-w-reading / max-w-medium / max-w-content. */\n\t--container-reading: 680px;\n\t--container-medium: 800px;\n\t--container-content: 1200px;\n\n\t/* Control heights (DESIGN.md — Layout) — the three interactive\n\t families; spacing theme keys also power the height and size\n\t utilities. */\n\t--spacing-chip: 1.75rem;\n\t--spacing-control: 2rem;\n\t--spacing-nav: 2.375rem;\n\n\t/* Chrome widths (DESIGN.md — Layout) — `--spacing-*` keys power\n\t the width utilities: sidebar 264 fixed left rail, panel 320\n\t contextual right panel (also the 1fr+panel grid columns). */\n\t--spacing-sidebar: 16.5rem;\n\t--spacing-panel: 20rem;\n\n\t/* Motion (DESIGN.md) — four durations, three easings. Faster than\n\t the mainstream OS defaults; chrome lives in 1–3, media gets 4.\n\t `--ease-*` keys also (re)define the matching ease utilities. */\n\t--duration-1: 100ms;\n\t--duration-2: 160ms;\n\t--duration-3: 240ms;\n\t--duration-4: 320ms;\n\t--ease-out: cubic-bezier(0.16, 1, 0.3, 1);\n\t--ease-in: cubic-bezier(0.7, 0, 0.84, 0);\n\t--ease-standard: cubic-bezier(0.2, 0, 0, 1);\n\n\t/* Loading shimmer (skeletons) — a quiet opacity pulse. */\n\t--animate-skel: skel 1.6s ease-in-out infinite;\n\t@keyframes skel {\n\t\t0%,\n\t\t100% {\n\t\t\topacity: 1;\n\t\t}\n\t\t50% {\n\t\t\topacity: 0.55;\n\t\t}\n\t}\n\n\t/* Completion confirmation (DESIGN.md — upload ritual): a quiet\n\t pop, opacity + scale only, no bounce. */\n\t--animate-pop: pop 240ms cubic-bezier(0.16, 1, 0.3, 1);\n\t@keyframes pop {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.8);\n\t\t}\n\t}\n\n\t/* Breakpoints are declared explicitly so the JS mobile detection and\n\t Tailwind responsive prefixes stay in sync. viewport.ts must match:\n\t `MOBILE_BREAKPOINT_PX` ↔ `--breakpoint-md`, `SIDEBAR_BREAKPOINT_PX`\n\t ↔ `--breakpoint-sidebar`, `PANEL_BREAKPOINT_PX` ↔ `--breakpoint-panel`. */\n\t--breakpoint-sm: 40rem;\n\t--breakpoint-md: 48rem;\n\t--breakpoint-lg: 64rem;\n\t--breakpoint-xl: 80rem;\n\t--breakpoint-2xl: 96rem;\n\t--breakpoint-sidebar: 1150px;\n\t--breakpoint-panel: 1440px;\n}\n\n/* ── Mono (default palette) ─────────────────────────────\n Pure black-and-white typography palette: no hue anywhere,\n surfaces stepped only in lightness. Primary is ink black in\n light mode and paper white in dark mode. This is the default\n palette: it lives in `:root` / `.dark` with no class, and the\n `.theme-mono` block further down mirrors it so a local scope\n can explicitly opt back in. */\n\n:root {\n\t--background: #fbfbfb;\n\t--foreground: #101010;\n\t--card: #ffffff;\n\t--card-foreground: #101010;\n\t--popover: #ffffff;\n\t--popover-foreground: #101010;\n\t--primary: #101010;\n\t--primary-foreground: #ffffff;\n\t--secondary: #f1f0f1;\n\t--secondary-foreground: #4a4a48;\n\t--muted: #f1f0f1;\n\t--muted-foreground: #9a9a96;\n\t--accent: #e7e7e9;\n\t--accent-foreground: #101010;\n\t--destructive: oklch(0.577 0.245 27.325);\n\t--destructive-foreground: oklch(1 0 0);\n\t--border: #eaeaeb;\n\t--border-strong: #d6d6d8;\n\t--input: #eaeaeb;\n\t--ring: oklch(0.4 0 0);\n\t--sidebar: #fbfbfb;\n\t--sidebar-foreground: #101010;\n\t--sidebar-primary: #101010;\n\t--sidebar-primary-foreground: #ffffff;\n\t--sidebar-accent: #f1f0f1;\n\t--sidebar-accent-foreground: #101010;\n\t--sidebar-border: #eaeaeb;\n\t--sidebar-ring: oklch(0.4 0 0);\n\t--shadow-color: oklch(0 0 0);\n}\n\n.dark {\n\t--background: oklch(0.12 0 0);\n\t--foreground: oklch(0.96 0 0);\n\t--card: oklch(0.16 0 0);\n\t--card-foreground: oklch(0.96 0 0);\n\t--popover: oklch(0.18 0 0);\n\t--popover-foreground: oklch(0.96 0 0);\n\t--primary: oklch(0.95 0 0);\n\t--primary-foreground: oklch(0.13 0 0);\n\t--secondary: oklch(0.18 0 0);\n\t--secondary-foreground: oklch(0.95 0 0);\n\t--muted: oklch(0.18 0 0);\n\t--muted-foreground: oklch(0.65 0 0);\n\t--accent: oklch(0.22 0 0);\n\t--accent-foreground: oklch(0.96 0 0);\n\t--destructive: oklch(0.704 0.191 22.216);\n\t--destructive-foreground: oklch(0.96 0 0);\n\t--border: oklch(0.24 0 0);\n\t--border-strong: oklch(0.28 0 0);\n\t--input: oklch(0.28 0 0);\n\t--ring: oklch(0.7 0 0);\n\t--sidebar: oklch(0.08 0 0);\n\t--sidebar-foreground: oklch(0.96 0 0);\n\t--sidebar-primary: oklch(0.95 0 0);\n\t--sidebar-primary-foreground: oklch(0.13 0 0);\n\t--sidebar-accent: oklch(0.18 0 0);\n\t--sidebar-accent-foreground: oklch(0.96 0 0);\n\t--sidebar-border: oklch(0.24 0 0);\n\t--sidebar-ring: oklch(0.7 0 0);\n\t--shadow-color: oklch(0 0 0);\n}\n\n/* ── Sage ─────────────────────────────────────────────────\n Quiet sage-green journal palette. Light values anchor on the settings swatches (canvas #f5f6f0,\n ink #212920, accent #5f6d5b); fills are tonal steps of the canvas —\n cards and the sidebar sit slightly deeper than the content area.\n Primary is the accent hue one step deeper, so actions read sage\n instead of ink. Dark flips to warm cream ink on green-black, with a\n light-sage primary.\n ─────────────────────────────────────────────────────────────────── */\n\n.theme-sage {\n\t--background: #f5f6f0;\n\t--foreground: #212920;\n\t--card: #eef0ea;\n\t--card-foreground: #212920;\n\t--popover: #eef0ea;\n\t--popover-foreground: #212920;\n\t--primary: #525f4c;\n\t--primary-foreground: #f2f4ec;\n\t--secondary: #e7eae1;\n\t--secondary-foreground: #55604f;\n\t--muted: #e7eae1;\n\t--muted-foreground: #8a9083;\n\t--accent: #dee2d6;\n\t--accent-foreground: #212920;\n\t--destructive: oklch(0.55 0.18 28);\n\t--destructive-foreground: #fbfbf8;\n\t--border: #e0e4d9;\n\t--border-strong: #cdd3c1;\n\t--input: #e0e4d9;\n\t--ring: #525f4c;\n\t--sidebar: #e7eae1;\n\t--sidebar-foreground: #212920;\n\t--sidebar-primary: #525f4c;\n\t--sidebar-primary-foreground: #f2f4ec;\n\t--sidebar-accent: #dee2d6;\n\t--sidebar-accent-foreground: #212920;\n\t--sidebar-border: #e0e4d9;\n\t--sidebar-ring: #525f4c;\n\t--icon-tone: #5f6d5b;\n}\n\nhtml.dark.theme-sage,\n.dark .theme-sage {\n\t--background: #0a100e;\n\t--foreground: #d8cfbf;\n\t--card: #101a15;\n\t--card-foreground: #d8cfbf;\n\t--popover: #152019;\n\t--popover-foreground: #d8cfbf;\n\t--primary: #a8bd96;\n\t--primary-foreground: #101a15;\n\t--secondary: #152019;\n\t--secondary-foreground: #a9a79b;\n\t--muted: #152019;\n\t--muted-foreground: #7d7e74;\n\t--accent: #1b2a20;\n\t--accent-foreground: #ddd7c8;\n\t--destructive: oklch(0.63 0.155 25);\n\t--destructive-foreground: #e4e9e0;\n\t--border: #1d2a22;\n\t--border-strong: #28392d;\n\t--input: #1d2a22;\n\t--ring: #a8bd96;\n\t--sidebar: #070d0b;\n\t--sidebar-foreground: #d8cfbf;\n\t--sidebar-primary: #a8bd96;\n\t--sidebar-primary-foreground: #101a15;\n\t--sidebar-accent: #1b2a20;\n\t--sidebar-accent-foreground: #ddd7c8;\n\t--sidebar-border: #1d2a22;\n\t--sidebar-ring: #a8bd96;\n\t--icon-tone: #75855a;\n}\n\n/* ── Parchment ───────────────────────────────────────────────\n Straw-paper reader palette — the documents area's default. Light values anchor on the settings\n swatches (canvas #d9c7a3, ink #302202, accent #966500); cards sit\n deeper than the canvas, like panels on paper. Primary is the bronze\n accent deepened for contrast. Dark is the reader's night mode —\n gray surfaces, a light-bronze primary, the accent shifts to red.\n ─────────────────────────────────────────────────────────────────── */\n\n.theme-parchment {\n\t--background: #d9c7a3;\n\t--foreground: #302202;\n\t--card: #ccb991;\n\t--card-foreground: #302202;\n\t--popover: #ccb991;\n\t--popover-foreground: #302202;\n\t--primary: #7d5600;\n\t--primary-foreground: #f3e8ce;\n\t--secondary: #c0ac87;\n\t--secondary-foreground: #6a5a39;\n\t--muted: #c0ac87;\n\t--muted-foreground: #9e8c63;\n\t--accent: #bfa87a;\n\t--accent-foreground: #302202;\n\t--destructive: oklch(0.577 0.245 27.325);\n\t--destructive-foreground: oklch(1 0 0);\n\t--border: #b7a175;\n\t--border-strong: #a38c5c;\n\t--input: #b7a175;\n\t--ring: #7d5600;\n\t--sidebar: #c0ac87;\n\t--sidebar-foreground: #302202;\n\t--sidebar-primary: #7d5600;\n\t--sidebar-primary-foreground: #f3e8ce;\n\t--sidebar-accent: #bfa87a;\n\t--sidebar-accent-foreground: #302202;\n\t--sidebar-border: #b7a175;\n\t--sidebar-ring: #7d5600;\n\t--icon-tone: #966500;\n}\n\nhtml.dark.theme-parchment,\n.dark .theme-parchment {\n\t--background: #181818;\n\t--foreground: #b8b8b8;\n\t--card: #262626;\n\t--card-foreground: #b8b8b8;\n\t--popover: #2e2e2e;\n\t--popover-foreground: #b8b8b8;\n\t--primary: #d9a856;\n\t--primary-foreground: #302202;\n\t--secondary: #2e2e2e;\n\t--secondary-foreground: #969696;\n\t--muted: #2e2e2e;\n\t--muted-foreground: #717171;\n\t--accent: #3d2a2b;\n\t--accent-foreground: #b8b8b8;\n\t--destructive: oklch(0.704 0.191 22.216);\n\t--destructive-foreground: oklch(0.96 0 0);\n\t--border: #333333;\n\t--border-strong: #454545;\n\t--input: #333333;\n\t--ring: #d9a856;\n\t--sidebar: #101010;\n\t--sidebar-foreground: #b8b8b8;\n\t--sidebar-primary: #d9a856;\n\t--sidebar-primary-foreground: #302202;\n\t--sidebar-accent: #3d2a2b;\n\t--sidebar-accent-foreground: #b8b8b8;\n\t--sidebar-border: #333333;\n\t--sidebar-ring: #d9a856;\n\t--icon-tone: #966500;\n}\n\n/* ── Azure ──────────────────────────────────────────────────\n Cool paper-white surfaces with a sky-blue accent. Light values anchor\n on the settings swatches\n (canvas #fbfbfc, ink #161718, accent #02aeee); fills lean cool.\n Primary is the sky blue deepened enough to carry white text; dark\n mode runs the accent blue itself with dark ink.\n ─────────────────────────────────────────────────────────────────── */\n\n.theme-azure {\n\t--background: #fbfbfc;\n\t--foreground: #161718;\n\t--card: #ffffff;\n\t--card-foreground: #161718;\n\t--popover: #ffffff;\n\t--popover-foreground: #161718;\n\t--primary: #0277bd;\n\t--primary-foreground: #ffffff;\n\t--secondary: #f0f1f6;\n\t--secondary-foreground: #5e6267;\n\t--muted: #f0f1f6;\n\t--muted-foreground: #95979a;\n\t--accent: #e3f4fb;\n\t--accent-foreground: #161718;\n\t--destructive: oklch(0.577 0.245 27.325);\n\t--destructive-foreground: oklch(1 0 0);\n\t--border: #e4e5e7;\n\t--border-strong: #d0d2d8;\n\t--input: #e4e5e7;\n\t--ring: #0277bd;\n\t--sidebar: #f0f1f6;\n\t--sidebar-foreground: #161718;\n\t--sidebar-primary: #0277bd;\n\t--sidebar-primary-foreground: #ffffff;\n\t--sidebar-accent: #e3f4fb;\n\t--sidebar-accent-foreground: #161718;\n\t--sidebar-border: #e4e5e7;\n\t--sidebar-ring: #0277bd;\n\t--icon-tone: #02aeee;\n}\n\nhtml.dark.theme-azure,\n.dark .theme-azure {\n\t--background: #191a1c;\n\t--foreground: #d7d4d0;\n\t--card: #202224;\n\t--card-foreground: #d7d4d0;\n\t--popover: #292b2d;\n\t--popover-foreground: #d7d4d0;\n\t--primary: #02aeee;\n\t--primary-foreground: #0d1f26;\n\t--secondary: #292b2d;\n\t--secondary-foreground: #a7a097;\n\t--muted: #292b2d;\n\t--muted-foreground: #8a857d;\n\t--accent: #1d2c38;\n\t--accent-foreground: #d7d4d0;\n\t--destructive: oklch(0.704 0.191 22.216);\n\t--destructive-foreground: oklch(0.96 0 0);\n\t--border: #2c2f32;\n\t--border-strong: #3a3e42;\n\t--input: #2c2f32;\n\t--ring: #02aeee;\n\t--sidebar: #121316;\n\t--sidebar-foreground: #d7d4d0;\n\t--sidebar-primary: #02aeee;\n\t--sidebar-primary-foreground: #0d1f26;\n\t--sidebar-accent: #1d2c38;\n\t--sidebar-accent-foreground: #d7d4d0;\n\t--sidebar-border: #2c2f32;\n\t--sidebar-ring: #02aeee;\n\t--icon-tone: #008dc0;\n}\n\n/* ── Hoardodile ─────────────────────────────────────────────\n The logo palette on mono's bones: the light canvas is mono's neutral #fbfbfb (matching the settings\n swatch; the croc-belly tint survives only as the ink on primary),\n with identity carried by the outline-olive icon tone #758a23 and a\n soft croc-lime selection tint (body #bcd03b; the hat-band gold\n #dcc06f stays in the artwork). Primary is the olive deepened for text\n contrast. Dark mode is olive-black, flipping primary to the raw logo\n lime and the icon tone with it.\n ─────────────────────────────────────────────────────────────────── */\n\n.theme-hoardodile {\n\t--background: #fbfbfb;\n\t--foreground: #272822;\n\t--card: #ffffff;\n\t--card-foreground: #272822;\n\t--popover: #ffffff;\n\t--popover-foreground: #272822;\n\t--primary: #5f721f;\n\t--primary-foreground: #f8f8f2;\n\t--secondary: #edede3;\n\t--secondary-foreground: #5c5d50;\n\t--muted: #edede3;\n\t--muted-foreground: #93917e;\n\t--accent: #e9f4ce;\n\t--accent-foreground: #272822;\n\t--destructive: oklch(0.577 0.245 27.325);\n\t--destructive-foreground: oklch(1 0 0);\n\t--border: #e3e3d4;\n\t--border-strong: #cfcfba;\n\t--input: #e3e3d4;\n\t--ring: #5f721f;\n\t--sidebar: #edede3;\n\t--sidebar-foreground: #272822;\n\t--sidebar-primary: #5f721f;\n\t--sidebar-primary-foreground: #f8f8f2;\n\t--sidebar-accent: #e9f4ce;\n\t--sidebar-accent-foreground: #272822;\n\t--sidebar-border: #e3e3d4;\n\t--sidebar-ring: #5f721f;\n\t--icon-tone: #758a23;\n}\n\nhtml.dark.theme-hoardodile,\n.dark .theme-hoardodile {\n\t--background: #272822;\n\t--foreground: #f8f8f2;\n\t--card: #2f3028;\n\t--card-foreground: #f8f8f2;\n\t--popover: #34352c;\n\t--popover-foreground: #f8f8f2;\n\t--primary: #bcd03b;\n\t--primary-foreground: #272822;\n\t--secondary: #34352c;\n\t--secondary-foreground: #bcbfb0;\n\t--muted: #34352c;\n\t--muted-foreground: #75715e;\n\t--accent: #49483e;\n\t--accent-foreground: #f8f8f2;\n\t--destructive: oklch(0.704 0.191 22.216);\n\t--destructive-foreground: oklch(0.96 0 0);\n\t--border: #3a3b32;\n\t--border-strong: #4c4d41;\n\t--input: #3a3b32;\n\t--ring: #bcd03b;\n\t--sidebar: #1f201b;\n\t--sidebar-foreground: #f8f8f2;\n\t--sidebar-primary: #bcd03b;\n\t--sidebar-primary-foreground: #272822;\n\t--sidebar-accent: #49483e;\n\t--sidebar-accent-foreground: #f8f8f2;\n\t--sidebar-border: #3a3b32;\n\t--sidebar-ring: #bcd03b;\n\t--icon-tone: #bcd03b;\n}\n\n/* ── Mono palette class ───────────────────────────────────────\n Mirrors :root / .dark so a local scope can explicitly opt back\n into the mono palette even when the global theme uses another\n palette.\n ─────────────────────────────────────────────────────────────── */\n\n.theme-mono {\n\t--background: #fbfbfb;\n\t--foreground: #101010;\n\t--card: #ffffff;\n\t--card-foreground: #101010;\n\t--popover: #ffffff;\n\t--popover-foreground: #101010;\n\t--primary: #101010;\n\t--primary-foreground: #ffffff;\n\t--secondary: #f1f0f1;\n\t--secondary-foreground: #4a4a48;\n\t--muted: #f1f0f1;\n\t--muted-foreground: #9a9a96;\n\t--accent: #e7e7e9;\n\t--accent-foreground: #101010;\n\t--destructive: oklch(0.577 0.245 27.325);\n\t--destructive-foreground: oklch(1 0 0);\n\t--border: #eaeaeb;\n\t--border-strong: #d6d6d8;\n\t--input: #eaeaeb;\n\t--ring: oklch(0.4 0 0);\n\t--sidebar: #fbfbfb;\n\t--sidebar-foreground: #101010;\n\t--sidebar-primary: #101010;\n\t--sidebar-primary-foreground: #ffffff;\n\t--sidebar-accent: #f1f0f1;\n\t--sidebar-accent-foreground: #101010;\n\t--sidebar-border: #eaeaeb;\n\t--sidebar-ring: oklch(0.4 0 0);\n\t--shadow-color: oklch(0 0 0);\n}\n\nhtml.dark.theme-mono,\n.dark .theme-mono {\n\t--background: oklch(0.12 0 0);\n\t--foreground: oklch(0.96 0 0);\n\t--card: oklch(0.16 0 0);\n\t--card-foreground: oklch(0.96 0 0);\n\t--popover: oklch(0.18 0 0);\n\t--popover-foreground: oklch(0.96 0 0);\n\t--primary: oklch(0.95 0 0);\n\t--primary-foreground: oklch(0.13 0 0);\n\t--secondary: oklch(0.18 0 0);\n\t--secondary-foreground: oklch(0.95 0 0);\n\t--muted: oklch(0.18 0 0);\n\t--muted-foreground: oklch(0.65 0 0);\n\t--accent: oklch(0.22 0 0);\n\t--accent-foreground: oklch(0.96 0 0);\n\t--destructive: oklch(0.704 0.191 22.216);\n\t--destructive-foreground: oklch(0.96 0 0);\n\t--border: oklch(0.24 0 0);\n\t--border-strong: oklch(0.28 0 0);\n\t--input: oklch(0.28 0 0);\n\t--ring: oklch(0.7 0 0);\n\t--sidebar: oklch(0.08 0 0);\n\t--sidebar-foreground: oklch(0.96 0 0);\n\t--sidebar-primary: oklch(0.95 0 0);\n\t--sidebar-primary-foreground: oklch(0.13 0 0);\n\t--sidebar-accent: oklch(0.18 0 0);\n\t--sidebar-accent-foreground: oklch(0.96 0 0);\n\t--sidebar-border: oklch(0.24 0 0);\n\t--sidebar-ring: oklch(0.7 0 0);\n}\n\n@layer base {\n\t* {\n\t\t@apply border-border;\n\n\t\t/* Thin, quiet scrollbar everywhere (previously doc.css scoped).\n\t\t Chromium styling goes through the ::-webkit-scrollbar pseudos\n\t\t below; the standard `scrollbar-width`/`scrollbar-color` props\n\t\t must NOT be set here — since Chrome 121 they disable all\n\t\t ::-webkit-scrollbar styling on the element, which resurrects\n\t\t the classic Windows scrollbar with arrow buttons. They are\n\t\t applied to Firefox only via the @supports block further down. */\n\t\t&::-webkit-scrollbar {\n\t\t\twidth: 10px;\n\t\t\theight: 10px;\n\t\t}\n\n\t\t&::-webkit-scrollbar-track {\n\t\t\tbackground: transparent;\n\t\t}\n\n\t\t&::-webkit-scrollbar-thumb {\n\t\t\tbackground: color-mix(in oklab, var(--muted-foreground) 28%, transparent);\n\t\t\tborder-radius: 8px;\n\t\t\tborder: 3px solid transparent;\n\t\t\tbackground-clip: padding-box;\n\t\t}\n\n\t\t&::-webkit-scrollbar-thumb:hover {\n\t\t\tbackground: color-mix(in oklab, var(--muted-foreground) 45%, transparent);\n\t\t\tbackground-clip: padding-box;\n\t\t}\n\t}\n\n\t/* Element-scoped selectors above never match the Chromium viewport\n\t scrollbar (it lives outside any element's scope), so the same styling\n\t is repeated on bare pseudo-element selectors — without them the\n\t viewport bar keeps the classic look with arrow buttons. */\n\t::-webkit-scrollbar {\n\t\twidth: 10px;\n\t\theight: 10px;\n\t}\n\n\t::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n\n\t::-webkit-scrollbar-thumb {\n\t\tbackground: color-mix(in oklab, var(--muted-foreground) 28%, transparent);\n\t\tborder-radius: 8px;\n\t\tborder: 3px solid transparent;\n\t\tbackground-clip: padding-box;\n\t}\n\n\t::-webkit-scrollbar-thumb:hover {\n\t\tbackground: color-mix(in oklab, var(--muted-foreground) 45%, transparent);\n\t\tbackground-clip: padding-box;\n\t}\n\n\t::-webkit-scrollbar-button {\n\t\tdisplay: none;\n\t}\n\n\t/* Firefox-only: the standard props are the only styling Firefox\n\t understands, and on `*` they inherit to the root viewport bar.\n\t Chromium must not receive them (see the note on `*` above). */\n\t@supports not selector(::-webkit-scrollbar) {\n\t\t* {\n\t\t\tscrollbar-width: thin;\n\t\t\tscrollbar-color: color-mix(\n\t\t\t\t\tin oklab,\n\t\t\t\t\tvar(--muted-foreground) 28%,\n\t\t\t\t\ttransparent\n\t\t\t\t)\n\t\t\t\ttransparent;\n\t\t}\n\t}\n\n\tbody {\n\t\t@apply text-foreground;\n\t}\n\n\thtml {\n\t\t@apply font-sans;\n\t}\n\n\t/* CJK glyphs are denser than Latin — tiny text reads at 12px instead\n\t of the 11px base so stroke detail survives (DESIGN.md —\n\t Typography). The 12px rule out-ranks the `.text-tiny` utility. */\n\thtml:lang(zh) .text-tiny {\n\t\tfont-size: 0.75rem;\n\t}\n\n\t/* Buttons start clean: UA chrome (appearance, border, background,\n\t padding, centered text) is fully reset so component classes own the\n\t look. The pointer cursor is the base behavior; disabled flips to\n\t the default arrow. */\n\tbutton {\n\t\tappearance: none;\n\t\tborder: 0;\n\t\tbackground: transparent;\n\t\tpadding: 0;\n\t\tcolor: inherit;\n\t\tfont: inherit;\n\t\ttext-align: inherit;\n\t\tborder-radius: 0;\n\t\tcursor: pointer;\n\t}\n\n\tbutton:disabled {\n\t\tcursor: default;\n\t}\n}\n\n/* Hide scrollbars while keeping overflow scrollable — carousel strips,\n tab bars, and command palettes rely on it (tabs.tsx, combobox.tsx,\n command.tsx, sidebar.tsx, the overview marquee). */\n@utility no-scrollbar {\n\tscrollbar-width: none;\n\t&::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n}\n\n/* Strip scrollbar — the rail's chip clouds and settings lists: a 4px\n quiet thumb instead of the 10px base bar (DESIGN.md —\n Scrollbars). Chromium goes through the pseudos; Firefox gets the\n standard props via the @supports block (see the `*` note above). */\n@utility strip-scroll {\n\t&::-webkit-scrollbar {\n\t\twidth: 4px;\n\t\theight: 4px;\n\t}\n\t&::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n\t&::-webkit-scrollbar-thumb {\n\t\tbackground: var(--border-strong);\n\t\tborder-radius: 2px;\n\t}\n\t&::-webkit-scrollbar-button {\n\t\tdisplay: none;\n\t}\n\t@supports not selector(::-webkit-scrollbar) {\n\t\tscrollbar-width: thin;\n\t\tscrollbar-color: var(--border-strong) transparent;\n\t}\n}\n\n/* Duotone icons pick up the palette hue (DESIGN.md — Iconography):\n solar v2 BoldDuotone renders its second tone via the\n `--solar-secondary-color` CSS variable (falling back to currentColor) —\n recolor just that tone per theme by pinning the variable to the palette\n hue on the wrapper's `hd-icon` hook. Mono themes define no --icon-tone,\n so the variable is invalid and the accent falls back to plain ink; the\n Bold (selected) and Linear (monochrome) weights are untouched. */\n:root {\n\t/* solar v2 sizes icons as `1em` × `var(--solar-size, 24px)` — pin the\n\t default to 1em so icon-less sizing matches v1 (class-based tiers rule\n\t everywhere the design system has an opinion). */\n\t--solar-size: 1em;\n}\n\n.hd-icon {\n\t--solar-secondary-color: var(--icon-tone);\n}\n\n/* Grayscale icon mode (Settings → Icons): BoldDuotone keeps its two-tone\n structure, but the second tone never takes the palette hue — it falls\n back to plain ink, whose built-in half opacity reads as gray. Black and\n gray in both light and dark, no extra tokens needed. */\n[data-icon-style=\"grayscale\"] .hd-icon {\n\t--solar-secondary-color: currentColor;\n}\n\n/* Consumers resolve this file from dist/styles/, so the glob must cover the\n tsup ESM outputs in dist/ (plain string literals — class names survive).\n `.tsx` is kept for setups that compile the source tree directly. The\n scan-contract test pins this against the built artifacts. */\n@source \"../**/*.{js,ts,tsx}\";\n\n/* ── Override tw-animate-css keyframes to remove filter:blur which forces\n extra compositor work on mobile WebKit even when blur(0) ── */\n@keyframes enter {\n\tfrom {\n\t\topacity: var(--tw-enter-opacity, 1);\n\t\ttransform: translate3d(\n\t\t\t\tvar(--tw-enter-translate-x, 0),\n\t\t\t\tvar(--tw-enter-translate-y, 0),\n\t\t\t\t0\n\t\t\t)\n\t\t\tscale3d(\n\t\t\t\tvar(--tw-enter-scale, 1),\n\t\t\t\tvar(--tw-enter-scale, 1),\n\t\t\t\tvar(--tw-enter-scale, 1)\n\t\t\t)\n\t\t\trotate(var(--tw-enter-rotate, 0));\n\t}\n}\n\n@keyframes exit {\n\tto {\n\t\topacity: var(--tw-exit-opacity, 1);\n\t\ttransform: translate3d(\n\t\t\t\tvar(--tw-exit-translate-x, 0),\n\t\t\t\tvar(--tw-exit-translate-y, 0),\n\t\t\t\t0\n\t\t\t)\n\t\t\tscale3d(\n\t\t\t\tvar(--tw-exit-scale, 1),\n\t\t\t\tvar(--tw-exit-scale, 1),\n\t\t\t\tvar(--tw-exit-scale, 1)\n\t\t\t)\n\t\t\trotate(var(--tw-exit-rotate, 0));\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Mobile viewport initial-scale factor used across the app shell and
3
+ * plugin iframe previews. Kept in one place so it can be changed
4
+ * without hunting through HTML templates and CSS rules.
5
+ */
6
+ declare const MOBILE_INITIAL_SCALE = 0.8;
7
+ /**
8
+ * Width in pixels at which the app switches from below-md to md+ layouts.
9
+ *
10
+ * This value is intentionally aligned with Tailwind's `md` breakpoint
11
+ * (768 px) so that JS detection and CSS responsive prefixes stay in sync.
12
+ * Components that need to know whether they are in the "below md" viewport
13
+ * should use {@link isBelowMd} or {@link useBelowMd} from @hoardodile/ui/hooks/use-mobile.
14
+ */
15
+ declare const MOBILE_BREAKPOINT_PX = 768;
16
+ /**
17
+ * Same breakpoint expressed in rems, matching Tailwind's default theme
18
+ * (`--breakpoint-md: 48rem`). Useful for CSS media queries and comments.
19
+ */
20
+ declare const MOBILE_BREAKPOINT_REM: number;
21
+ /**
22
+ * Media query string that matches viewports below the `md` breakpoint
23
+ * (< 768 px). Shared between JS hooks and anywhere else that needs to detect
24
+ * a below-md viewport.
25
+ *
26
+ * Keep this in sync with the CSS/Tailwind breakpoint so JS and CSS never
27
+ * disagree about the viewport size.
28
+ */
29
+ declare const MOBILE_QUERY = "(max-width: 767px)";
30
+ /**
31
+ * Width in pixels at which the app switches from a drawer to a fixed left
32
+ * sidebar (the "app shell"). Raised above `md` so mid-size viewports keep
33
+ * the whole width for their content column — below this the sidebar hides
34
+ * behind the hamburger drawer.
35
+ *
36
+ * Use the CSS `sidebar:` / `max-sidebar:` variants (`--breakpoint-sidebar`)
37
+ * at call sites — this value is the single source of truth for both.
38
+ */
39
+ declare const SIDEBAR_BREAKPOINT_PX = 1150;
40
+ /**
41
+ * Media query string that matches viewports below the sidebar breakpoint
42
+ * (`max-sidebar`), i.e. where the shell shows the drawer instead of the fixed
43
+ * sidebar. Shared between JS hooks and anywhere else that needs the
44
+ * below-sidebar viewport.
45
+ */
46
+ declare const SIDEBAR_QUERY = "(max-width: 1149px)";
47
+ /**
48
+ * Width in pixels at which the right filter rail switches from a fixed
49
+ * column to a drawer (DESIGN.md — Layout: "the panel becomes an
50
+ * overlay below 1440px"). Below this the sidebar + panel + content no
51
+ * longer fit comfortably, so the rail hides behind a Filters button.
52
+ *
53
+ * Use the CSS `panel:` / `max-panel:` variants (`--breakpoint-panel`)
54
+ * at call sites — this value is the single source of truth for both.
55
+ */
56
+ declare const PANEL_BREAKPOINT_PX = 1440;
57
+ /**
58
+ * Media query string that matches viewports below the panel breakpoint
59
+ * (< 1440 px), i.e. where the filter rail lives in a drawer. Shared
60
+ * between JS hooks and anywhere else that needs the below-panel viewport.
61
+ */
62
+ declare const PANEL_QUERY = "(max-width: 1439px)";
63
+
64
+ export { MOBILE_BREAKPOINT_PX, MOBILE_BREAKPOINT_REM, MOBILE_INITIAL_SCALE, MOBILE_QUERY, PANEL_BREAKPOINT_PX, PANEL_QUERY, SIDEBAR_BREAKPOINT_PX, SIDEBAR_QUERY };
@@ -0,0 +1,13 @@
1
+ // src/viewport.ts
2
+ var MOBILE_INITIAL_SCALE = 0.8;
3
+ var MOBILE_BREAKPOINT_PX = 768;
4
+ var MOBILE_BREAKPOINT_REM = MOBILE_BREAKPOINT_PX / 16;
5
+ var MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`;
6
+ var SIDEBAR_BREAKPOINT_PX = 1150;
7
+ var SIDEBAR_QUERY = `(max-width: ${SIDEBAR_BREAKPOINT_PX - 1}px)`;
8
+ var PANEL_BREAKPOINT_PX = 1440;
9
+ var PANEL_QUERY = `(max-width: ${PANEL_BREAKPOINT_PX - 1}px)`;
10
+
11
+ export { MOBILE_BREAKPOINT_PX, MOBILE_BREAKPOINT_REM, MOBILE_INITIAL_SCALE, MOBILE_QUERY, PANEL_BREAKPOINT_PX, PANEL_QUERY, SIDEBAR_BREAKPOINT_PX, SIDEBAR_QUERY };
12
+ //# sourceMappingURL=viewport.js.map
13
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/viewport.ts"],"names":[],"mappings":";AAKO,IAAM,oBAAA,GAAuB;AAU7B,IAAM,oBAAA,GAAuB;AAM7B,IAAM,wBAAwB,oBAAA,GAAuB;AAUrD,IAAM,YAAA,GAAe,CAAA,YAAA,EAAe,oBAAA,GAAuB,CAAC,CAAA,GAAA;AAW5D,IAAM,qBAAA,GAAwB;AAQ9B,IAAM,aAAA,GAAgB,CAAA,YAAA,EAAe,qBAAA,GAAwB,CAAC,CAAA,GAAA;AAW9D,IAAM,mBAAA,GAAsB;AAO5B,IAAM,WAAA,GAAc,CAAA,YAAA,EAAe,mBAAA,GAAsB,CAAC,CAAA,GAAA","file":"viewport.js","sourcesContent":["/**\n * Mobile viewport initial-scale factor used across the app shell and\n * plugin iframe previews. Kept in one place so it can be changed\n * without hunting through HTML templates and CSS rules.\n */\nexport const MOBILE_INITIAL_SCALE = 0.8\n\n/**\n * Width in pixels at which the app switches from below-md to md+ layouts.\n *\n * This value is intentionally aligned with Tailwind's `md` breakpoint\n * (768 px) so that JS detection and CSS responsive prefixes stay in sync.\n * Components that need to know whether they are in the \"below md\" viewport\n * should use {@link isBelowMd} or {@link useBelowMd} from @hoardodile/ui/hooks/use-mobile.\n */\nexport const MOBILE_BREAKPOINT_PX = 768\n\n/**\n * Same breakpoint expressed in rems, matching Tailwind's default theme\n * (`--breakpoint-md: 48rem`). Useful for CSS media queries and comments.\n */\nexport const MOBILE_BREAKPOINT_REM = MOBILE_BREAKPOINT_PX / 16\n\n/**\n * Media query string that matches viewports below the `md` breakpoint\n * (< 768 px). Shared between JS hooks and anywhere else that needs to detect\n * a below-md viewport.\n *\n * Keep this in sync with the CSS/Tailwind breakpoint so JS and CSS never\n * disagree about the viewport size.\n */\nexport const MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`\n\n/**\n * Width in pixels at which the app switches from a drawer to a fixed left\n * sidebar (the \"app shell\"). Raised above `md` so mid-size viewports keep\n * the whole width for their content column — below this the sidebar hides\n * behind the hamburger drawer.\n *\n * Use the CSS `sidebar:` / `max-sidebar:` variants (`--breakpoint-sidebar`)\n * at call sites — this value is the single source of truth for both.\n */\nexport const SIDEBAR_BREAKPOINT_PX = 1150\n\n/**\n * Media query string that matches viewports below the sidebar breakpoint\n * (`max-sidebar`), i.e. where the shell shows the drawer instead of the fixed\n * sidebar. Shared between JS hooks and anywhere else that needs the\n * below-sidebar viewport.\n */\nexport const SIDEBAR_QUERY = `(max-width: ${SIDEBAR_BREAKPOINT_PX - 1}px)`\n\n/**\n * Width in pixels at which the right filter rail switches from a fixed\n * column to a drawer (DESIGN.md — Layout: \"the panel becomes an\n * overlay below 1440px\"). Below this the sidebar + panel + content no\n * longer fit comfortably, so the rail hides behind a Filters button.\n *\n * Use the CSS `panel:` / `max-panel:` variants (`--breakpoint-panel`)\n * at call sites — this value is the single source of truth for both.\n */\nexport const PANEL_BREAKPOINT_PX = 1440\n\n/**\n * Media query string that matches viewports below the panel breakpoint\n * (< 1440 px), i.e. where the filter rail lives in a drawer. Shared\n * between JS hooks and anywhere else that needs the below-panel viewport.\n */\nexport const PANEL_QUERY = `(max-width: ${PANEL_BREAKPOINT_PX - 1}px)`\n"]}