bref-ui 0.3.0 → 2.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 (359) hide show
  1. package/LICENSE +21 -0
  2. package/cli/commands/add/approve-overwrites.ts +17 -0
  3. package/cli/commands/add/display-changes.ts +11 -0
  4. package/cli/commands/add/index.ts +30 -0
  5. package/cli/commands/add/review-changes.ts +18 -0
  6. package/cli/commands/add/utils.ts +11 -0
  7. package/cli/commands/execute.ts +39 -0
  8. package/cli/commands/index.ts +19 -0
  9. package/cli/commands/init.ts +17 -0
  10. package/cli/commands/parse.ts +24 -0
  11. package/cli/commands/types.ts +2 -0
  12. package/cli/config/read/index.ts +15 -0
  13. package/cli/config/read/normalize-config.ts +21 -0
  14. package/cli/config/read/read-config-file.ts +13 -0
  15. package/cli/config/resolve/index.ts +20 -0
  16. package/cli/config/resolve/resolve-alias-target.ts +17 -0
  17. package/cli/config/resolve/resolve-alias.ts +17 -0
  18. package/cli/config/types.ts +5 -0
  19. package/cli/index.ts +4 -0
  20. package/cli/installation/copy/index.ts +25 -0
  21. package/cli/installation/copy/validate-overwrite-approvals.ts +18 -0
  22. package/cli/installation/copy/write-prepared-files.ts +26 -0
  23. package/cli/installation/exports/collect-exports.ts +19 -0
  24. package/cli/installation/exports/create-additions.ts +26 -0
  25. package/cli/installation/exports/index.ts +27 -0
  26. package/cli/installation/exports/merge-content.ts +12 -0
  27. package/cli/installation/exports/read-declared-export-names.ts +24 -0
  28. package/cli/installation/exports/read-exported-names.ts +21 -0
  29. package/cli/installation/exports/read-index.ts +14 -0
  30. package/cli/installation/exports/read-reexported-names.ts +24 -0
  31. package/cli/installation/exports/types.ts +10 -0
  32. package/cli/installation/exports/utils.ts +54 -0
  33. package/cli/installation/index.ts +35 -0
  34. package/cli/installation/parser/index.ts +29 -0
  35. package/cli/installation/parser/types.ts +12 -0
  36. package/cli/installation/parser/utils.ts +45 -0
  37. package/cli/installation/prepare/collect-source-files.ts +15 -0
  38. package/cli/installation/prepare/index.ts +15 -0
  39. package/cli/installation/prepare/read-source-files.ts +21 -0
  40. package/cli/installation/prepare/rewrite-imports.ts +50 -0
  41. package/cli/installation/prepare/rewrite-source.ts +36 -0
  42. package/cli/installation/prepare/types.ts +7 -0
  43. package/cli/installation/preview/compare-prepared-files.ts +18 -0
  44. package/cli/installation/preview/index.ts +18 -0
  45. package/cli/installation/preview/read-destination-files.ts +25 -0
  46. package/cli/installation/preview/types.ts +9 -0
  47. package/cli/installation/types.ts +15 -0
  48. package/cli/pack.ts +6 -0
  49. package/cli/registry/load/create-registry.ts +25 -0
  50. package/cli/registry/load/discover-manifests.ts +9 -0
  51. package/cli/registry/load/index.ts +21 -0
  52. package/cli/registry/load/load-entry.ts +22 -0
  53. package/cli/registry/load/utils.ts +70 -0
  54. package/cli/registry/load/validate-dependencies.ts +33 -0
  55. package/cli/registry/plan/collect-entries.ts +28 -0
  56. package/cli/registry/plan/index.ts +14 -0
  57. package/cli/registry/types.ts +17 -0
  58. package/dist/button/button.svelte +126 -0
  59. package/dist/button/button.svelte.d.ts +4 -0
  60. package/dist/button/registry.json +6 -0
  61. package/dist/button/types.d.ts +32 -0
  62. package/dist/checkbox/checkbox.svelte +143 -0
  63. package/dist/checkbox/checkbox.svelte.d.ts +4 -0
  64. package/dist/checkbox/registry.json +6 -0
  65. package/dist/checkbox/types.d.ts +6 -0
  66. package/dist/combobox/combobox.svelte +156 -0
  67. package/dist/combobox/combobox.svelte.d.ts +4 -0
  68. package/dist/combobox/form.svelte +61 -0
  69. package/dist/combobox/form.svelte.d.ts +4 -0
  70. package/dist/combobox/input.svelte +132 -0
  71. package/dist/combobox/input.svelte.d.ts +4 -0
  72. package/dist/combobox/list.svelte +78 -0
  73. package/dist/combobox/list.svelte.d.ts +4 -0
  74. package/dist/combobox/option.svelte +77 -0
  75. package/dist/combobox/option.svelte.d.ts +4 -0
  76. package/dist/combobox/registry.json +6 -0
  77. package/dist/combobox/types.d.ts +61 -0
  78. package/dist/dialog/dialog.svelte +182 -0
  79. package/dist/dialog/dialog.svelte.d.ts +4 -0
  80. package/dist/dialog/footer.svelte +26 -0
  81. package/dist/dialog/footer.svelte.d.ts +7 -0
  82. package/dist/dialog/header.svelte +56 -0
  83. package/dist/dialog/header.svelte.d.ts +4 -0
  84. package/dist/dialog/registry.json +6 -0
  85. package/dist/dialog/types.d.ts +31 -0
  86. package/dist/icon/icon.svelte +108 -0
  87. package/dist/icon/icon.svelte.d.ts +4 -0
  88. package/dist/icon/names.d.ts +7 -0
  89. package/dist/icon/registry.json +6 -0
  90. package/dist/icon/types.d.ts +16 -0
  91. package/dist/index.d.ts +20 -2
  92. package/dist/index.js +20 -2
  93. package/dist/pill/content.svelte +23 -0
  94. package/dist/pill/content.svelte.d.ts +4 -0
  95. package/dist/pill/on-delete.svelte +26 -0
  96. package/dist/pill/on-delete.svelte.d.ts +4 -0
  97. package/dist/pill/pill.svelte +200 -0
  98. package/dist/{base/pill → pill}/pill.svelte.d.ts +1 -1
  99. package/dist/pill/registry.json +6 -0
  100. package/dist/pill/types.d.ts +19 -0
  101. package/dist/pill-choice-group/pill-choice-group.svelte +131 -0
  102. package/dist/pill-choice-group/pill-choice-group.svelte.d.ts +4 -0
  103. package/dist/pill-choice-group/registry.json +6 -0
  104. package/dist/pill-choice-group/types.d.ts +13 -0
  105. package/dist/pill-group/container.svelte +40 -0
  106. package/dist/pill-group/container.svelte.d.ts +4 -0
  107. package/dist/pill-group/pill-group.svelte +27 -0
  108. package/dist/pill-group/pill-group.svelte.d.ts +4 -0
  109. package/dist/pill-group/registry.json +6 -0
  110. package/dist/pill-group/types.d.ts +13 -0
  111. package/dist/popover/popover.svelte +86 -0
  112. package/dist/popover/popover.svelte.d.ts +4 -0
  113. package/dist/popover/registry.json +6 -0
  114. package/dist/popover/types.d.ts +8 -0
  115. package/dist/progress/progress.svelte +256 -0
  116. package/dist/progress/progress.svelte.d.ts +4 -0
  117. package/dist/progress/registry.json +6 -0
  118. package/dist/progress/types.d.ts +11 -0
  119. package/dist/select/empty.svelte +25 -0
  120. package/dist/select/empty.svelte.d.ts +4 -0
  121. package/dist/select/list.svelte +27 -0
  122. package/dist/select/list.svelte.d.ts +4 -0
  123. package/dist/select/option.svelte +64 -0
  124. package/dist/select/option.svelte.d.ts +4 -0
  125. package/dist/select/registry.json +6 -0
  126. package/dist/select/select.svelte +70 -0
  127. package/dist/{base/select → select}/select.svelte.d.ts +2 -2
  128. package/dist/select/trigger.svelte +86 -0
  129. package/dist/select/trigger.svelte.d.ts +4 -0
  130. package/dist/select/types.d.ts +31 -0
  131. package/dist/select/types.js +1 -0
  132. package/dist/spinner/registry.json +6 -0
  133. package/dist/spinner/spinner.svelte +114 -0
  134. package/dist/spinner/spinner.svelte.d.ts +4 -0
  135. package/dist/spinner/types.d.ts +6 -0
  136. package/dist/spinner/types.js +1 -0
  137. package/dist/surface/registry.json +6 -0
  138. package/dist/surface/surface.svelte +96 -0
  139. package/dist/surface/surface.svelte.d.ts +4 -0
  140. package/dist/surface/types.d.ts +25 -0
  141. package/dist/surface/types.js +1 -0
  142. package/dist/switch/registry.json +6 -0
  143. package/dist/switch/switch.svelte +162 -0
  144. package/dist/switch/switch.svelte.d.ts +4 -0
  145. package/dist/switch/types.d.ts +8 -0
  146. package/dist/switch/types.js +1 -0
  147. package/dist/text-area/registry.json +8 -0
  148. package/dist/text-area/text-area.svelte +186 -0
  149. package/dist/text-area/text-area.svelte.d.ts +4 -0
  150. package/dist/text-area/types.d.ts +12 -0
  151. package/dist/text-area/types.js +1 -0
  152. package/dist/text-input/registry.json +8 -0
  153. package/dist/text-input/text-input.svelte +189 -0
  154. package/dist/text-input/text-input.svelte.d.ts +4 -0
  155. package/dist/text-input/types.d.ts +11 -0
  156. package/dist/text-input/types.js +1 -0
  157. package/dist/theme/cli-theme.svelte +16 -0
  158. package/dist/theme/cli-theme.svelte.d.ts +7 -0
  159. package/dist/theme/colors.svelte +102 -0
  160. package/dist/theme/colors.svelte.d.ts +4 -0
  161. package/dist/theme/fonts.svelte +10 -0
  162. package/dist/theme/fonts.svelte.d.ts +26 -0
  163. package/dist/theme/registry.json +13 -0
  164. package/dist/theme/styles.svelte +50 -0
  165. package/dist/theme/styles.svelte.d.ts +26 -0
  166. package/dist/theme/surface.d.ts +3 -0
  167. package/dist/theme/surface.js +10 -0
  168. package/dist/theme/surfaces.svelte +208 -0
  169. package/dist/theme/surfaces.svelte.d.ts +18 -0
  170. package/dist/theme/theme-mode-toggle.svelte +9 -0
  171. package/dist/theme/theme-mode-toggle.svelte.d.ts +4 -0
  172. package/dist/theme/theme.svelte +16 -0
  173. package/dist/theme/theme.svelte.d.ts +4 -0
  174. package/dist/theme/types.d.ts +17 -0
  175. package/dist/theme/types.js +1 -0
  176. package/dist/tree-view/registry.json +15 -0
  177. package/dist/tree-view/tree-node/chevron-button.svelte +56 -0
  178. package/dist/tree-view/tree-node/chevron-button.svelte.d.ts +4 -0
  179. package/dist/tree-view/tree-node/content.svelte +62 -0
  180. package/dist/tree-view/tree-node/content.svelte.d.ts +4 -0
  181. package/dist/tree-view/tree-node/delete-button.svelte +52 -0
  182. package/dist/tree-view/tree-node/delete-button.svelte.d.ts +4 -0
  183. package/dist/tree-view/tree-node/tree-node.svelte +111 -0
  184. package/dist/{base/tree-view → tree-view/tree-node}/tree-node.svelte.d.ts +2 -3
  185. package/dist/tree-view/tree-view-section.svelte +42 -0
  186. package/dist/tree-view/tree-view-section.svelte.d.ts +4 -0
  187. package/dist/tree-view/tree-view.svelte +65 -0
  188. package/dist/{base/tree-view → tree-view}/tree-view.svelte.d.ts +2 -2
  189. package/dist/tree-view/types.d.ts +31 -0
  190. package/dist/tree-view/types.js +1 -0
  191. package/dist/types.d.ts +25 -0
  192. package/dist/types.js +1 -0
  193. package/package.json +39 -45
  194. package/readme.md +157 -0
  195. package/src/lib/button/button.svelte +126 -0
  196. package/src/lib/button/registry.json +6 -0
  197. package/src/lib/button/types.ts +42 -0
  198. package/src/lib/checkbox/checkbox.svelte +143 -0
  199. package/src/lib/checkbox/registry.json +6 -0
  200. package/src/lib/checkbox/types.ts +7 -0
  201. package/src/lib/combobox/combobox.svelte +156 -0
  202. package/src/lib/combobox/form.svelte +61 -0
  203. package/src/lib/combobox/input.svelte +132 -0
  204. package/src/lib/combobox/list.svelte +78 -0
  205. package/src/lib/combobox/option.svelte +77 -0
  206. package/src/lib/combobox/registry.json +6 -0
  207. package/src/lib/combobox/types.ts +89 -0
  208. package/src/lib/dialog/dialog.svelte +182 -0
  209. package/src/lib/dialog/footer.svelte +26 -0
  210. package/src/lib/dialog/header.svelte +56 -0
  211. package/src/lib/dialog/registry.json +6 -0
  212. package/src/lib/dialog/types.ts +35 -0
  213. package/src/lib/icon/icon.svelte +108 -0
  214. package/src/lib/icon/names.ts +3794 -0
  215. package/src/lib/icon/registry.json +6 -0
  216. package/src/lib/icon/types.ts +18 -0
  217. package/src/lib/index.ts +20 -0
  218. package/src/lib/pill/content.svelte +23 -0
  219. package/src/lib/pill/on-delete.svelte +26 -0
  220. package/src/lib/pill/pill.svelte +200 -0
  221. package/src/lib/pill/registry.json +6 -0
  222. package/src/lib/pill/types.ts +22 -0
  223. package/src/lib/pill-choice-group/pill-choice-group.svelte +131 -0
  224. package/src/lib/pill-choice-group/registry.json +6 -0
  225. package/src/lib/pill-choice-group/types.ts +14 -0
  226. package/src/lib/pill-group/container.svelte +40 -0
  227. package/src/lib/pill-group/pill-group.svelte +27 -0
  228. package/src/lib/pill-group/registry.json +6 -0
  229. package/src/lib/pill-group/types.ts +15 -0
  230. package/src/lib/popover/popover.svelte +86 -0
  231. package/src/lib/popover/registry.json +6 -0
  232. package/src/lib/popover/types.ts +9 -0
  233. package/src/lib/progress/progress.svelte +256 -0
  234. package/src/lib/progress/registry.json +6 -0
  235. package/src/lib/progress/types.ts +15 -0
  236. package/src/lib/select/empty.svelte +25 -0
  237. package/src/lib/select/list.svelte +27 -0
  238. package/src/lib/select/option.svelte +64 -0
  239. package/src/lib/select/registry.json +6 -0
  240. package/src/lib/select/select.svelte +70 -0
  241. package/src/lib/select/trigger.svelte +86 -0
  242. package/src/lib/select/types.ts +41 -0
  243. package/src/lib/spinner/registry.json +6 -0
  244. package/src/lib/spinner/spinner.svelte +114 -0
  245. package/src/lib/spinner/types.ts +7 -0
  246. package/src/lib/surface/registry.json +6 -0
  247. package/src/lib/surface/surface.svelte +96 -0
  248. package/src/lib/surface/types.ts +28 -0
  249. package/src/lib/switch/registry.json +6 -0
  250. package/src/lib/switch/switch.svelte +162 -0
  251. package/src/lib/switch/types.ts +12 -0
  252. package/src/lib/text-area/registry.json +8 -0
  253. package/src/lib/text-area/text-area.svelte +186 -0
  254. package/src/lib/text-area/types.ts +13 -0
  255. package/src/lib/text-input/registry.json +8 -0
  256. package/src/lib/text-input/text-input.svelte +189 -0
  257. package/src/lib/text-input/types.ts +12 -0
  258. package/src/lib/theme/cli-theme.svelte +16 -0
  259. package/src/lib/theme/colors.svelte +102 -0
  260. package/src/lib/theme/fonts.svelte +10 -0
  261. package/src/lib/theme/registry.json +13 -0
  262. package/src/lib/theme/styles.svelte +50 -0
  263. package/src/lib/theme/surface.ts +18 -0
  264. package/src/lib/theme/surfaces.svelte +208 -0
  265. package/src/lib/theme/theme-mode-toggle.svelte +9 -0
  266. package/src/lib/theme/theme.svelte +16 -0
  267. package/src/lib/theme/types.ts +18 -0
  268. package/src/lib/tree-view/registry.json +15 -0
  269. package/src/lib/tree-view/tree-node/chevron-button.svelte +56 -0
  270. package/src/lib/tree-view/tree-node/content.svelte +62 -0
  271. package/src/lib/tree-view/tree-node/delete-button.svelte +52 -0
  272. package/src/lib/tree-view/tree-node/tree-node.svelte +111 -0
  273. package/src/lib/tree-view/tree-view-section.svelte +42 -0
  274. package/src/lib/tree-view/tree-view.svelte +65 -0
  275. package/src/lib/tree-view/types.ts +39 -0
  276. package/src/lib/types.ts +45 -0
  277. package/README.md +0 -110
  278. package/dist/base/button/button.svelte +0 -260
  279. package/dist/base/button/button.svelte.d.ts +0 -6
  280. package/dist/base/button/icon-button.svelte +0 -226
  281. package/dist/base/button/icon-button.svelte.d.ts +0 -6
  282. package/dist/base/button/index.d.ts +0 -2
  283. package/dist/base/button/index.js +0 -2
  284. package/dist/base/button/types.d.ts +0 -17
  285. package/dist/base/icon/icon.svelte +0 -118
  286. package/dist/base/icon/icon.svelte.d.ts +0 -7
  287. package/dist/base/icon/index.d.ts +0 -2
  288. package/dist/base/icon/index.js +0 -2
  289. package/dist/base/icon/types.d.ts +0 -10
  290. package/dist/base/index.d.ts +0 -12
  291. package/dist/base/index.js +0 -12
  292. package/dist/base/loading/circular-loading.svelte +0 -95
  293. package/dist/base/loading/circular-loading.svelte.d.ts +0 -4
  294. package/dist/base/loading/index.d.ts +0 -4
  295. package/dist/base/loading/index.js +0 -4
  296. package/dist/base/loading/morphing-shapes-loading.svelte +0 -241
  297. package/dist/base/loading/morphing-shapes-loading.svelte.d.ts +0 -4
  298. package/dist/base/loading/pulsing-dots-loading.svelte +0 -115
  299. package/dist/base/loading/pulsing-dots-loading.svelte.d.ts +0 -4
  300. package/dist/base/loading/textual-loading.svelte +0 -179
  301. package/dist/base/loading/textual-loading.svelte.d.ts +0 -4
  302. package/dist/base/loading/types.d.ts +0 -16
  303. package/dist/base/pill/index.d.ts +0 -1
  304. package/dist/base/pill/index.js +0 -1
  305. package/dist/base/pill/pill.svelte +0 -146
  306. package/dist/base/pill/types.d.ts +0 -9
  307. package/dist/base/progress-bar/index.d.ts +0 -1
  308. package/dist/base/progress-bar/index.js +0 -1
  309. package/dist/base/progress-bar/progress-bar.svelte +0 -174
  310. package/dist/base/progress-bar/progress-bar.svelte.d.ts +0 -4
  311. package/dist/base/progress-bar/types.d.ts +0 -9
  312. package/dist/base/select/index.d.ts +0 -2
  313. package/dist/base/select/index.js +0 -2
  314. package/dist/base/select/select.svelte +0 -145
  315. package/dist/base/select/types.d.ts +0 -16
  316. package/dist/base/slider/index.d.ts +0 -1
  317. package/dist/base/slider/index.js +0 -1
  318. package/dist/base/slider/slider.svelte +0 -192
  319. package/dist/base/slider/slider.svelte.d.ts +0 -6
  320. package/dist/base/slider/types.d.ts +0 -12
  321. package/dist/base/text-input/area-text-input.svelte +0 -105
  322. package/dist/base/text-input/area-text-input.svelte.d.ts +0 -6
  323. package/dist/base/text-input/index.d.ts +0 -2
  324. package/dist/base/text-input/index.js +0 -2
  325. package/dist/base/text-input/text-input.svelte +0 -213
  326. package/dist/base/text-input/text-input.svelte.d.ts +0 -6
  327. package/dist/base/text-input/types.d.ts +0 -27
  328. package/dist/base/theme/color-tokens.d.ts +0 -36
  329. package/dist/base/theme/color-tokens.js +0 -105
  330. package/dist/base/theme/index.d.ts +0 -3
  331. package/dist/base/theme/index.js +0 -3
  332. package/dist/base/theme/mode.d.ts +0 -3
  333. package/dist/base/theme/mode.js +0 -14
  334. package/dist/base/theme/theme.svelte +0 -87
  335. package/dist/base/theme/theme.svelte.d.ts +0 -3
  336. package/dist/base/theme/types.d.ts +0 -27
  337. package/dist/base/theme/types.js +0 -20
  338. package/dist/base/toggle/index.d.ts +0 -1
  339. package/dist/base/toggle/index.js +0 -1
  340. package/dist/base/toggle/toggle.svelte +0 -109
  341. package/dist/base/toggle/toggle.svelte.d.ts +0 -4
  342. package/dist/base/toggle/types.d.ts +0 -7
  343. package/dist/base/tree-view/index.d.ts +0 -3
  344. package/dist/base/tree-view/index.js +0 -3
  345. package/dist/base/tree-view/tree-node.svelte +0 -132
  346. package/dist/base/tree-view/tree-view.svelte +0 -56
  347. package/dist/base/tree-view/types.d.ts +0 -23
  348. package/dist/base/types.d.ts +0 -4
  349. /package/dist/{base/button → button}/types.js +0 -0
  350. /package/dist/{base/icon → checkbox}/types.js +0 -0
  351. /package/dist/{base/loading → combobox}/types.js +0 -0
  352. /package/dist/{base/pill → dialog}/types.js +0 -0
  353. /package/dist/{base/progress-bar/types.js → icon/names.js} +0 -0
  354. /package/dist/{base/select → icon}/types.js +0 -0
  355. /package/dist/{base/toggle → pill}/types.js +0 -0
  356. /package/dist/{base/slider → pill-choice-group}/types.js +0 -0
  357. /package/dist/{base/text-input → pill-group}/types.js +0 -0
  358. /package/dist/{base/tree-view → popover}/types.js +0 -0
  359. /package/dist/{base → progress}/types.js +0 -0
@@ -0,0 +1,208 @@
1
+ <script lang="ts">
2
+ /* eslint-disable max-lines -- Keep the authoritative surface paint and state recipes together. */
3
+ </script>
4
+
5
+ <style>
6
+ :global(.surface) {
7
+ --surface-color: var(--color-foreground, black);
8
+ --surface-base: var(--color-background, white);
9
+ --surface-foreground: var(--color-foreground, black);
10
+ --surface-strength: 0%;
11
+ --surface-hover: 0%;
12
+ --surface-fill: transparent;
13
+ --surface-border: transparent;
14
+ --surface-content: var(--surface-color);
15
+ --surface-neutral-content: color-mix(
16
+ in srgb,
17
+ var(--surface-color) 80%,
18
+ var(--surface-foreground)
19
+ );
20
+ --surface-highlight: 0 0 0 transparent;
21
+ --surface-shadow: 0 0 0 transparent;
22
+ --surface-glow: 0 0 0 transparent;
23
+ --surface-glow-size: 0;
24
+ --surface-blur: none;
25
+ box-sizing: border-box;
26
+ border: 1px solid var(--surface-border);
27
+ background: var(--surface-fill);
28
+ color: var(--surface-content);
29
+ box-shadow: var(--surface-highlight), var(--surface-shadow), var(--surface-glow);
30
+ -webkit-backdrop-filter: var(--surface-blur);
31
+ backdrop-filter: var(--surface-blur);
32
+ transition:
33
+ background-color 150ms ease,
34
+ border-color 150ms ease,
35
+ box-shadow 150ms ease,
36
+ color 150ms ease;
37
+ }
38
+ :global(.surface:is(button, a, [role='button'])) {
39
+ cursor: pointer;
40
+ }
41
+ :global(.surface-primary) {
42
+ --surface-color: var(--color-primary, blue);
43
+ }
44
+ :global(.surface-secondary) {
45
+ --surface-color: var(--color-secondary, purple);
46
+ }
47
+ :global(.surface-foreground) {
48
+ --surface-color: var(--color-foreground, black);
49
+ }
50
+ :global(.surface-background) {
51
+ --surface-color: var(--color-background, white);
52
+ --surface-content: inherit;
53
+ --surface-neutral-content: inherit;
54
+ }
55
+ :global(.surface-muted) {
56
+ --surface-color: var(--color-muted, gray);
57
+ }
58
+ :global(.surface-info) {
59
+ --surface-color: var(--color-info, blue);
60
+ }
61
+ :global(.surface-success) {
62
+ --surface-color: var(--color-success, green);
63
+ }
64
+ :global(.surface-warning) {
65
+ --surface-color: var(--color-warning, brown);
66
+ }
67
+ :global(.surface-error) {
68
+ --surface-color: var(--color-error, red);
69
+ }
70
+ :global(.surface-soft),
71
+ :global(.surface-filled) {
72
+ --surface-fill: color-mix(
73
+ in srgb,
74
+ var(--surface-color) var(--surface-strength),
75
+ var(--surface-base)
76
+ );
77
+ --surface-highlight: inset 0 1px 0
78
+ color-mix(in srgb, var(--surface-foreground) 16%, transparent);
79
+ }
80
+ :global(.surface-soft) {
81
+ --surface-strength: 16%;
82
+ --surface-fill: color-mix(
83
+ in srgb,
84
+ color-mix(in srgb, var(--surface-color) var(--surface-strength), var(--surface-base)) 85%,
85
+ transparent
86
+ );
87
+ --surface-border: color-mix(in srgb, var(--surface-color) 30%, transparent);
88
+ --surface-content: color-mix(in srgb, var(--surface-color) 80%, var(--surface-foreground));
89
+ --surface-blur: blur(0.5rem) saturate(120%);
90
+ }
91
+ :global(.surface-filled) {
92
+ --surface-strength: 100%;
93
+ --surface-fill: color-mix(
94
+ in srgb,
95
+ var(--surface-color) var(--surface-strength),
96
+ var(--surface-foreground)
97
+ );
98
+ --surface-border: color-mix(in srgb, var(--surface-color) 68%, var(--surface-foreground));
99
+ --surface-content: var(--surface-base);
100
+ --surface-highlight: inset 0 1px 0
101
+ color-mix(in srgb, var(--surface-foreground) 28%, transparent);
102
+ }
103
+ :global(.surface-background:is(.surface-soft, .surface-filled)) {
104
+ --surface-content: var(--surface-foreground);
105
+ }
106
+ :global(.surface-shadow-small) {
107
+ --surface-shadow: 0 2px 6px color-mix(in srgb, var(--surface-foreground) 8%, transparent);
108
+ }
109
+ :global(.surface-shadow-medium) {
110
+ --surface-shadow: 0 0.5rem 1.5rem color-mix(in srgb, var(--surface-foreground) 12%, transparent);
111
+ }
112
+ :global(.surface-shadow-large) {
113
+ --surface-shadow: 0 1.5rem 4rem color-mix(in srgb, var(--surface-foreground) 20%, transparent);
114
+ }
115
+ :global(.surface-hover-small) {
116
+ --surface-hover: 2%;
117
+ --surface-glow-size: 0.5rem;
118
+ }
119
+ :global(.surface-hover-medium) {
120
+ --surface-hover: 4%;
121
+ --surface-glow-size: 1rem;
122
+ }
123
+ :global(.surface-hover-large) {
124
+ --surface-hover: 8%;
125
+ --surface-glow-size: 1.5rem;
126
+ }
127
+ :global(
128
+ .surface:is(.surface-hover-small, .surface-hover-medium, .surface-hover-large):not(
129
+ :disabled,
130
+ [aria-disabled='true'],
131
+ [data-surface-disabled='true']
132
+ ):is(:hover, :focus-visible, [data-surface-pressed='true'])
133
+ ) {
134
+ --surface-glow: 0 0 var(--surface-glow-size)
135
+ color-mix(in srgb, var(--surface-color) 10%, transparent);
136
+ --surface-border: color-mix(in srgb, var(--surface-color) 40%, transparent);
137
+ }
138
+ :global(
139
+ .surface-soft:is(.surface-hover-small, .surface-hover-medium, .surface-hover-large):not(
140
+ :disabled,
141
+ [aria-disabled='true'],
142
+ [data-surface-disabled='true']
143
+ ):is(:hover, :focus-visible, [data-surface-pressed='true'])
144
+ ) {
145
+ --surface-strength: calc(16% + var(--surface-hover));
146
+ }
147
+ :global(
148
+ .surface-filled:is(.surface-hover-small, .surface-hover-medium, .surface-hover-large):not(
149
+ :disabled,
150
+ [aria-disabled='true'],
151
+ [data-surface-disabled='true']
152
+ ):is(:hover, :focus-visible, [data-surface-pressed='true'])
153
+ ) {
154
+ --surface-strength: calc(100% - var(--surface-hover));
155
+ }
156
+ :global(
157
+ .surface-neutral:is(.surface-hover-small, .surface-hover-medium, .surface-hover-large):not(
158
+ :disabled,
159
+ [aria-disabled='true'],
160
+ [data-surface-disabled='true']
161
+ ):is(:hover, :focus-visible, [data-surface-pressed='true'])
162
+ ) {
163
+ --surface-fill: color-mix(in srgb, var(--surface-color) var(--surface-hover), transparent);
164
+ --surface-content: var(--surface-neutral-content);
165
+ }
166
+ :global(
167
+ .surface:is(.surface-hover-small, .surface-hover-medium, .surface-hover-large):not(
168
+ :disabled,
169
+ [aria-disabled='true'],
170
+ [data-surface-disabled='true']
171
+ ):is(:active, [data-surface-pressed='true'])
172
+ ) {
173
+ --surface-hover: 8%;
174
+ }
175
+ :global(.surface:is(:focus-visible, [data-surface-focused='true'])) {
176
+ outline: 2px solid var(--color-primary, currentColor);
177
+ outline-offset: 3px;
178
+ }
179
+ :global(.surface[data-surface-invalid='true']) {
180
+ border-color: var(--color-error, red);
181
+ }
182
+ :global(.surface:is(:disabled, [aria-disabled='true'], [data-surface-disabled='true'])) {
183
+ opacity: 0.45;
184
+ cursor: not-allowed;
185
+ }
186
+ @media (prefers-reduced-motion: reduce) {
187
+ :global(.surface) {
188
+ transition: none;
189
+ }
190
+ }
191
+ @media (forced-colors: active) {
192
+ :global(.surface) {
193
+ border-color: CanvasText;
194
+ background: Canvas;
195
+ color: CanvasText;
196
+ box-shadow: none;
197
+ -webkit-backdrop-filter: none;
198
+ backdrop-filter: none;
199
+ }
200
+ :global(.surface:is(:disabled, [aria-disabled='true'], [data-surface-disabled='true'])) {
201
+ color: GrayText;
202
+ opacity: 1;
203
+ }
204
+ :global(.surface:is(:focus-visible, [data-surface-focused='true'])) {
205
+ outline-color: Highlight;
206
+ }
207
+ }
208
+ </style>
@@ -0,0 +1,18 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const Surfaces: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type Surfaces = InstanceType<typeof Surfaces>;
18
+ export default Surfaces;
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ import type { ThemeModeToggleProps } from './types.js';
3
+
4
+ let { mode = 'auto' }: ThemeModeToggleProps = $props();
5
+ </script>
6
+
7
+ <svelte:head>
8
+ <meta name="color-scheme" content={mode === 'auto' ? 'light dark' : mode} />
9
+ </svelte:head>
@@ -0,0 +1,4 @@
1
+ import type { ThemeModeToggleProps } from './types.ts';
2
+ declare const ThemeModeToggle: import("svelte").Component<ThemeModeToggleProps, {}, "">;
3
+ type ThemeModeToggle = ReturnType<typeof ThemeModeToggle>;
4
+ export default ThemeModeToggle;
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import Colors from './colors.svelte';
3
+ import Surfaces from './surfaces.svelte';
4
+ import Fonts from './fonts.svelte';
5
+ import Styles from './styles.svelte';
6
+ import type { ThemeProps } from './types.js';
7
+
8
+ let { children, palette = {} }: ThemeProps = $props();
9
+ </script>
10
+
11
+ <Colors {palette} />
12
+ <Surfaces />
13
+ <Fonts />
14
+ <Styles />
15
+
16
+ {@render children?.()}
@@ -0,0 +1,4 @@
1
+ import type { ThemeProps } from './types.js';
2
+ declare const Theme: import("svelte").Component<ThemeProps, {}, "">;
3
+ type Theme = ReturnType<typeof Theme>;
4
+ export default Theme;
@@ -0,0 +1,17 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { Color } from '../types.js';
3
+ /** Optional semantic colors, supplied as CSS hex values. */
4
+ export type Palette = Partial<Record<Color, `#${string}`>>;
5
+ export interface ThemeProps {
6
+ children?: Snippet;
7
+ /** A shared palette or separate light and dark palettes. */
8
+ palette?: Palette | {
9
+ dark: Palette;
10
+ light: Palette;
11
+ };
12
+ }
13
+ export type ThemeMode = 'light' | 'dark' | 'auto';
14
+ export interface ThemeModeToggleProps {
15
+ /** Initial or bound theme mode; auto follows the system preference. */
16
+ mode?: ThemeMode;
17
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "tree-view",
3
+ "files": [
4
+ "tree-view.svelte",
5
+ "tree-view-section.svelte",
6
+ "tree-node/tree-node.svelte",
7
+ "tree-node/chevron-button.svelte",
8
+ "tree-node/delete-button.svelte",
9
+ "tree-node/content.svelte"
10
+ ],
11
+ "exports": {
12
+ "TreeView": "tree-view.svelte"
13
+ },
14
+ "dependencies": ["theme", "icon"]
15
+ }
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import type { HTMLButtonAttributes } from 'svelte/elements';
3
+ import Icon from '../../icon/icon.svelte';
4
+
5
+ let attributes: HTMLButtonAttributes = $props();
6
+ </script>
7
+
8
+ <button {...attributes} type="button">
9
+ <span><Icon name="chevron_right" /></span>
10
+ </button>
11
+
12
+ <style>
13
+ * {
14
+ transition: all 150ms;
15
+ }
16
+ button {
17
+ position: relative;
18
+ z-index: 1;
19
+ display: inline-flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ min-width: var(--tree-action-size);
23
+ min-height: var(--tree-action-size);
24
+ padding: 0.25rem 0.5rem;
25
+ border: 0;
26
+ border-radius: 999px;
27
+ background: transparent;
28
+ color: inherit;
29
+ font: inherit;
30
+ cursor: pointer;
31
+ }
32
+ span {
33
+ display: inline-flex;
34
+ font-size: 1.25em;
35
+ }
36
+ button[aria-expanded='true'] span {
37
+ transform: rotate(90deg);
38
+ }
39
+ button:not(:disabled):hover {
40
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
41
+ }
42
+ button:focus-visible {
43
+ outline: 2px solid var(--color-primary);
44
+ outline-offset: -2px;
45
+ }
46
+ @media (prefers-reduced-motion: reduce) {
47
+ * {
48
+ transition: none;
49
+ }
50
+ }
51
+ @media (forced-colors: active) {
52
+ button:focus-visible {
53
+ outline-color: Highlight;
54
+ }
55
+ }
56
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { HTMLButtonAttributes } from 'svelte/elements';
2
+ declare const ChevronButton: import("svelte").Component<HTMLButtonAttributes, {}, "">;
3
+ type ChevronButton = ReturnType<typeof ChevronButton>;
4
+ export default ChevronButton;
@@ -0,0 +1,62 @@
1
+ <script lang="ts">
2
+ import Icon from '../../icon/icon.svelte';
3
+ import type { TreeNodeContentProps } from '../types.js';
4
+
5
+ let { item, ...attributes }: TreeNodeContentProps = $props();
6
+ </script>
7
+
8
+ <button {...attributes} type="button" disabled={item.disabled}>
9
+ {#if item.icon}<Icon {...item.icon} label={undefined} />{/if}
10
+ <span>{item.label}</span>
11
+ </button>
12
+
13
+ <style>
14
+ * {
15
+ transition: all 150ms;
16
+ }
17
+ button {
18
+ display: inline-flex;
19
+ align-items: center;
20
+ justify-content: start;
21
+ flex: 1;
22
+ gap: 0.5rem;
23
+ min-width: 0;
24
+ min-height: var(--tree-action-size);
25
+ padding: 0.25rem 0.5rem;
26
+ border: 0;
27
+ border-radius: 999px;
28
+ outline: none;
29
+ background: transparent;
30
+ color: inherit;
31
+ font: inherit;
32
+ text-align: start;
33
+ cursor: pointer;
34
+ }
35
+ button::before {
36
+ position: absolute;
37
+ inset: 0;
38
+ border-radius: inherit;
39
+ content: '';
40
+ }
41
+ button:focus-visible::before {
42
+ outline: 2px solid var(--color-primary);
43
+ outline-offset: -2px;
44
+ }
45
+ button:disabled {
46
+ color: var(--color-muted);
47
+ cursor: default;
48
+ }
49
+ @media (prefers-reduced-motion: reduce) {
50
+ * {
51
+ transition: none;
52
+ }
53
+ }
54
+ @media (forced-colors: active) {
55
+ button:disabled {
56
+ color: GrayText;
57
+ }
58
+ button:focus-visible::before {
59
+ outline-color: Highlight;
60
+ }
61
+ }
62
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { TreeNodeContentProps } from '../types.js';
2
+ declare const Content: import("svelte").Component<TreeNodeContentProps, {}, "">;
3
+ type Content = ReturnType<typeof Content>;
4
+ export default Content;
@@ -0,0 +1,52 @@
1
+ <script lang="ts">
2
+ import type { HTMLButtonAttributes } from 'svelte/elements';
3
+ import Icon from '../../icon/icon.svelte';
4
+
5
+ let attributes: HTMLButtonAttributes = $props();
6
+ </script>
7
+
8
+ <button {...attributes} type="button"><Icon name="close" /></button>
9
+
10
+ <style>
11
+ button {
12
+ position: relative;
13
+ z-index: 1;
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ min-width: var(--tree-action-size);
18
+ min-height: var(--tree-action-size);
19
+ padding: 0.25rem 0.5rem;
20
+ border: 0;
21
+ border-radius: 999px;
22
+ background: transparent;
23
+ color: inherit;
24
+ font: inherit;
25
+ cursor: pointer;
26
+ transition: all 150ms;
27
+ }
28
+ button:not(:disabled):hover {
29
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
30
+ }
31
+ button:focus-visible {
32
+ outline: 2px solid var(--color-primary);
33
+ outline-offset: -2px;
34
+ }
35
+ button:disabled {
36
+ color: var(--color-muted);
37
+ cursor: default;
38
+ }
39
+ @media (prefers-reduced-motion: reduce) {
40
+ button {
41
+ transition: none;
42
+ }
43
+ }
44
+ @media (forced-colors: active) {
45
+ button:disabled {
46
+ color: GrayText;
47
+ }
48
+ button:focus-visible {
49
+ outline-color: Highlight;
50
+ }
51
+ }
52
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { HTMLButtonAttributes } from 'svelte/elements';
2
+ declare const DeleteButton: import("svelte").Component<HTMLButtonAttributes, {}, "">;
3
+ type DeleteButton = ReturnType<typeof DeleteButton>;
4
+ export default DeleteButton;
@@ -0,0 +1,111 @@
1
+ <script lang="ts">
2
+ import { prefersReducedMotion } from 'svelte/motion';
3
+ import { fly } from 'svelte/transition';
4
+ import ChevronButton from './chevron-button.svelte';
5
+ import DeleteButton from './delete-button.svelte';
6
+ import Content from './content.svelte';
7
+ import RecursiveNode from './tree-node.svelte';
8
+ import type { TreeNodeProps } from '../types.js';
9
+
10
+ let {
11
+ item,
12
+ selection = $bindable(),
13
+ defaultExpanded = false,
14
+ onDelete,
15
+ indent = 0
16
+ }: TreeNodeProps = $props();
17
+
18
+ // svelte-ignore state_referenced_locally
19
+ let expanded = $state(defaultExpanded);
20
+ const childrenId = $props.id();
21
+
22
+ const selected = $derived(
23
+ Array.isArray(selection) ? selection.includes(item.id) : selection === item.id
24
+ );
25
+ const select = () => {
26
+ selection = Array.isArray(selection)
27
+ ? selected
28
+ ? selection.filter((id) => id !== item.id)
29
+ : [...selection, item.id]
30
+ : item.id;
31
+ };
32
+ </script>
33
+
34
+ <div
35
+ in:fly|global={{ y: -4, duration: prefersReducedMotion.current ? 0 : 150 }}
36
+ data-selected={selected}
37
+ data-disabled={item.disabled}
38
+ style:padding-left={`calc(0.25rem + ${indent * 1.25}rem)`}
39
+ >
40
+ {#if item.children?.length}
41
+ <ChevronButton
42
+ aria-label={`Children of ${item.label}`}
43
+ aria-expanded={expanded}
44
+ aria-controls={childrenId}
45
+ onclick={() => (expanded = !expanded)}
46
+ />
47
+ {:else}
48
+ <span data-spacer aria-hidden="true"></span>
49
+ {/if}
50
+ <Content {item} aria-pressed={selected} onclick={select} />
51
+ {#if onDelete}
52
+ <DeleteButton
53
+ aria-label={`Delete ${item.label}`}
54
+ disabled={item.disabled}
55
+ onclick={() => onDelete?.(item.id)}
56
+ />
57
+ {/if}
58
+ </div>
59
+ {#if item.children?.length}
60
+ <div role="group" id={childrenId} hidden={!expanded}>
61
+ {#each item.children as child (child.id)}
62
+ <RecursiveNode indent={indent + 1} item={child} bind:selection {defaultExpanded} {onDelete} />
63
+ {/each}
64
+ </div>
65
+ {/if}
66
+
67
+ <style>
68
+ * {
69
+ transition: all 150ms;
70
+ }
71
+ div[data-selected] {
72
+ box-sizing: border-box;
73
+ position: relative;
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 0.25rem;
77
+ min-height: var(--tree-height);
78
+ padding: 0.125rem 0.25rem;
79
+ border: 1px solid transparent;
80
+ border-radius: 999px;
81
+ overflow-wrap: anywhere;
82
+ }
83
+ [data-spacer] {
84
+ flex: 0 0 var(--tree-action-size);
85
+ }
86
+ div[role='group'] {
87
+ display: contents;
88
+ }
89
+ div[hidden] {
90
+ display: none;
91
+ }
92
+ div[data-selected='true'] {
93
+ border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
94
+ background: color-mix(in srgb, var(--color-primary) 16%, transparent);
95
+ color: var(--color-primary);
96
+ }
97
+ div[data-selected='false']:not([data-disabled='true']):hover {
98
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
99
+ }
100
+ @media (prefers-reduced-motion: reduce) {
101
+ * {
102
+ transition: none;
103
+ }
104
+ }
105
+ @media (forced-colors: active) {
106
+ div[data-selected='true'] {
107
+ border-color: Highlight;
108
+ color: Highlight;
109
+ }
110
+ }
111
+ </style>
@@ -1,5 +1,4 @@
1
- import type { TreeNodeProps } from './types.ts';
2
- import TreeNode from './tree-node.svelte';
3
- declare const TreeNode: import("svelte").Component<TreeNodeProps, {}, "">;
1
+ import type { TreeNodeProps } from '../types.js';
2
+ declare const TreeNode: import("svelte").Component<TreeNodeProps, {}, "selection">;
4
3
  type TreeNode = ReturnType<typeof TreeNode>;
5
4
  export default TreeNode;
@@ -0,0 +1,42 @@
1
+ <script lang="ts">
2
+ import Icon from '../icon/icon.svelte';
3
+ import type { TreeSectionProps } from './types.js';
4
+
5
+ let { label, description, icon }: TreeSectionProps = $props();
6
+ </script>
7
+
8
+ <header>
9
+ <div>
10
+ {#if icon}<Icon {...icon} label={undefined} />{/if}
11
+ <span>{label}</span>
12
+ </div>
13
+ {#if description}<p>{description}</p>{/if}
14
+ </header>
15
+
16
+ <style>
17
+ header {
18
+ display: flex;
19
+ flex-direction: column;
20
+ align-items: flex-start;
21
+ gap: 0.25rem;
22
+ padding: 0.75rem 0.5rem 0.25rem;
23
+ color: var(--color-muted);
24
+ font-size: 0.8em;
25
+ font-weight: 600;
26
+ letter-spacing: 0.06em;
27
+ text-transform: uppercase;
28
+ overflow-wrap: anywhere;
29
+ }
30
+ div {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 0.5rem;
34
+ min-width: 0;
35
+ }
36
+ p {
37
+ margin: 0;
38
+ font-weight: 400;
39
+ letter-spacing: normal;
40
+ text-transform: none;
41
+ }
42
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { TreeSectionProps } from './types.js';
2
+ declare const TreeViewSection: import("svelte").Component<TreeSectionProps, {}, "">;
3
+ type TreeViewSection = ReturnType<typeof TreeViewSection>;
4
+ export default TreeViewSection;