@toa.io/extensions.configuration 1.0.0-alpha.273 → 1.0.0-alpha.274

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 (521) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/components/configuration.values/manifest.toa.yaml +158 -0
  3. package/components/configuration.values/source/create.ts +56 -0
  4. package/components/configuration.values/source/fetch.ts +24 -0
  5. package/components/configuration.values/source/get.ts +33 -0
  6. package/components/configuration.values/source/lib/map.test.ts +34 -0
  7. package/components/configuration.values/source/lib/map.ts +34 -0
  8. package/components/configuration.values/source/lib/resolve.ts +54 -0
  9. package/components/configuration.values/source/list.ts +19 -0
  10. package/components/configuration.values/tsconfig.json +9 -0
  11. package/cucumber.js +8 -0
  12. package/features/site/_app/immutable/asset.js +1 -0
  13. package/features/site/index.html +6 -0
  14. package/features/steps/UI.ts +88 -0
  15. package/features/steps/tsconfig.json +9 -0
  16. package/features/ui.feature +85 -0
  17. package/package.json +12 -5
  18. package/readme.md +150 -34
  19. package/schemas/annotation.cos.yaml +27 -2
  20. package/source/Aspect.test.ts +84 -8
  21. package/source/Aspect.ts +59 -5
  22. package/source/Client.test.ts +104 -0
  23. package/source/Client.ts +258 -0
  24. package/source/Composition.ts +57 -0
  25. package/source/Factory.ts +28 -5
  26. package/source/Secret.test.ts +29 -0
  27. package/source/Secret.ts +29 -0
  28. package/source/UI.ts +197 -0
  29. package/source/configuration.test.ts +84 -52
  30. package/source/configuration.ts +28 -9
  31. package/source/const.ts +17 -0
  32. package/source/deployment.test.ts +80 -1
  33. package/source/deployment.ts +73 -23
  34. package/source/epoch.test.ts +26 -0
  35. package/source/epoch.ts +21 -0
  36. package/source/index.ts +2 -1
  37. package/transpiled/Aspect.d.ts +18 -4
  38. package/transpiled/Aspect.js +47 -3
  39. package/transpiled/Aspect.js.map +1 -1
  40. package/transpiled/Aspect.test.js +59 -9
  41. package/transpiled/Aspect.test.js.map +1 -1
  42. package/transpiled/Client.d.ts +61 -0
  43. package/transpiled/Client.js +173 -0
  44. package/transpiled/Client.js.map +1 -0
  45. package/transpiled/Client.test.d.ts +1 -0
  46. package/transpiled/Client.test.js +77 -0
  47. package/transpiled/Client.test.js.map +1 -0
  48. package/transpiled/Composition.d.ts +14 -0
  49. package/transpiled/Composition.js +43 -0
  50. package/transpiled/Composition.js.map +1 -0
  51. package/transpiled/Factory.d.ts +8 -2
  52. package/transpiled/Factory.js +17 -2
  53. package/transpiled/Factory.js.map +1 -1
  54. package/transpiled/Secret.d.ts +13 -0
  55. package/transpiled/Secret.js +26 -0
  56. package/transpiled/Secret.js.map +1 -0
  57. package/transpiled/Secret.test.d.ts +1 -0
  58. package/transpiled/Secret.test.js +26 -0
  59. package/transpiled/Secret.test.js.map +1 -0
  60. package/transpiled/UI.d.ts +25 -0
  61. package/transpiled/UI.js +186 -0
  62. package/transpiled/UI.js.map +1 -0
  63. package/transpiled/configuration.d.ts +7 -2
  64. package/transpiled/configuration.js +30 -12
  65. package/transpiled/configuration.js.map +1 -1
  66. package/transpiled/configuration.test.js +77 -51
  67. package/transpiled/configuration.test.js.map +1 -1
  68. package/transpiled/const.d.ts +11 -0
  69. package/transpiled/const.js +14 -0
  70. package/transpiled/const.js.map +1 -0
  71. package/transpiled/deployment.d.ts +10 -4
  72. package/transpiled/deployment.js +57 -20
  73. package/transpiled/deployment.js.map +1 -1
  74. package/transpiled/deployment.test.js +60 -0
  75. package/transpiled/deployment.test.js.map +1 -1
  76. package/transpiled/epoch.d.ts +2 -0
  77. package/transpiled/epoch.js +21 -0
  78. package/transpiled/epoch.js.map +1 -0
  79. package/transpiled/epoch.test.d.ts +1 -0
  80. package/transpiled/epoch.test.js +22 -0
  81. package/transpiled/epoch.test.js.map +1 -0
  82. package/transpiled/index.d.ts +2 -1
  83. package/transpiled/index.js +4 -1
  84. package/transpiled/index.js.map +1 -1
  85. package/transpiled/tsconfig.tsbuildinfo +1 -1
  86. package/ui/.agents/skills/antcn/SKILL.md +91 -0
  87. package/ui/.agents/skills/antcn/references/analytics.md +78 -0
  88. package/ui/.agents/skills/antcn/references/bridge.md +41 -0
  89. package/ui/.agents/skills/antcn/references/clipboard.md +23 -0
  90. package/ui/.agents/skills/antcn/references/dismissable.md +75 -0
  91. package/ui/.agents/skills/antcn/references/dropdown.md +153 -0
  92. package/ui/.agents/skills/antcn/references/fragments.md +29 -0
  93. package/ui/.agents/skills/antcn/references/fullscreen.md +157 -0
  94. package/ui/.agents/skills/antcn/references/geo.md +27 -0
  95. package/ui/.agents/skills/antcn/references/globals.md +31 -0
  96. package/ui/.agents/skills/antcn/references/grammatical-form.md +69 -0
  97. package/ui/.agents/skills/antcn/references/hints.md +44 -0
  98. package/ui/.agents/skills/antcn/references/hold.md +34 -0
  99. package/ui/.agents/skills/antcn/references/iam.md +117 -0
  100. package/ui/.agents/skills/antcn/references/input-form.md +34 -0
  101. package/ui/.agents/skills/antcn/references/locale.md +66 -0
  102. package/ui/.agents/skills/antcn/references/net.md +33 -0
  103. package/ui/.agents/skills/antcn/references/panel.md +44 -0
  104. package/ui/.agents/skills/antcn/references/passkeys.md +27 -0
  105. package/ui/.agents/skills/antcn/references/payments.md +99 -0
  106. package/ui/.agents/skills/antcn/references/realtime.md +69 -0
  107. package/ui/.agents/skills/antcn/references/scrollable.md +39 -0
  108. package/ui/.agents/skills/antcn/references/selector.md +71 -0
  109. package/ui/.agents/skills/antcn/references/shake.md +36 -0
  110. package/ui/.agents/skills/antcn/references/share.md +28 -0
  111. package/ui/.agents/skills/antcn/references/shell.md +139 -0
  112. package/ui/.agents/skills/antcn/references/stack.md +53 -0
  113. package/ui/.agents/skills/antcn/references/system.md +149 -0
  114. package/ui/.agents/skills/antcn/references/taptap.md +28 -0
  115. package/ui/.agents/skills/antcn/references/tools.md +68 -0
  116. package/ui/.agents/skills/antcn/references/transmission.md +96 -0
  117. package/ui/.agents/skills/shadcn-svelte/SKILL.md +227 -0
  118. package/ui/.agents/skills/shadcn-svelte/agents/openai.yml +5 -0
  119. package/ui/.agents/skills/shadcn-svelte/assets/shadcn-svelte-small.png +0 -0
  120. package/ui/.agents/skills/shadcn-svelte/assets/shadcn-svelte.png +0 -0
  121. package/ui/.agents/skills/shadcn-svelte/cli.md +166 -0
  122. package/ui/.agents/skills/shadcn-svelte/customization.md +213 -0
  123. package/ui/.agents/skills/shadcn-svelte/evals/evals.json +47 -0
  124. package/ui/.agents/skills/shadcn-svelte/rules/composition.md +244 -0
  125. package/ui/.agents/skills/shadcn-svelte/rules/forms.md +234 -0
  126. package/ui/.agents/skills/shadcn-svelte/rules/icons.md +107 -0
  127. package/ui/.agents/skills/shadcn-svelte/rules/styling.md +195 -0
  128. package/ui/.agents/skills/svas/SKILL.md +169 -0
  129. package/ui/.agents/skills/svas/references/patterns.md +95 -0
  130. package/ui/.agents/skills/svintl/SKILL.md +176 -0
  131. package/ui/.claude/settings.json +15 -0
  132. package/ui/.codex/hooks.json +15 -0
  133. package/ui/.cursor/hooks.json +11 -0
  134. package/ui/.env.example +1 -0
  135. package/ui/.prettierrc +9 -0
  136. package/ui/.vscode/extensions.json +7 -0
  137. package/ui/.vscode/settings.json +27 -0
  138. package/ui/AGENTS.md +51 -0
  139. package/ui/architecture.md +390 -0
  140. package/ui/components.json +20 -0
  141. package/ui/eslint.config.js +152 -0
  142. package/ui/features/base.ts +2 -0
  143. package/ui/features/boot.feature +5 -0
  144. package/ui/features/steps/authentication.ts +34 -0
  145. package/ui/features/steps/navigaton.ts +37 -0
  146. package/ui/features/steps/typing.ts +24 -0
  147. package/ui/package-lock.json +8173 -0
  148. package/ui/package.json +76 -0
  149. package/ui/playwright.config.ts +13 -0
  150. package/ui/skills-lock.json +30 -0
  151. package/ui/src/@/configuration/index.ts +1 -0
  152. package/ui/src/@/configuration/svc/create.ts +29 -0
  153. package/ui/src/@/configuration/svc/index.ts +3 -0
  154. package/ui/src/@/configuration/svc/net/Configuration.ts +18 -0
  155. package/ui/src/@/configuration/svc/net/index.ts +2 -0
  156. package/ui/src/@/configuration/svc/net/interface.ts +35 -0
  157. package/ui/src/@/configuration/svc/store.ts +14 -0
  158. package/ui/src/@/configuration/ui/Configurations.svelte +85 -0
  159. package/ui/src/@/configuration/ui/Configurations.ts +5 -0
  160. package/ui/src/@/configuration/ui/Create.svelte +64 -0
  161. package/ui/src/@/configuration/ui/Create.ts +7 -0
  162. package/ui/src/@/configuration/ui/Form.svelte +75 -0
  163. package/ui/src/@/configuration/ui/Form.ts +79 -0
  164. package/ui/src/@/configuration/ui/Row.svelte +44 -0
  165. package/ui/src/@/configuration/ui/Row.ts +9 -0
  166. package/ui/src/@/configuration/ui/Value.svelte +33 -0
  167. package/ui/src/@/configuration/ui/Value.ts +6 -0
  168. package/ui/src/@/configuration/ui/index.ts +9 -0
  169. package/ui/src/@/configuration/ui/intl/built.js +38 -0
  170. package/ui/src/@/configuration/ui/intl/context.yaml +51 -0
  171. package/ui/src/@/configuration/ui/intl/en-US.yaml +21 -0
  172. package/ui/src/@/configuration/ui/intl/index.ts +9 -0
  173. package/ui/src/@/configuration/ui/intl/types.ts +31 -0
  174. package/ui/src/@/configuration/ui/read.test.ts +75 -0
  175. package/ui/src/@/configuration/ui/read.ts +102 -0
  176. package/ui/src/@/configuration/ui/ui.test.ts +69 -0
  177. package/ui/src/@/configuration/ui/ui.ts +115 -0
  178. package/ui/src/@/iam/index.ts +1 -0
  179. package/ui/src/@/iam/rc.ts +22 -0
  180. package/ui/src/@/iam/svc/authenticated.ts +17 -0
  181. package/ui/src/@/iam/svc/basic.ts +23 -0
  182. package/ui/src/@/iam/svc/index.ts +10 -0
  183. package/ui/src/@/iam/svc/logout.ts +5 -0
  184. package/ui/src/@/iam/svc/named.ts +16 -0
  185. package/ui/src/@/iam/svc/net/Echo.ts +9 -0
  186. package/ui/src/@/iam/svc/net/basic/index.ts +1 -0
  187. package/ui/src/@/iam/svc/net/basic/interface.ts +15 -0
  188. package/ui/src/@/iam/svc/net/federation/index.ts +1 -0
  189. package/ui/src/@/iam/svc/net/federation/interface.ts +12 -0
  190. package/ui/src/@/iam/svc/net/index.ts +6 -0
  191. package/ui/src/@/iam/svc/net/interface.ts +17 -0
  192. package/ui/src/@/iam/svc/net/otp/index.ts +1 -0
  193. package/ui/src/@/iam/svc/net/otp/interface.ts +14 -0
  194. package/ui/src/@/iam/svc/net/passkeys/index.ts +1 -0
  195. package/ui/src/@/iam/svc/net/passkeys/interface.ts +12 -0
  196. package/ui/src/@/iam/svc/oidc/apple.ts +47 -0
  197. package/ui/src/@/iam/svc/oidc/authenticate.ts +62 -0
  198. package/ui/src/@/iam/svc/oidc/google.ts +45 -0
  199. package/ui/src/@/iam/svc/oidc/hello.ts +82 -0
  200. package/ui/src/@/iam/svc/oidc/index.ts +3 -0
  201. package/ui/src/@/iam/svc/oidc/nonce.ts +5 -0
  202. package/ui/src/@/iam/svc/oidc/providers.ts +28 -0
  203. package/ui/src/@/iam/svc/oidc/standard.ts +28 -0
  204. package/ui/src/@/iam/svc/otp.ts +18 -0
  205. package/ui/src/@/iam/svc/passkeys/create.ts +20 -0
  206. package/ui/src/@/iam/svc/passkeys/index.ts +2 -0
  207. package/ui/src/@/iam/svc/passkeys/login.ts +21 -0
  208. package/ui/src/@/iam/svc/store.ts +36 -0
  209. package/ui/src/@/iam/svc/sync.ts +18 -0
  210. package/ui/src/@/iam/svc/transfer.ts +11 -0
  211. package/ui/src/@/iam/svc/update.ts +8 -0
  212. package/ui/src/@/iam/ui/AccountLike.ts +4 -0
  213. package/ui/src/@/iam/ui/Authenticated.svelte +37 -0
  214. package/ui/src/@/iam/ui/Authenticated.ts +10 -0
  215. package/ui/src/@/iam/ui/Authentication.svelte +50 -0
  216. package/ui/src/@/iam/ui/Authentication.ts +9 -0
  217. package/ui/src/@/iam/ui/Authorized.svelte +32 -0
  218. package/ui/src/@/iam/ui/Authorized.ts +65 -0
  219. package/ui/src/@/iam/ui/Card.svelte +14 -0
  220. package/ui/src/@/iam/ui/Card.ts +7 -0
  221. package/ui/src/@/iam/ui/Refresh.svelte +39 -0
  222. package/ui/src/@/iam/ui/credentials/Credentials.svelte +26 -0
  223. package/ui/src/@/iam/ui/credentials/Credentials.ts +5 -0
  224. package/ui/src/@/iam/ui/credentials/Provider.svelte +24 -0
  225. package/ui/src/@/iam/ui/credentials/Provider.ts +5 -0
  226. package/ui/src/@/iam/ui/credentials/index.ts +1 -0
  227. package/ui/src/@/iam/ui/credentials/passkeys/Key.svelte +42 -0
  228. package/ui/src/@/iam/ui/credentials/passkeys/Key.ts +29 -0
  229. package/ui/src/@/iam/ui/credentials/passkeys/Manager.svelte +83 -0
  230. package/ui/src/@/iam/ui/credentials/passkeys/Manager.ts +5 -0
  231. package/ui/src/@/iam/ui/credentials/passkeys/Passkeys.svelte +39 -0
  232. package/ui/src/@/iam/ui/credentials/passkeys/Summary.svelte +27 -0
  233. package/ui/src/@/iam/ui/credentials/passkeys/Summary.ts +5 -0
  234. package/ui/src/@/iam/ui/credentials/passkeys/index.ts +1 -0
  235. package/ui/src/@/iam/ui/credentials/providers.ts +15 -0
  236. package/ui/src/@/iam/ui/credentials/transfer/Qr.svelte +24 -0
  237. package/ui/src/@/iam/ui/credentials/transfer/Qr.ts +3 -0
  238. package/ui/src/@/iam/ui/credentials/transfer/Transfer.svelte +48 -0
  239. package/ui/src/@/iam/ui/credentials/transfer/Transfer.ts +5 -0
  240. package/ui/src/@/iam/ui/credentials/transfer/index.ts +1 -0
  241. package/ui/src/@/iam/ui/index.ts +3 -0
  242. package/ui/src/@/iam/ui/intl/built.js +79 -0
  243. package/ui/src/@/iam/ui/intl/context.yaml +91 -0
  244. package/ui/src/@/iam/ui/intl/en-US.yaml +64 -0
  245. package/ui/src/@/iam/ui/intl/index.ts +10 -0
  246. package/ui/src/@/iam/ui/intl/types.ts +70 -0
  247. package/ui/src/@/iam/ui/oidc/Authentication.svelte +16 -0
  248. package/ui/src/@/iam/ui/oidc/Authentication.ts +5 -0
  249. package/ui/src/@/iam/ui/oidc/Button.svelte +36 -0
  250. package/ui/src/@/iam/ui/oidc/Button.ts +11 -0
  251. package/ui/src/@/iam/ui/oidc/Refresh.svelte +16 -0
  252. package/ui/src/@/iam/ui/oidc/icons/Apple.svelte +19 -0
  253. package/ui/src/@/iam/ui/oidc/icons/Google.svelte +31 -0
  254. package/ui/src/@/iam/ui/oidc/icons/index.ts +11 -0
  255. package/ui/src/@/iam/ui/oidc/index.ts +2 -0
  256. package/ui/src/@/iam/ui/passkey/Authentication.svelte +64 -0
  257. package/ui/src/@/iam/ui/passkey/Authentication.ts +8 -0
  258. package/ui/src/@/iam/ui/passkey/Create.svelte +53 -0
  259. package/ui/src/@/iam/ui/passkey/Create.ts +7 -0
  260. package/ui/src/@/iam/ui/passkey/Login.svelte +29 -0
  261. package/ui/src/@/iam/ui/passkey/Refresh.svelte +29 -0
  262. package/ui/src/@/iam/ui/passkey/index.ts +2 -0
  263. package/ui/src/@/iam/ui/password/Authentication.svelte +19 -0
  264. package/ui/src/@/iam/ui/password/Authentication.ts +8 -0
  265. package/ui/src/@/iam/ui/password/Form.svelte +151 -0
  266. package/ui/src/@/iam/ui/password/Form.ts +6 -0
  267. package/ui/src/@/iam/ui/password/Password.svelte +39 -0
  268. package/ui/src/@/iam/ui/password/Password.ts +6 -0
  269. package/ui/src/@/iam/ui/password/Refresh.svelte +5 -0
  270. package/ui/src/@/iam/ui/password/index.ts +2 -0
  271. package/ui/src/@/net/index.ts +1 -0
  272. package/ui/src/@/net/svc/index.ts +3 -0
  273. package/ui/src/@/net/svc/origin.ts +8 -0
  274. package/ui/src/@/net/svc/query.test.ts +45 -0
  275. package/ui/src/@/net/svc/query.ts +25 -0
  276. package/ui/src/@/passkeys/index.ts +1 -0
  277. package/ui/src/@/passkeys/svc/add.ts +15 -0
  278. package/ui/src/@/passkeys/svc/create.ts +58 -0
  279. package/ui/src/@/passkeys/svc/credentials/convert.ts +32 -0
  280. package/ui/src/@/passkeys/svc/credentials/create.ts +34 -0
  281. package/ui/src/@/passkeys/svc/credentials/get.ts +14 -0
  282. package/ui/src/@/passkeys/svc/credentials/index.ts +3 -0
  283. package/ui/src/@/passkeys/svc/credentials/key.ts +10 -0
  284. package/ui/src/@/passkeys/svc/get.ts +10 -0
  285. package/ui/src/@/passkeys/svc/index.ts +6 -0
  286. package/ui/src/@/passkeys/svc/net/CreationResponse.ts +15 -0
  287. package/ui/src/@/passkeys/svc/net/Passkey.ts +8 -0
  288. package/ui/src/@/passkeys/svc/net/RequestResponse.ts +12 -0
  289. package/ui/src/@/passkeys/svc/net/challenges/Options.ts +21 -0
  290. package/ui/src/@/passkeys/svc/net/challenges/index.ts +2 -0
  291. package/ui/src/@/passkeys/svc/net/challenges/interface.ts +16 -0
  292. package/ui/src/@/passkeys/svc/net/index.ts +4 -0
  293. package/ui/src/@/passkeys/svc/net/interface.ts +29 -0
  294. package/ui/src/@/passkeys/svc/remove.ts +13 -0
  295. package/ui/src/@/passkeys/svc/request.ts +50 -0
  296. package/ui/src/@/passkeys/svc/store.ts +13 -0
  297. package/ui/src/@/passkeys/svc/supported.ts +1 -0
  298. package/ui/src/@/passkeys/ui/aaguid.json +150 -0
  299. package/ui/src/@/realtime/events.ts +1 -0
  300. package/ui/src/@/realtime/index.ts +1 -0
  301. package/ui/src/@/realtime/rc.ts +13 -0
  302. package/ui/src/@/realtime/svc/connect.ts +67 -0
  303. package/ui/src/@/realtime/svc/events.ts +17 -0
  304. package/ui/src/@/realtime/svc/index.ts +5 -0
  305. package/ui/src/@/realtime/svc/net/Message.ts +6 -0
  306. package/ui/src/@/realtime/svc/net/index.ts +2 -0
  307. package/ui/src/@/realtime/svc/net/interface.ts +13 -0
  308. package/ui/src/@/realtime/svc/reset.ts +5 -0
  309. package/ui/src/@/realtime/svc/status.ts +12 -0
  310. package/ui/src/@/realtime/svc/store.ts +30 -0
  311. package/ui/src/@/realtime/svc/time.ts +15 -0
  312. package/ui/src/app.d.ts +20 -0
  313. package/ui/src/app.html +13 -0
  314. package/ui/src/config/index.ts +70 -0
  315. package/ui/src/lib/assets/favicon.svg +1 -0
  316. package/ui/src/lib/components/clipboard/Clipboard.svelte +63 -0
  317. package/ui/src/lib/components/clipboard/Clipboard.ts +12 -0
  318. package/ui/src/lib/components/clipboard/index.ts +1 -0
  319. package/ui/src/lib/components/dismissable/Dismissable.svelte +81 -0
  320. package/ui/src/lib/components/dismissable/Dismissable.ts +7 -0
  321. package/ui/src/lib/components/dismissable/index.ts +1 -0
  322. package/ui/src/lib/components/dropdown/Back.svelte +14 -0
  323. package/ui/src/lib/components/dropdown/Back.ts +3 -0
  324. package/ui/src/lib/components/dropdown/Content.svelte +76 -0
  325. package/ui/src/lib/components/dropdown/Content.ts +13 -0
  326. package/ui/src/lib/components/dropdown/Context.ts +18 -0
  327. package/ui/src/lib/components/dropdown/Group.svelte +24 -0
  328. package/ui/src/lib/components/dropdown/Group.ts +8 -0
  329. package/ui/src/lib/components/dropdown/GroupContext.ts +15 -0
  330. package/ui/src/lib/components/dropdown/Item.svelte +31 -0
  331. package/ui/src/lib/components/dropdown/Item.ts +5 -0
  332. package/ui/src/lib/components/dropdown/Layer.svelte +11 -0
  333. package/ui/src/lib/components/dropdown/Layer.ts +7 -0
  334. package/ui/src/lib/components/dropdown/Root.svelte +88 -0
  335. package/ui/src/lib/components/dropdown/Root.ts +6 -0
  336. package/ui/src/lib/components/dropdown/Separator.svelte +13 -0
  337. package/ui/src/lib/components/dropdown/Separator.ts +5 -0
  338. package/ui/src/lib/components/dropdown/Trigger.svelte +33 -0
  339. package/ui/src/lib/components/dropdown/Trigger.ts +5 -0
  340. package/ui/src/lib/components/dropdown/index.ts +8 -0
  341. package/ui/src/lib/components/fullscreen/Fullscreen.svelte +97 -0
  342. package/ui/src/lib/components/fullscreen/Fullscreen.ts +18 -0
  343. package/ui/src/lib/components/fullscreen/Overlay.svelte +15 -0
  344. package/ui/src/lib/components/fullscreen/Overlay.ts +7 -0
  345. package/ui/src/lib/components/fullscreen/index.ts +2 -0
  346. package/ui/src/lib/components/hold/Hold.svelte +133 -0
  347. package/ui/src/lib/components/hold/Hold.ts +23 -0
  348. package/ui/src/lib/components/hold/index.ts +1 -0
  349. package/ui/src/lib/components/scrollable/Scrollable.svelte +49 -0
  350. package/ui/src/lib/components/scrollable/Scrollable.ts +117 -0
  351. package/ui/src/lib/components/scrollable/index.ts +2 -0
  352. package/ui/src/lib/components/shake/Shake.svelte +62 -0
  353. package/ui/src/lib/components/shake/Shake.ts +7 -0
  354. package/ui/src/lib/components/shake/index.ts +1 -0
  355. package/ui/src/lib/components/share/Share.svelte +58 -0
  356. package/ui/src/lib/components/share/Share.ts +9 -0
  357. package/ui/src/lib/components/share/index.ts +1 -0
  358. package/ui/src/lib/components/shell/Attention.svelte +11 -0
  359. package/ui/src/lib/components/shell/Attention.ts +6 -0
  360. package/ui/src/lib/components/shell/Header.svelte +18 -0
  361. package/ui/src/lib/components/shell/Header.ts +7 -0
  362. package/ui/src/lib/components/shell/Screen.svelte +28 -0
  363. package/ui/src/lib/components/shell/Screen.ts +11 -0
  364. package/ui/src/lib/components/shell/Sticky.svelte +23 -0
  365. package/ui/src/lib/components/shell/Sticky.ts +8 -0
  366. package/ui/src/lib/components/shell/Underlay.svelte +21 -0
  367. package/ui/src/lib/components/shell/Underlay.ts +6 -0
  368. package/ui/src/lib/components/shell/index.ts +6 -0
  369. package/ui/src/lib/components/shell/nav/Actions.svelte +31 -0
  370. package/ui/src/lib/components/shell/nav/Actions.ts +16 -0
  371. package/ui/src/lib/components/shell/nav/Back.svelte +20 -0
  372. package/ui/src/lib/components/shell/nav/Back.ts +9 -0
  373. package/ui/src/lib/components/shell/nav/Bar.svelte +24 -0
  374. package/ui/src/lib/components/shell/nav/Bar.ts +3 -0
  375. package/ui/src/lib/components/shell/nav/Button.svelte +64 -0
  376. package/ui/src/lib/components/shell/nav/Button.ts +7 -0
  377. package/ui/src/lib/components/shell/nav/Nav.svelte +62 -0
  378. package/ui/src/lib/components/shell/nav/Nav.ts +35 -0
  379. package/ui/src/lib/components/shell/nav/Return.svelte +29 -0
  380. package/ui/src/lib/components/shell/nav/Return.ts +15 -0
  381. package/ui/src/lib/components/shell/nav/Sections.svelte +58 -0
  382. package/ui/src/lib/components/shell/nav/Sections.ts +6 -0
  383. package/ui/src/lib/components/shell/nav/Toolbar.svelte +73 -0
  384. package/ui/src/lib/components/shell/nav/Toolbar.ts +3 -0
  385. package/ui/src/lib/components/shell/nav/history.ts +36 -0
  386. package/ui/src/lib/components/shell/nav/index.ts +5 -0
  387. package/ui/src/lib/components/shell/nav/store.ts +24 -0
  388. package/ui/src/lib/components/ui/alert/alert-action.svelte +20 -0
  389. package/ui/src/lib/components/ui/alert/alert-description.svelte +23 -0
  390. package/ui/src/lib/components/ui/alert/alert-title.svelte +23 -0
  391. package/ui/src/lib/components/ui/alert/alert.svelte +43 -0
  392. package/ui/src/lib/components/ui/alert/index.ts +17 -0
  393. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte +27 -0
  394. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte +27 -0
  395. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte +32 -0
  396. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte +17 -0
  397. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte +23 -0
  398. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte +20 -0
  399. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-media.svelte +20 -0
  400. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte +17 -0
  401. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte +7 -0
  402. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte +17 -0
  403. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-trigger.svelte +7 -0
  404. package/ui/src/lib/components/ui/alert-dialog/alert-dialog.svelte +7 -0
  405. package/ui/src/lib/components/ui/alert-dialog/index.ts +40 -0
  406. package/ui/src/lib/components/ui/badge/badge.svelte +49 -0
  407. package/ui/src/lib/components/ui/badge/index.ts +2 -0
  408. package/ui/src/lib/components/ui/button/button.svelte +82 -0
  409. package/ui/src/lib/components/ui/button/index.ts +17 -0
  410. package/ui/src/lib/components/ui/button-group/button-group-separator.svelte +23 -0
  411. package/ui/src/lib/components/ui/button-group/button-group-text.svelte +28 -0
  412. package/ui/src/lib/components/ui/button-group/button-group.svelte +46 -0
  413. package/ui/src/lib/components/ui/button-group/index.ts +15 -0
  414. package/ui/src/lib/components/ui/card/card-action.svelte +23 -0
  415. package/ui/src/lib/components/ui/card/card-content.svelte +20 -0
  416. package/ui/src/lib/components/ui/card/card-description.svelte +20 -0
  417. package/ui/src/lib/components/ui/card/card-footer.svelte +20 -0
  418. package/ui/src/lib/components/ui/card/card-header.svelte +23 -0
  419. package/ui/src/lib/components/ui/card/card-title.svelte +20 -0
  420. package/ui/src/lib/components/ui/card/card.svelte +22 -0
  421. package/ui/src/lib/components/ui/card/index.ts +25 -0
  422. package/ui/src/lib/components/ui/checkbox/checkbox.svelte +39 -0
  423. package/ui/src/lib/components/ui/checkbox/index.ts +6 -0
  424. package/ui/src/lib/components/ui/collapsible/collapsible-content.svelte +7 -0
  425. package/ui/src/lib/components/ui/collapsible/collapsible-trigger.svelte +7 -0
  426. package/ui/src/lib/components/ui/collapsible/collapsible.svelte +20 -0
  427. package/ui/src/lib/components/ui/collapsible/index.ts +13 -0
  428. package/ui/src/lib/components/ui/input/index.ts +7 -0
  429. package/ui/src/lib/components/ui/input/input.svelte +48 -0
  430. package/ui/src/lib/components/ui/input-otp/index.ts +15 -0
  431. package/ui/src/lib/components/ui/input-otp/input-otp-group.svelte +20 -0
  432. package/ui/src/lib/components/ui/input-otp/input-otp-separator.svelte +27 -0
  433. package/ui/src/lib/components/ui/input-otp/input-otp-slot.svelte +31 -0
  434. package/ui/src/lib/components/ui/input-otp/input-otp.svelte +23 -0
  435. package/ui/src/lib/components/ui/item/index.ts +34 -0
  436. package/ui/src/lib/components/ui/item/item-actions.svelte +20 -0
  437. package/ui/src/lib/components/ui/item/item-content.svelte +23 -0
  438. package/ui/src/lib/components/ui/item/item-description.svelte +23 -0
  439. package/ui/src/lib/components/ui/item/item-footer.svelte +20 -0
  440. package/ui/src/lib/components/ui/item/item-group.svelte +21 -0
  441. package/ui/src/lib/components/ui/item/item-header.svelte +20 -0
  442. package/ui/src/lib/components/ui/item/item-media.svelte +42 -0
  443. package/ui/src/lib/components/ui/item/item-separator.svelte +19 -0
  444. package/ui/src/lib/components/ui/item/item-title.svelte +20 -0
  445. package/ui/src/lib/components/ui/item/item.svelte +61 -0
  446. package/ui/src/lib/components/ui/kbd/index.ts +10 -0
  447. package/ui/src/lib/components/ui/kbd/kbd-group.svelte +20 -0
  448. package/ui/src/lib/components/ui/kbd/kbd.svelte +23 -0
  449. package/ui/src/lib/components/ui/label/index.ts +7 -0
  450. package/ui/src/lib/components/ui/label/label.svelte +20 -0
  451. package/ui/src/lib/components/ui/progress/index.ts +7 -0
  452. package/ui/src/lib/components/ui/progress/progress.svelte +27 -0
  453. package/ui/src/lib/components/ui/select/index.ts +37 -0
  454. package/ui/src/lib/components/ui/select/select-content.svelte +45 -0
  455. package/ui/src/lib/components/ui/select/select-group-heading.svelte +21 -0
  456. package/ui/src/lib/components/ui/select/select-group.svelte +17 -0
  457. package/ui/src/lib/components/ui/select/select-item.svelte +40 -0
  458. package/ui/src/lib/components/ui/select/select-label.svelte +20 -0
  459. package/ui/src/lib/components/ui/select/select-portal.svelte +7 -0
  460. package/ui/src/lib/components/ui/select/select-scroll-down-button.svelte +20 -0
  461. package/ui/src/lib/components/ui/select/select-scroll-up-button.svelte +20 -0
  462. package/ui/src/lib/components/ui/select/select-separator.svelte +18 -0
  463. package/ui/src/lib/components/ui/select/select-trigger.svelte +29 -0
  464. package/ui/src/lib/components/ui/select/select.svelte +11 -0
  465. package/ui/src/lib/components/ui/separator/index.ts +7 -0
  466. package/ui/src/lib/components/ui/separator/separator.svelte +23 -0
  467. package/ui/src/lib/components/ui/spinner/index.ts +1 -0
  468. package/ui/src/lib/components/ui/spinner/spinner.svelte +18 -0
  469. package/ui/src/lib/components/ui/tabs/index.ts +18 -0
  470. package/ui/src/lib/components/ui/tabs/tabs-content.svelte +17 -0
  471. package/ui/src/lib/components/ui/tabs/tabs-list.svelte +40 -0
  472. package/ui/src/lib/components/ui/tabs/tabs-trigger.svelte +23 -0
  473. package/ui/src/lib/components/ui/tabs/tabs.svelte +19 -0
  474. package/ui/src/lib/components/ui/textarea/index.ts +7 -0
  475. package/ui/src/lib/components/ui/textarea/textarea.svelte +22 -0
  476. package/ui/src/lib/intl/bcp.ts +25 -0
  477. package/ui/src/lib/intl/built.js +18 -0
  478. package/ui/src/lib/intl/context.yaml +18 -0
  479. package/ui/src/lib/intl/en-US.yaml +6 -0
  480. package/ui/src/lib/intl/index.ts +65 -0
  481. package/ui/src/lib/intl/types.ts +19 -0
  482. package/ui/src/lib/tools/ago.ts +10 -0
  483. package/ui/src/lib/tools/assert.ts +3 -0
  484. package/ui/src/lib/tools/cap.ts +5 -0
  485. package/ui/src/lib/tools/clicks.ts +25 -0
  486. package/ui/src/lib/tools/contextmenu.ts +19 -0
  487. package/ui/src/lib/tools/convert.ts +32 -0
  488. package/ui/src/lib/tools/currency.test.ts +10 -0
  489. package/ui/src/lib/tools/currency.ts +55 -0
  490. package/ui/src/lib/tools/date.test.ts +21 -0
  491. package/ui/src/lib/tools/date.ts +35 -0
  492. package/ui/src/lib/tools/delay.ts +7 -0
  493. package/ui/src/lib/tools/image.ts +39 -0
  494. package/ui/src/lib/tools/index.ts +20 -0
  495. package/ui/src/lib/tools/location.ts +41 -0
  496. package/ui/src/lib/tools/metronome.ts +11 -0
  497. package/ui/src/lib/tools/mq.ts +84 -0
  498. package/ui/src/lib/tools/onsubmit.ts +21 -0
  499. package/ui/src/lib/tools/random.ts +15 -0
  500. package/ui/src/lib/tools/search.ts +25 -0
  501. package/ui/src/lib/tools/timeout.ts +26 -0
  502. package/ui/src/lib/tools/transition.ts +207 -0
  503. package/ui/src/lib/tools/types.ts +3 -0
  504. package/ui/src/lib/tools/uuid.test.ts +28 -0
  505. package/ui/src/lib/tools/uuid.ts +9 -0
  506. package/ui/src/lib/typeset.css +502 -0
  507. package/ui/src/lib/utils.ts +12 -0
  508. package/ui/src/routes/(private)/+layout.svelte +112 -0
  509. package/ui/src/routes/(private)/+page.svelte +7 -0
  510. package/ui/src/routes/(private)/[component]/+page.svelte +77 -0
  511. package/ui/src/routes/+layout.svelte +25 -0
  512. package/ui/src/routes/+layout.ts +14 -0
  513. package/ui/src/routes/layout.css +232 -0
  514. package/ui/static/robots.txt +3 -0
  515. package/ui/svelte.config.js +36 -0
  516. package/ui/tools/feat.js +43 -0
  517. package/ui/tools/hooks/README.md +13 -0
  518. package/ui/tools/hooks/guard-intl.sh +40 -0
  519. package/ui/tools/shad.js +7 -0
  520. package/ui/tsconfig.json +20 -0
  521. package/ui/vite.config.ts +8 -0
@@ -0,0 +1,213 @@
1
+ # Customization & Theming
2
+
3
+ Components reference semantic CSS variable tokens. Change the variables to change every component.
4
+
5
+ ## Contents
6
+
7
+ - How it works (CSS variables → Tailwind utilities → components)
8
+ - Color variables and OKLCH format
9
+ - Dark mode setup
10
+ - Changing the theme (presets, CSS variables)
11
+ - Adding custom colors (Tailwind v3 and v4)
12
+ - Border radius
13
+ - Customizing components (variants, class, wrappers)
14
+ - Checking for updates
15
+
16
+ ---
17
+
18
+ ## How It Works
19
+
20
+ 1. CSS variables defined in `:root` (light) and `.dark` (dark mode).
21
+ 2. Tailwind maps them to utilities: `bg-primary`, `text-muted-foreground`, etc.
22
+ 3. Components use these utilities — changing a variable changes all components that reference it.
23
+
24
+ ---
25
+
26
+ ## Color Variables
27
+
28
+ Every color follows the `name` / `name-foreground` convention. The base variable is for backgrounds, `-foreground` is for text/icons on that background.
29
+
30
+ | Variable | Purpose |
31
+ | -------------------------------------------- | -------------------------------- |
32
+ | `--background` / `--foreground` | Page background and default text |
33
+ | `--card` / `--card-foreground` | Card surfaces |
34
+ | `--primary` / `--primary-foreground` | Primary buttons and actions |
35
+ | `--secondary` / `--secondary-foreground` | Secondary actions |
36
+ | `--muted` / `--muted-foreground` | Muted/disabled states |
37
+ | `--accent` / `--accent-foreground` | Hover and accent states |
38
+ | `--destructive` / `--destructive-foreground` | Error and destructive actions |
39
+ | `--border` | Default border color |
40
+ | `--input` | Form input borders |
41
+ | `--ring` | Focus ring color |
42
+ | `--chart-1` through `--chart-5` | Chart/data visualization |
43
+ | `--sidebar-*` | Sidebar-specific colors |
44
+ | `--surface` / `--surface-foreground` | Secondary surface |
45
+
46
+ Colors use OKLCH: `--primary: oklch(0.205 0 0)` where values are lightness (0–1), chroma (0 = gray), and hue (0–360).
47
+
48
+ ---
49
+
50
+ ## Dark Mode
51
+
52
+ Class-based toggle via `.dark` on the root element. In SvelteKit, use [mode-watcher](https://github.com/svecosystem/mode-watcher) (see [Dark mode — Svelte](https://shadcn-svelte.com/docs/dark-mode/svelte)):
53
+
54
+ ```svelte
55
+ <script lang="ts">
56
+ import { ModeWatcher } from "mode-watcher";
57
+ let { children } = $props();
58
+ </script>
59
+
60
+ <ModeWatcher />
61
+ {@render children?.()}
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Changing the Theme
67
+
68
+ Use a **preset** from the design-system builder on [shadcn-svelte.com](https://shadcn-svelte.com) and pass it to `init`:
69
+
70
+ ```bash
71
+ npx shadcn-svelte@latest init --preset <code>
72
+ ```
73
+
74
+ Or edit CSS variables directly in the file set in `components.json` as `tailwind.css` (for example `src/app.css`).
75
+
76
+ To align config and components with a new preset, re-run `init` with `--preset` and confirm overwrites when prompted.
77
+
78
+ ---
79
+
80
+ ## Adding Custom Colors
81
+
82
+ Add variables to the global CSS file path in `components.json` (`tailwind.css`). Do not create a second global CSS file for theming unless the project already uses that pattern.
83
+
84
+ ```css
85
+ /* 1. Define in the global CSS file. */
86
+ :root {
87
+ --warning: oklch(0.84 0.16 84);
88
+ --warning-foreground: oklch(0.28 0.07 46);
89
+ }
90
+ .dark {
91
+ --warning: oklch(0.41 0.11 46);
92
+ --warning-foreground: oklch(0.99 0.02 95);
93
+ }
94
+ ```
95
+
96
+ ```css
97
+ /* 2a. Register with Tailwind v4 (@theme inline). */
98
+ @theme inline {
99
+ --color-warning: var(--warning);
100
+ --color-warning-foreground: var(--warning-foreground);
101
+ }
102
+ ```
103
+
104
+ On Tailwind v3, register in `tailwind.config.js` (see the [Tailwind v3 docs](https://tw3.shadcn-svelte.com) if you maintain a legacy setup):
105
+
106
+ ```js
107
+ // 2b. Register with Tailwind v3 (tailwind.config.js).
108
+ module.exports = {
109
+ theme: {
110
+ extend: {
111
+ colors: {
112
+ warning: "oklch(var(--warning) / <alpha-value>)",
113
+ "warning-foreground":
114
+ "oklch(var(--warning-foreground) / <alpha-value>)",
115
+ },
116
+ },
117
+ },
118
+ };
119
+ ```
120
+
121
+ ```svelte
122
+ <!-- 3. Use in components. -->
123
+ <div class="bg-warning text-warning-foreground">Warning</div>
124
+ ```
125
+
126
+ ---
127
+
128
+ ## Border Radius
129
+
130
+ `--radius` controls border radius globally. Components derive values from it (`rounded-lg` = `var(--radius)`, `rounded-md` = `calc(var(--radius) - 2px)`).
131
+
132
+ ---
133
+
134
+ ## Customizing Components
135
+
136
+ See also: [rules/styling.md](./rules/styling.md) for Incorrect/Correct examples.
137
+
138
+ Prefer these approaches in order:
139
+
140
+ ### 1. Built-in variants
141
+
142
+ ```svelte
143
+ <script lang="ts">
144
+ import { Button } from "$lib/components/ui/button";
145
+ </script>
146
+
147
+ <Button variant="outline" size="sm">Click</Button>
148
+ ```
149
+
150
+ ### 2. Tailwind classes via `class`
151
+
152
+ ```svelte
153
+ <script lang="ts">
154
+ import * as Card from "$lib/components/ui/card";
155
+ </script>
156
+
157
+ <Card.Root class="mx-auto max-w-md">
158
+ <Card.Content>...</Card.Content>
159
+ </Card.Root>
160
+ ```
161
+
162
+ ### 3. Add a new variant
163
+
164
+ Edit the component source to add a variant via `tailwind-variants` / `cva` in the `.svelte` or shared variants file:
165
+
166
+ ```ts
167
+ // e.g. in button variants
168
+ warning: "bg-warning text-warning-foreground hover:bg-warning/90",
169
+ ```
170
+
171
+ ### 4. Wrapper components
172
+
173
+ Compose shadcn-svelte primitives into higher-level `.svelte` files:
174
+
175
+ ```svelte
176
+ <script lang="ts">
177
+ import * as AlertDialog from "$lib/components/ui/alert-dialog";
178
+ let { title, description, onConfirm, children } = $props();
179
+ let open = $state(false);
180
+ </script>
181
+
182
+ <AlertDialog.Root bind:open>
183
+ <AlertDialog.Trigger>
184
+ {@render children?.()}
185
+ </AlertDialog.Trigger>
186
+ <AlertDialog.Content>
187
+ <AlertDialog.Header>
188
+ <AlertDialog.Title>{title}</AlertDialog.Title>
189
+ <AlertDialog.Description>{description}</AlertDialog.Description>
190
+ </AlertDialog.Header>
191
+ <AlertDialog.Footer>
192
+ <AlertDialog.Cancel>Cancel</AlertDialog.Cancel>
193
+ <AlertDialog.Action
194
+ onclick={() => {
195
+ onConfirm?.();
196
+ open = false;
197
+ }}>Confirm</AlertDialog.Action
198
+ >
199
+ </AlertDialog.Footer>
200
+ </AlertDialog.Content>
201
+ </AlertDialog.Root>
202
+ ```
203
+
204
+ ---
205
+
206
+ ## Checking for Updates
207
+
208
+ ```bash
209
+ npx shadcn-svelte@latest update button
210
+ npx shadcn-svelte@latest update --all
211
+ ```
212
+
213
+ See [Updating Components in SKILL.md](./SKILL.md#updating-components). Review `git diff` after `update` to see what changed.
@@ -0,0 +1,47 @@
1
+ {
2
+ "skill_name": "shadcn-svelte",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "I'm building a SvelteKit app with shadcn-svelte (nova style, lucide icons). Create a settings form component with fields for: full name, email address, and notification preferences (email, SMS, push notifications as toggle options). Add validation states for required fields.",
7
+ "expected_output": "A Svelte component using Field.FieldGroup, Field.Field, ToggleGroup, data-invalid/aria-invalid validation, gap-* spacing, and semantic colors.",
8
+ "files": [],
9
+ "expectations": [
10
+ "Uses Field.FieldGroup and Field.Field for form layout instead of raw div with space-y",
11
+ "Uses Switch for independent on/off notification toggles (not looping Button with manual active state)",
12
+ "Uses data-invalid on Field and aria-invalid on the input control for validation states",
13
+ "Uses gap-* (e.g. gap-4, gap-6) instead of space-y-* or space-x-* for spacing",
14
+ "Uses semantic color tokens (e.g. bg-background, text-muted-foreground, text-destructive) instead of raw colors like bg-red-500",
15
+ "No manual dark: color overrides"
16
+ ]
17
+ },
18
+ {
19
+ "id": 2,
20
+ "prompt": "Create a dialog component for editing a user profile. It should have the user's avatar at the top, input fields for name and bio, and Save/Cancel buttons with appropriate icons. Using shadcn-svelte with tabler icons.",
21
+ "expected_output": "A Svelte component with Dialog.Title, Avatar with Avatar.Fallback, data-icon on icon buttons, no icon sizing classes, @tabler/icons-svelte imports.",
22
+ "files": [],
23
+ "expectations": [
24
+ "Includes Dialog.Title for accessibility (visible or with sr-only class)",
25
+ "Avatar includes Avatar.Fallback",
26
+ "Icons on buttons use the data-icon attribute (data-icon=\"inline-start\" or data-icon=\"inline-end\")",
27
+ "No sizing classes on icons inside components (no size-4, w-4, h-4, etc.)",
28
+ "Uses tabler icons (@tabler/icons-svelte) instead of @lucide/svelte when tabler is configured",
29
+ "Uses shadcn-svelte Dialog patterns (e.g. Dialog.Trigger wrapping the control, or bind:open on Dialog.Root)"
30
+ ]
31
+ },
32
+ {
33
+ "id": 3,
34
+ "prompt": "Create a dashboard component that shows 4 stat cards in a grid. Each card has a title, large number, percentage change badge, and a loading skeleton state. Using shadcn-svelte with lucide icons.",
35
+ "expected_output": "A Svelte component with full Card composition, Skeleton for loading, Badge for changes, semantic colors, gap-* spacing.",
36
+ "files": [],
37
+ "expectations": [
38
+ "Uses full Card composition with Card.Header, Card.Title, Card.Content (not dumping everything into Card.Content)",
39
+ "Uses Skeleton component for loading placeholders instead of custom animate-pulse divs",
40
+ "Uses Badge component for percentage change instead of custom styled spans",
41
+ "Uses semantic color tokens instead of raw color values like bg-green-500 or text-red-600",
42
+ "Uses gap-* instead of space-y-* or space-x-* for spacing",
43
+ "Uses size-* when width and height are equal instead of separate w-* h-*"
44
+ ]
45
+ }
46
+ ]
47
+ }
@@ -0,0 +1,244 @@
1
+ # Component Composition
2
+
3
+ ## Contents
4
+
5
+ - Items always inside their Group component
6
+ - Callouts use Alert
7
+ - Empty states use Empty component
8
+ - Toast notifications use svelte-sonner
9
+ - Choosing between overlay components
10
+ - Dialog, Sheet, and Drawer always need a Title
11
+ - Card structure
12
+ - Button has no isPending or isLoading prop
13
+ - Tabs.Trigger must be inside Tabs.List
14
+ - Avatar always needs Avatar.Fallback
15
+ - Use Separator instead of raw hr or border divs
16
+ - Use Skeleton for loading placeholders
17
+ - Use Badge instead of custom styled spans
18
+
19
+ ---
20
+
21
+ ## Items always inside their Group component
22
+
23
+ Never render items directly inside the content container.
24
+
25
+ **Incorrect:**
26
+
27
+ ```svelte
28
+ <script lang="ts">
29
+ import * as Select from "$lib/components/ui/select";
30
+ </script>
31
+
32
+ <Select.Content>
33
+ <Select.Item value="apple">Apple</Select.Item>
34
+ <Select.Item value="banana">Banana</Select.Item>
35
+ </Select.Content>
36
+ ```
37
+
38
+ **Correct:**
39
+
40
+ ```svelte
41
+ <script lang="ts">
42
+ import * as Select from "$lib/components/ui/select";
43
+ </script>
44
+
45
+ <Select.Content>
46
+ <Select.Group>
47
+ <Select.Item value="apple">Apple</Select.Item>
48
+ <Select.Item value="banana">Banana</Select.Item>
49
+ </Select.Group>
50
+ </Select.Content>
51
+ ```
52
+
53
+ This applies to all group-based components:
54
+
55
+ | Item | Group |
56
+ | ------------------------------------------------------------- | -------------------- |
57
+ | `Select.Item`, `Select.Label` | `Select.Group` |
58
+ | `DropdownMenu.Item`, `DropdownMenu.Label`, `DropdownMenu.Sub` | `DropdownMenu.Group` |
59
+ | `Menubar.Item` | `Menubar.Group` |
60
+ | `ContextMenu.Item` | `ContextMenu.Group` |
61
+ | `Command.Item` | `Command.Group` |
62
+
63
+ ---
64
+
65
+ ## Callouts use Alert
66
+
67
+ ```svelte
68
+ <script lang="ts">
69
+ import * as Alert from "$lib/components/ui/alert";
70
+ </script>
71
+
72
+ <Alert.Root>
73
+ <Alert.Title>Warning</Alert.Title>
74
+ <Alert.Description>Something needs attention.</Alert.Description>
75
+ </Alert.Root>
76
+ ```
77
+
78
+ ---
79
+
80
+ ## Empty states use Empty component
81
+
82
+ ```svelte
83
+ <script lang="ts">
84
+ import * as Empty from "$lib/components/ui/empty";
85
+ import { Button } from "$lib/components/ui/button";
86
+ import FolderIcon from "@lucide/svelte/icons/folder";
87
+ </script>
88
+
89
+ <Empty.Root>
90
+ <Empty.Header>
91
+ <Empty.Media variant="icon"><FolderIcon /></Empty.Media>
92
+ <Empty.Title>No projects yet</Empty.Title>
93
+ <Empty.Description
94
+ >Get started by creating a new project.</Empty.Description
95
+ >
96
+ </Empty.Header>
97
+ <Empty.Content>
98
+ <Button>Create Project</Button>
99
+ </Empty.Content>
100
+ </Empty.Root>
101
+ ```
102
+
103
+ ---
104
+
105
+ ## Toast notifications use svelte-sonner
106
+
107
+ ```svelte
108
+ <script lang="ts">
109
+ import { toast } from "svelte-sonner";
110
+ </script>
111
+ ```
112
+
113
+ ```ts
114
+ toast.success("Changes saved.");
115
+ toast.error("Something went wrong.");
116
+ toast("File deleted.", {
117
+ action: { label: "Undo", onClick: () => undoDelete() },
118
+ });
119
+ ```
120
+
121
+ Mount the `Toaster` from your UI folder once in the app layout (see [Sonner](https://shadcn-svelte.com/docs/components/sonner)).
122
+
123
+ ---
124
+
125
+ ## Choosing between overlay components
126
+
127
+ | Use case | Component |
128
+ | ---------------------------------- | ------------- |
129
+ | Focused task that requires input | `Dialog` |
130
+ | Destructive action confirmation | `AlertDialog` |
131
+ | Side panel with details or filters | `Sheet` |
132
+ | Mobile-first bottom panel | `Drawer` |
133
+ | Quick info on hover | `HoverCard` |
134
+ | Small contextual content on click | `Popover` |
135
+
136
+ ---
137
+
138
+ ## Dialog, Sheet, and Drawer always need a Title
139
+
140
+ `Dialog.Title`, `Sheet.Title`, `Drawer.Title` are required for accessibility. Use `class="sr-only"` if visually hidden.
141
+
142
+ ```svelte
143
+ <script lang="ts">
144
+ import * as Dialog from "$lib/components/ui/dialog";
145
+ </script>
146
+
147
+ <Dialog.Content>
148
+ <Dialog.Header>
149
+ <Dialog.Title>Edit Profile</Dialog.Title>
150
+ <Dialog.Description>Update your profile.</Dialog.Description>
151
+ </Dialog.Header>
152
+ ...
153
+ </Dialog.Content>
154
+ ```
155
+
156
+ ---
157
+
158
+ ## Card structure
159
+
160
+ Use full composition — don't dump everything into `Card.Content`:
161
+
162
+ ```svelte
163
+ <script lang="ts">
164
+ import * as Card from "$lib/components/ui/card";
165
+ import { Button } from "$lib/components/ui/button";
166
+ </script>
167
+
168
+ <Card.Root>
169
+ <Card.Header>
170
+ <Card.Title>Team Members</Card.Title>
171
+ <Card.Description>Manage your team.</Card.Description>
172
+ </Card.Header>
173
+ <Card.Content>...</Card.Content>
174
+ <Card.Footer>
175
+ <Button>Invite</Button>
176
+ </Card.Footer>
177
+ </Card.Root>
178
+ ```
179
+
180
+ ---
181
+
182
+ ## Button has no isPending or isLoading prop
183
+
184
+ Compose with `Spinner` inside `Button` + `disabled`:
185
+
186
+ ```svelte
187
+ <script lang="ts">
188
+ import { Button } from "$lib/components/ui/button";
189
+ import { Spinner } from "$lib/components/ui/spinner";
190
+ </script>
191
+
192
+ <Button disabled>
193
+ <Spinner data-icon="inline-start" />
194
+ Saving...
195
+ </Button>
196
+ ```
197
+
198
+ ---
199
+
200
+ ## Tabs.Trigger must be inside Tabs.List
201
+
202
+ Never render `Tabs.Trigger` directly inside `Tabs.Root` — always wrap in `Tabs.List`:
203
+
204
+ ```svelte
205
+ <script lang="ts">
206
+ import * as Tabs from "$lib/components/ui/tabs";
207
+ let tab = $state("account");
208
+ </script>
209
+
210
+ <Tabs.Root bind:value={tab}>
211
+ <Tabs.List>
212
+ <Tabs.Trigger value="account">Account</Tabs.Trigger>
213
+ <Tabs.Trigger value="password">Password</Tabs.Trigger>
214
+ </Tabs.List>
215
+ <Tabs.Content value="account">...</Tabs.Content>
216
+ </Tabs.Root>
217
+ ```
218
+
219
+ ---
220
+
221
+ ## Avatar always needs Avatar.Fallback
222
+
223
+ Always include `Avatar.Fallback` for when the image fails to load:
224
+
225
+ ```svelte
226
+ <script lang="ts">
227
+ import * as Avatar from "$lib/components/ui/avatar";
228
+ </script>
229
+
230
+ <Avatar.Root>
231
+ <Avatar.Image src="/avatar.png" alt="User" />
232
+ <Avatar.Fallback>JD</Avatar.Fallback>
233
+ </Avatar.Root>
234
+ ```
235
+
236
+ ---
237
+
238
+ ## Use existing components instead of custom markup
239
+
240
+ | Instead of | Use |
241
+ | ---------------------------------------------- | ------------------------------------------------------------------------------------------- |
242
+ | `<hr>` or `<div class="border-t">` | `<Separator />` (`import { Separator } from "$lib/components/ui/separator"`) |
243
+ | `<div class="animate-pulse">` with styled divs | `<Skeleton class="h-4 w-3/4" />` (`import { Skeleton } from "$lib/components/ui/skeleton"`) |
244
+ | `<span class="rounded-full bg-green-100 ...">` | `<Badge variant="secondary">` (`import { Badge } from "$lib/components/ui/badge"`) |