@birdapi/velinstyle 1.0.0 → 1.2.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 (321) hide show
  1. package/README.de.md +87 -158
  2. package/README.md +188 -115
  3. package/cli/blueprint.js +98 -5
  4. package/cli/blueprints/app-chrome.html +18 -0
  5. package/cli/blueprints/benefits-grid.html +9 -0
  6. package/cli/blueprints/bottom-nav-mobile.html +2 -1
  7. package/cli/blueprints/cookie-consent.html +1 -1
  8. package/cli/blueprints/cta-band.html +6 -0
  9. package/cli/blueprints/faq-section.html +18 -0
  10. package/cli/blueprints/filter-bar.html +4 -4
  11. package/cli/blueprints/form-contact.html +6 -5
  12. package/cli/blueprints/hero-section.html +3 -3
  13. package/cli/blueprints/notification-center.html +1 -1
  14. package/cli/blueprints/onboarding.html +2 -1
  15. package/cli/blueprints/ops-console.html +29 -0
  16. package/cli/blueprints/pricing-band.html +37 -0
  17. package/cli/blueprints/process-steps.html +10 -0
  18. package/cli/blueprints/services-grid.html +9 -0
  19. package/cli/blueprints/settings-panel.html +8 -6
  20. package/cli/blueprints/split-hero.html +25 -0
  21. package/cli/blueprints/testimonials.html +8 -0
  22. package/cli/blueprints/trust-bar.html +10 -0
  23. package/cli/cli-manifest.json +81 -17
  24. package/cli/contrast-utils.js +97 -0
  25. package/cli/create.js +370 -0
  26. package/cli/docgen/extract-a11y.js +4 -2
  27. package/cli/docgen/extract-attributes.js +126 -10
  28. package/cli/docgen/extract-cli.js +3 -2
  29. package/cli/docgen/extract-components.js +61 -2
  30. package/cli/docgen/extract-utilities.js +10 -10
  31. package/cli/doctor.js +119 -0
  32. package/cli/index.js +535 -46
  33. package/cli/meta.js +84 -1
  34. package/cli/perf-audit.js +15 -2
  35. package/cli/prompt-engine.js +243 -0
  36. package/cli/review.js +268 -0
  37. package/cli/scaffold.js +119 -4
  38. package/cli/scanner-rules-data.js +7 -0
  39. package/cli/scanner.js +357 -4
  40. package/cli/serve.js +81 -0
  41. package/cli/skills.js +223 -0
  42. package/cli/wc-api.js +89 -0
  43. package/cli/workflow.js +42 -0
  44. package/components/index.js +4 -0
  45. package/components/runtime/component-loaders.js +4 -0
  46. package/components/velin-accordion.js +62 -13
  47. package/components/velin-bottom-nav.js +10 -0
  48. package/components/velin-calendar.js +212 -0
  49. package/components/velin-command.js +18 -2
  50. package/components/velin-data-table.js +438 -0
  51. package/components/velin-dialog.js +4 -1
  52. package/components/velin-drawer.js +2 -4
  53. package/components/velin-file-dropzone.js +162 -0
  54. package/components/velin-form-summary.js +348 -0
  55. package/components/velin-icon.js +22 -1
  56. package/components/velin-lightbox.js +5 -3
  57. package/components/velin-modal.js +2 -4
  58. package/components/velin-search.js +1 -1
  59. package/components/velin-sheet.js +2 -4
  60. package/core/a11y/component-contracts.json +35 -1
  61. package/core/highlight/languages/go.js +28 -0
  62. package/core/highlight/languages/python.js +29 -0
  63. package/core/highlight/languages/rust.js +32 -0
  64. package/core/highlight/languages/yaml.js +23 -0
  65. package/core/highlight/registry.js +13 -2
  66. package/core/meta/build.js +126 -6
  67. package/core/meta/design-constraints/contact.json +9 -0
  68. package/core/meta/design-constraints/faq.json +9 -0
  69. package/core/meta/design-constraints/hero.json +13 -0
  70. package/core/meta/knowledge/components.json +622 -0
  71. package/core/meta/knowledge/tokens.json +282 -0
  72. package/core/meta/pages/registry.json +294 -0
  73. package/core/meta/schema.js +3 -1
  74. package/core/meta/sections/registry.json +185 -0
  75. package/dist/chunks/{attributes-TPANLMLF.js → attributes-A423NX5J.js} +3 -3
  76. package/dist/chunks/{attributes-ADOKLKA7.js → attributes-F6UPIEVP.js} +2 -2
  77. package/dist/chunks/{attributes-STYCS3O5.js → attributes-GLYXGGAL.js} +3 -3
  78. package/dist/chunks/{attributes-5Q2WXGRC.js → attributes-UFTYOSAU.js} +20 -3
  79. package/dist/chunks/attributes-XGLXLR2T.js +391 -0
  80. package/dist/chunks/attributes-YF4NI2QS.js +391 -0
  81. package/dist/chunks/browser-AUABBYUK.js +1544 -0
  82. package/dist/chunks/{chunk-SRL6EWHP.js → chunk-2LSKX57P.js} +13 -11
  83. package/dist/chunks/{chunk-RSMRR27R.js → chunk-2TGCVDUL.js} +11 -9
  84. package/dist/chunks/{chunk-XIET2VSZ.js → chunk-5JWGUAPC.js} +17 -13
  85. package/dist/chunks/chunk-7YSO2OQ2.js +113 -0
  86. package/dist/chunks/{chunk-IEHKRARD.js → chunk-BHR3ZG6U.js} +10 -8
  87. package/dist/chunks/{chunk-J472ERN2.js → chunk-ERF5YVP4.js} +15 -4
  88. package/dist/chunks/{chunk-XYLJ2GCB.js → chunk-JMSIHEYX.js} +55 -7
  89. package/dist/chunks/{chunk-MKZP2TBH.js → chunk-L7ZGUU4D.js} +2 -2
  90. package/dist/chunks/chunk-TUGIPKW5.js +113 -0
  91. package/dist/chunks/go-HZ6XTFCK.js +31 -0
  92. package/dist/chunks/{highlight-GJHHV4KM.js → highlight-IBDX4XWS.js} +1 -1
  93. package/dist/chunks/{highlight-XTHRKBA3.js → highlight-M2ELQNYK.js} +1 -1
  94. package/dist/chunks/python-BMPKDKNO.js +32 -0
  95. package/dist/chunks/runtime-entry.js +1 -1
  96. package/dist/chunks/rust-2BWKI2MN.js +35 -0
  97. package/dist/chunks/{velin-accordion-FBIPAEXG.js → velin-accordion-WSY6BMLA.js} +64 -10
  98. package/dist/chunks/{velin-bottom-nav-7GEMPIM6.js → velin-bottom-nav-5RVRNGIP.js} +25 -0
  99. package/dist/chunks/{velin-bottom-nav-2N2TYWOF.js → velin-bottom-nav-N5F4UO2I.js} +26 -1
  100. package/dist/chunks/velin-calendar-OFE6THUD.js +210 -0
  101. package/dist/chunks/velin-calendar-PGVNJTXK.js +217 -0
  102. package/dist/chunks/velin-calendar-XC7JRDSH.js +217 -0
  103. package/dist/chunks/{velin-code-block-CIAURDRJ.js → velin-code-block-ITCLIC6T.js} +1 -1
  104. package/dist/chunks/{velin-code-block-TSUKPY4C.js → velin-code-block-ZGWG7JI5.js} +12 -3
  105. package/dist/chunks/{velin-combobox-NXS4QB4R.js → velin-combobox-56V2ZWT5.js} +1 -1
  106. package/dist/chunks/{velin-command-ONKO2A3J.js → velin-command-2HO2EKR6.js} +29 -2
  107. package/dist/chunks/{velin-command-TMLSRGIU.js → velin-command-ZJSLPK7B.js} +30 -3
  108. package/dist/chunks/{velin-copy-NYDBOKXT.js → velin-copy-XDQSV2XU.js} +1 -1
  109. package/dist/chunks/{velin-countdown-4ZVDGK4R.js → velin-countdown-V4Z5MA63.js} +1 -1
  110. package/dist/chunks/velin-data-table-KK7IDGTP.js +302 -0
  111. package/dist/chunks/velin-data-table-UVR42UUM.js +372 -0
  112. package/dist/chunks/{velin-dialog-GTTZI564.js → velin-dialog-3YK2RPRV.js} +9 -2
  113. package/dist/chunks/{velin-dialog-ELFOZIXZ.js → velin-dialog-S24KAP4S.js} +3 -1
  114. package/dist/chunks/{velin-drawer-BE6TYN3H.js → velin-drawer-5PNU624J.js} +2 -4
  115. package/dist/chunks/{velin-drawer-DLL2GLT6.js → velin-drawer-CCM6S25D.js} +3 -5
  116. package/dist/chunks/{velin-email-RBX6ZR4S.js → velin-email-TNFONXPW.js} +1 -1
  117. package/dist/chunks/velin-file-dropzone-QRGF2JNA.js +154 -0
  118. package/dist/chunks/velin-file-dropzone-XIZMJ3NB.js +154 -0
  119. package/dist/chunks/velin-form-summary-XRQ7COQH.js +273 -0
  120. package/dist/chunks/{velin-icon-7M76DOPB.js → velin-icon-A6NCXGUK.js} +59 -17
  121. package/dist/chunks/{velin-icon-ZTSKUOVN.js → velin-icon-EC4B5XCM.js} +18 -5
  122. package/dist/chunks/{velin-lightbox-6E7CAATP.js → velin-lightbox-FFK4TUUP.js} +7 -6
  123. package/dist/chunks/{velin-lightbox-I75U6JF4.js → velin-lightbox-P725FLTY.js} +15 -5
  124. package/dist/chunks/{velin-menubar-J66JXRWW.js → velin-menubar-6I2LM5HL.js} +1 -1
  125. package/dist/chunks/{velin-modal-5HYNNNUI.js → velin-modal-ICTMGRSU.js} +7 -8
  126. package/dist/chunks/{velin-modal-AEOTZ67O.js → velin-modal-JBNODH7D.js} +2 -4
  127. package/dist/chunks/{velin-popover-T72HK3DF.js → velin-popover-WZG2GHBL.js} +25 -4
  128. package/dist/chunks/{velin-rating-N4DI2XNL.js → velin-rating-QBBYRRBU.js} +1 -1
  129. package/dist/chunks/{velin-search-7B4KJ6TX.js → velin-search-B3L6J2RP.js} +2 -2
  130. package/dist/chunks/{velin-search-2XRQFBCS.js → velin-search-L3UG6NDQ.js} +5 -4
  131. package/dist/chunks/{velin-secure-field-6PV7RZDJ.js → velin-secure-field-DGYMP7OK.js} +1 -1
  132. package/dist/chunks/{velin-segmented-control-GYD5BIXQ.js → velin-segmented-control-P74GJPAR.js} +1 -1
  133. package/dist/chunks/{velin-sheet-R2Y67X6H.js → velin-sheet-M5GZZD7G.js} +2 -4
  134. package/dist/chunks/{velin-sheet-OUK6572T.js → velin-sheet-X7RXIWKV.js} +3 -5
  135. package/dist/chunks/{velin-stepper-X54WGHDG.js → velin-stepper-4YQJUHPC.js} +12 -5
  136. package/dist/chunks/{velin-toast-OMMOA2DK.js → velin-toast-UG5LWTG2.js} +5 -1
  137. package/dist/chunks/{velin-tooltip-BDHGRTQB.js → velin-tooltip-ZDH5SDLU.js} +1 -1
  138. package/dist/chunks/yaml-O67LEQYT.js +26 -0
  139. package/dist/llms.txt +29 -7
  140. package/dist/search-index.json +182 -10
  141. package/dist/velin-agent.json +3997 -26
  142. package/dist/velinstyle-components.iife.js +1952 -287
  143. package/dist/velinstyle-components.js +1956 -287
  144. package/dist/velinstyle-components.min.js +267 -119
  145. package/dist/velinstyle.css +381 -67
  146. package/dist/velinstyle.d.ts +4 -0
  147. package/dist/velinstyle.min.css +1 -1
  148. package/package.json +26 -6
  149. package/packages/skill-engine/README.md +24 -0
  150. package/packages/skill-engine/package.json +7 -0
  151. package/packages/skill-engine/src/catalog.js +29 -0
  152. package/packages/skill-engine/src/index.js +5 -0
  153. package/packages/skill-engine/src/install.js +69 -0
  154. package/packages/skill-engine/src/registry.js +27 -0
  155. package/packages/skill-engine/src/resolve.js +68 -0
  156. package/packages/skill-engine/src/validate.js +40 -0
  157. package/packages/velinstyle-skills/README.md +6 -0
  158. package/packages/velinstyle-skills/adapter.json +8 -0
  159. package/packages/velinstyle-skills/bundles/landing-starter.bundle.yaml +12 -0
  160. package/packages/velinstyle-skills/bundles/review-suite.bundle.yaml +11 -0
  161. package/packages/velinstyle-skills/catalog.json +1004 -0
  162. package/packages/velinstyle-skills/graphs/component-ship.graph.yaml +14 -0
  163. package/packages/velinstyle-skills/graphs/landingpage.graph.yaml +21 -0
  164. package/packages/velinstyle-skills/graphs/release-gate.graph.yaml +15 -0
  165. package/packages/velinstyle-skills/index.js +22 -0
  166. package/packages/velinstyle-skills/package.json +7 -0
  167. package/packages/velinstyle-skills/packs/accessibility.pack.yaml +9 -0
  168. package/packages/velinstyle-skills/packs/design.pack.yaml +10 -0
  169. package/packages/velinstyle-skills/packs/documentation.pack.yaml +8 -0
  170. package/packages/velinstyle-skills/packs/enterprise.pack.yaml +10 -0
  171. package/packages/velinstyle-skills/packs/frontend.pack.yaml +10 -0
  172. package/packages/velinstyle-skills/packs/review.pack.yaml +9 -0
  173. package/packages/velinstyle-skills/projects/admin-panel.project.yaml +12 -0
  174. package/packages/velinstyle-skills/projects/blog.project.yaml +11 -0
  175. package/packages/velinstyle-skills/projects/documentation-portal.project.yaml +13 -0
  176. package/packages/velinstyle-skills/projects/ecommerce-shop.project.yaml +12 -0
  177. package/packages/velinstyle-skills/projects/landing-page.project.yaml +12 -0
  178. package/packages/velinstyle-skills/projects/laravel-dashboard.project.yaml +12 -0
  179. package/packages/velinstyle-skills/projects/marketing-website.project.yaml +14 -0
  180. package/packages/velinstyle-skills/projects/portfolio.project.yaml +12 -0
  181. package/packages/velinstyle-skills/registry.json +142 -0
  182. package/packages/velinstyle-skills/scripts/generate-assets.mjs +163 -0
  183. package/packages/velinstyle-skills/skills/velin-a11y-focus-keyboard/SKILL.md +57 -0
  184. package/packages/velinstyle-skills/skills/velin-a11y-page-checklist/SKILL.md +57 -0
  185. package/packages/velinstyle-skills/skills/velin-a11y-scan-fix/SKILL.md +57 -0
  186. package/packages/velinstyle-skills/skills/velin-ai-agent-briefing/SKILL.md +57 -0
  187. package/packages/velinstyle-skills/skills/velin-ai-plan-scaffold-review/SKILL.md +57 -0
  188. package/packages/velinstyle-skills/skills/velin-ai-skill-authoring/SKILL.md +57 -0
  189. package/packages/velinstyle-skills/skills/velin-components-accessibility-map/SKILL.md +57 -0
  190. package/packages/velinstyle-skills/skills/velin-components-api-contract/SKILL.md +57 -0
  191. package/packages/velinstyle-skills/skills/velin-components-recipe/SKILL.md +57 -0
  192. package/packages/velinstyle-skills/skills/velin-components-select-compose/SKILL.md +57 -0
  193. package/packages/velinstyle-skills/skills/velin-design-hero-compose/SKILL.md +57 -0
  194. package/packages/velinstyle-skills/skills/velin-design-section-rhythm/SKILL.md +57 -0
  195. package/packages/velinstyle-skills/skills/velin-design-surface-roles/SKILL.md +57 -0
  196. package/packages/velinstyle-skills/skills/velin-dev-component-wire/SKILL.md +57 -0
  197. package/packages/velinstyle-skills/skills/velin-dev-page-scaffold/SKILL.md +57 -0
  198. package/packages/velinstyle-skills/skills/velin-dev-plan-first/SKILL.md +57 -0
  199. package/packages/velinstyle-skills/skills/velin-docs-component-guide/SKILL.md +57 -0
  200. package/packages/velinstyle-skills/skills/velin-docs-generate-api/SKILL.md +57 -0
  201. package/packages/velinstyle-skills/skills/velin-dx-doctor-setup/SKILL.md +57 -0
  202. package/packages/velinstyle-skills/skills/velin-dx-project-init/SKILL.md +57 -0
  203. package/packages/velinstyle-skills/skills/velin-migration-legacy-wc/SKILL.md +57 -0
  204. package/packages/velinstyle-skills/skills/velin-migration-prefix-classes/SKILL.md +57 -0
  205. package/packages/velinstyle-skills/skills/velin-motion-reduced-safe/SKILL.md +57 -0
  206. package/packages/velinstyle-skills/skills/velin-motion-reveal-feedback/SKILL.md +57 -0
  207. package/packages/velinstyle-skills/skills/velin-perf-audit-fix/SKILL.md +57 -0
  208. package/packages/velinstyle-skills/skills/velin-perf-runtime-tree-shake/SKILL.md +57 -0
  209. package/packages/velinstyle-skills/skills/velin-release-changelog-sync/SKILL.md +57 -0
  210. package/packages/velinstyle-skills/skills/velin-release-meta-rebuild/SKILL.md +57 -0
  211. package/packages/velinstyle-skills/skills/velin-review-conversion-hero/SKILL.md +57 -0
  212. package/packages/velinstyle-skills/skills/velin-review-page-gate/SKILL.md +57 -0
  213. package/packages/velinstyle-skills/skills/velin-review-seo-meta/SKILL.md +57 -0
  214. package/packages/velinstyle-skills/skills/velin-security-sanitize-html/SKILL.md +57 -0
  215. package/packages/velinstyle-skills/skills/velin-security-scan-pii/SKILL.md +57 -0
  216. package/packages/velinstyle-skills/skills/velin-testing-a11y-suite/SKILL.md +57 -0
  217. package/packages/velinstyle-skills/skills/velin-testing-visual-smoke/SKILL.md +57 -0
  218. package/packages/velinstyle-skills/skills/velin-themes-apply-token/SKILL.md +57 -0
  219. package/packages/velinstyle-skills/skills/velin-themes-contrast-check/SKILL.md +57 -0
  220. package/packages/velinstyle-skills/skills/velin-utilities-layout-apply/SKILL.md +57 -0
  221. package/packages/velinstyle-skills/skills/velin-utilities-prefix-fix/SKILL.md +57 -0
  222. package/packages/velinstyle-skills/skills/velin-utilities-token-map/SKILL.md +57 -0
  223. package/packages/velinstyle-skills/templates/admin-panel.template.yaml +12 -0
  224. package/packages/velinstyle-skills/templates/blog.template.yaml +12 -0
  225. package/packages/velinstyle-skills/templates/documentation-portal.template.yaml +12 -0
  226. package/packages/velinstyle-skills/templates/ecommerce-shop.template.yaml +13 -0
  227. package/packages/velinstyle-skills/templates/landing-page.template.yaml +12 -0
  228. package/packages/velinstyle-skills/templates/laravel-dashboard.template.yaml +11 -0
  229. package/packages/velinstyle-skills/templates/marketing-website.template.yaml +13 -0
  230. package/packages/velinstyle-skills/templates/portfolio.template.yaml +12 -0
  231. package/schemas/component-knowledge.schema.json +33 -0
  232. package/schemas/design-constraint.schema.json +15 -0
  233. package/schemas/design-intelligence.schema.json +19 -0
  234. package/schemas/design-rule.schema.json +19 -0
  235. package/schemas/page-template.schema.json +24 -0
  236. package/schemas/review-report.schema.json +36 -0
  237. package/schemas/section.schema.json +22 -0
  238. package/schemas/skill-bundle.schema.json +15 -0
  239. package/schemas/skill-graph.schema.json +25 -0
  240. package/schemas/skill-pack.schema.json +14 -0
  241. package/schemas/skill-project.schema.json +16 -0
  242. package/schemas/skill-record.schema.json +27 -0
  243. package/schemas/skill-registry.schema.json +17 -0
  244. package/schemas/skill-template.schema.json +17 -0
  245. package/schemas/token-graph.schema.json +27 -0
  246. package/schemas/utility.schema.json +166 -0
  247. package/src/base/wc-placeholder.css +7 -0
  248. package/src/components/alert.css +22 -1
  249. package/src/components/calendar-dropzone.css +5 -0
  250. package/src/components/data-table.css +93 -0
  251. package/src/components/form-validation.css +40 -0
  252. package/src/layout/app-shell.css +33 -0
  253. package/src/tokens/shadow.css +13 -0
  254. package/src/utilities/border.css +2 -0
  255. package/src/utilities/display.css +1 -24
  256. package/src/utilities/responsive.css +16 -1
  257. package/src/utilities/spacing.css +32 -0
  258. package/src/velinstyle.css +3 -0
  259. package/dist/chunks/attributes-3BZLI7XF.js +0 -364
  260. package/dist/chunks/attributes-4N5JP4CG.js +0 -364
  261. package/dist/chunks/attributes-AIR7SVLK.js +0 -364
  262. package/dist/chunks/attributes-BGRN5XZO.js +0 -364
  263. package/dist/chunks/attributes-BVSQAYLR.js +0 -364
  264. package/dist/chunks/attributes-CDYFUY7Y.js +0 -364
  265. package/dist/chunks/attributes-JMYJZBPE.js +0 -364
  266. package/dist/chunks/attributes-R5JY3X4O.js +0 -374
  267. package/dist/chunks/attributes-TNSPQTHX.js +0 -374
  268. package/dist/chunks/chunk-2354NEBP.js +0 -109
  269. package/dist/chunks/chunk-2VNA7G7S.js +0 -109
  270. package/dist/chunks/chunk-AQLRJSGG.js +0 -109
  271. package/dist/chunks/chunk-EWPSDMQT.js +0 -109
  272. package/dist/chunks/chunk-LA7264K4.js +0 -85
  273. package/dist/chunks/chunk-QTJJ3DPO.js +0 -109
  274. package/dist/chunks/chunk-RZQVWFHW.js +0 -109
  275. package/dist/chunks/chunk-U4XHMZ7D.js +0 -109
  276. package/dist/chunks/chunk-V5YIUA6G.js +0 -109
  277. package/dist/chunks/chunk-ZPSPKUYD.js +0 -109
  278. package/dist/chunks/velin-bottom-nav-N3DFQR66.js +0 -86
  279. package/dist/chunks/velin-carousel-Y5VCOABZ.js +0 -213
  280. package/dist/chunks/velin-code-block-ASUBTAQV.js +0 -119
  281. package/dist/chunks/velin-code-block-Y6CM726Q.js +0 -119
  282. package/dist/chunks/velin-combobox-2KDTCQ7N.js +0 -155
  283. package/dist/chunks/velin-command-M7RNHUPR.js +0 -136
  284. package/dist/chunks/velin-copy-T5KDTDXP.js +0 -81
  285. package/dist/chunks/velin-countdown-5XSTN3BH.js +0 -101
  286. package/dist/chunks/velin-counter-ISCTEAHI.js +0 -118
  287. package/dist/chunks/velin-dialog-D2GUHSCD.js +0 -144
  288. package/dist/chunks/velin-dialog-IJLFDXAJ.js +0 -144
  289. package/dist/chunks/velin-dialog-TNS3WXMB.js +0 -144
  290. package/dist/chunks/velin-drawer-MJS6WCF7.js +0 -130
  291. package/dist/chunks/velin-email-N5B5ZYTE.js +0 -90
  292. package/dist/chunks/velin-icon-KZO3IEHG.js +0 -164
  293. package/dist/chunks/velin-lightbox-QOTB4PRL.js +0 -140
  294. package/dist/chunks/velin-lightbox-UCD6N7HF.js +0 -140
  295. package/dist/chunks/velin-live-dot-XHUZCIDZ.js +0 -67
  296. package/dist/chunks/velin-menubar-SFEXJE56.js +0 -86
  297. package/dist/chunks/velin-modal-2HOBXE6F.js +0 -176
  298. package/dist/chunks/velin-modal-GLI2XZZB.js +0 -176
  299. package/dist/chunks/velin-popover-EXINRIGJ.js +0 -145
  300. package/dist/chunks/velin-popover-OXX7MRZ6.js +0 -145
  301. package/dist/chunks/velin-popover-YKCCROJG.js +0 -145
  302. package/dist/chunks/velin-rating-XRQJV4LO.js +0 -91
  303. package/dist/chunks/velin-scroll-top-F2FCZNYD.js +0 -58
  304. package/dist/chunks/velin-search-4YHJWYSS.js +0 -556
  305. package/dist/chunks/velin-search-LWHY23Q5.js +0 -474
  306. package/dist/chunks/velin-secure-field-H7FSBUJW.js +0 -95
  307. package/dist/chunks/velin-segmented-control-PQX6LKOJ.js +0 -109
  308. package/dist/chunks/velin-sheet-3OGI4HD7.js +0 -119
  309. package/dist/chunks/velin-sparkline-GVEANJVW.js +0 -184
  310. package/dist/chunks/velin-sparkline-KDA3GQAN.js +0 -162
  311. package/dist/chunks/velin-stepper-2ZIHLKGM.js +0 -141
  312. package/dist/chunks/velin-stepper-FYEUEWE6.js +0 -141
  313. package/dist/chunks/velin-stepper-wc-QU3KRVQR.js +0 -133
  314. package/dist/chunks/velin-theme-toggle-BNNS7WLV.js +0 -285
  315. package/dist/chunks/velin-theme-toggle-NO7V4TWI.js +0 -285
  316. package/dist/chunks/velin-theme-toggle-QELCJM2Q.js +0 -291
  317. package/dist/chunks/velin-toast-RCZ4CSUC.js +0 -109
  318. package/dist/chunks/velin-toast-WEUBTJG6.js +0 -109
  319. package/dist/chunks/velin-tooltip-664IOHZA.js +0 -112
  320. package/dist/chunks/velin-tooltip-wc-LXDVT6DE.js +0 -103
  321. package/dist/chunks/worker-client-R6DBYPFT.js +0 -46
package/cli/create.js ADDED
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Opinionated scaffolds with validated VelinStyle classes only.
3
+ */
4
+ import { existsSync, mkdirSync, writeFileSync, copyFileSync, cpSync } from 'fs';
5
+ import { join, resolve } from 'path';
6
+ import { validateBlueprintHtml, loadKnownCssClasses } from './blueprint.js';
7
+
8
+ export const CREATE_KINDS = ['landing', 'dashboard', 'docs', 'auth'];
9
+
10
+ function bootScript(vendorPath, tags) {
11
+ const list = tags.map((t) => `'${t}'`).join(', ');
12
+ return ` <script type="module">
13
+ async function boot() {
14
+ try {
15
+ const { bootFromDOM } = await import('@birdapi/velinstyle/runtime');
16
+ await bootFromDOM(document, {
17
+ attributes: true,
18
+ tags: [${list}],
19
+ });
20
+ return;
21
+ } catch {
22
+ /* offline / vendor install — no package resolver */
23
+ }
24
+ await import('./${vendorPath}/velinstyle-components.min.js');
25
+ }
26
+ boot();
27
+ </script>`;
28
+ }
29
+
30
+ function head({ title, theme, vendorPath, intent, goals }) {
31
+ const sprite = `${vendorPath}/velin-icons.svg`;
32
+ const goalsJson = JSON.stringify(goals);
33
+ return `<!DOCTYPE html>
34
+ <html lang="en" data-velin-theme="${theme}" data-velin-reveal-auto>
35
+ <head>
36
+ <meta charset="UTF-8">
37
+ <meta name="viewport" content="width=device-width, initial-scale=1">
38
+ <meta name="velin-icon-sprite" content="${sprite}">
39
+ <title>${title}</title>
40
+ <link rel="stylesheet" href="${vendorPath}/velinstyle.min.css">
41
+ <link rel="stylesheet" href="${vendorPath}/themes/${theme}.min.css">
42
+ <script type="application/vnd.velinstyle.meta+json" id="velin-meta">
43
+ {
44
+ "version": "1.2.0",
45
+ "page": {
46
+ "intent": "${intent}",
47
+ "title": "${title}",
48
+ "goals": ${goalsJson}
49
+ }
50
+ }
51
+ </script>
52
+ </head>`;
53
+ }
54
+
55
+ function landingHtml({ theme, vendorPath }) {
56
+ return `${head({ title: 'VelinStyle landing', theme, vendorPath, intent: 'page:landing', goals: ['marketing-landing'] })}
57
+ <body>
58
+ <a class="velin-skip-link" href="#main">Skip to main content</a>
59
+ <header class="velin-container velin-flex velin-flex--justify-between velin-flex--items-center velin-flex--wrap velin-gap-3 velin-py-4" role="banner">
60
+ <a class="velin-text-lg velin-font-bold velin-no-underline velin-text-inherit" href="#hero">Brand</a>
61
+ <nav class="velin-flex velin-flex--gap-2 velin-flex--wrap" aria-label="Primary">
62
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#features">Features</a>
63
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#contact">Contact</a>
64
+ <a class="velin-btn velin-btn--primary velin-btn--sm" href="#contact">Get started</a>
65
+ </nav>
66
+ <velin-theme-toggle themes-base="${vendorPath}/themes/"></velin-theme-toggle>
67
+ </header>
68
+
69
+ <main id="main">
70
+ <section class="velin-container velin-py-10" id="hero" data-velin-section="hero" aria-labelledby="hero-title">
71
+ <h1 id="hero-title" class="velin-text-4xl velin-font-bold velin-mbe-4">Build accessible UIs faster</h1>
72
+ <p class="velin-text-lg velin-text-muted velin-mbe-6">Generated by <code>velinstyle create landing</code> — only classes that exist in VelinStyle CSS.</p>
73
+ <div class="velin-flex velin-flex--gap-3 velin-flex--wrap">
74
+ <a class="velin-btn velin-btn--primary" href="#contact">Primary CTA</a>
75
+ <a class="velin-btn velin-btn--outline" href="#features">Secondary</a>
76
+ </div>
77
+ </section>
78
+
79
+ <section class="velin-container velin-py-8" id="features" aria-labelledby="features-title">
80
+ <h2 id="features-title" class="velin-text-3xl velin-font-bold velin-mbe-6">Features</h2>
81
+ <div class="velin-grid velin-grid--auto-fit velin-gap-4">
82
+ <article class="velin-card"><div class="velin-card__body"><h3 class="velin-card__title">Tokens</h3><p class="velin-card__text">OKLCH themes</p></div></article>
83
+ <article class="velin-card"><div class="velin-card__body"><h3 class="velin-card__title">A11y</h3><p class="velin-card__text">Contracts + scanner</p></div></article>
84
+ <article class="velin-card"><div class="velin-card__body"><h3 class="velin-card__title">CLI</h3><p class="velin-card__text">plan · review · scan · check</p></div></article>
85
+ </div>
86
+ </section>
87
+
88
+ <section class="velin-container velin-py-8" id="contact" aria-labelledby="contact-title">
89
+ <h2 id="contact-title" class="velin-text-3xl velin-font-bold velin-mbe-4">Contact</h2>
90
+ <form class="velin-flex velin-flex--col velin-gap-3 velin-max-w-md" novalidate>
91
+ <velin-form-summary></velin-form-summary>
92
+ <label class="velin-flex velin-flex--col velin-gap-1" for="landing-email">
93
+ <span>Email</span>
94
+ <input id="landing-email" class="velin-input" type="email" name="email" required autocomplete="email">
95
+ </label>
96
+ <label class="velin-flex velin-flex--col velin-gap-1" for="landing-message">
97
+ <span>Message</span>
98
+ <textarea id="landing-message" class="velin-input" name="message" rows="4" required></textarea>
99
+ </label>
100
+ <button type="submit" class="velin-btn velin-btn--primary">Send</button>
101
+ </form>
102
+ </section>
103
+ </main>
104
+
105
+ <footer class="velin-container velin-py-6 velin-border-block-start velin-text-sm velin-text-muted" role="contentinfo">
106
+ <p>Built with VelinStyle · run <code>velinstyle serve</code> to preview</p>
107
+ </footer>
108
+
109
+ ${bootScript(vendorPath, ['velin-theme-toggle', 'velin-form-summary'])}
110
+ </body>
111
+ </html>
112
+ `;
113
+ }
114
+
115
+ function dashboardHtml({ theme, vendorPath }) {
116
+ const today = new Date().toISOString().slice(0, 10);
117
+ return `${head({ title: 'VelinStyle dashboard', theme, vendorPath, intent: 'page:dashboard', goals: ['admin-shell'] })}
118
+ <body>
119
+ <a class="velin-skip-link" href="#main">Skip to main content</a>
120
+ <div class="velin-app-shell">
121
+ <aside class="velin-app-shell__nav velin-p-4 velin-border-inline-end" aria-label="App">
122
+ <p class="velin-text-lg velin-font-bold velin-mbe-4">Console</p>
123
+ <nav class="velin-flex velin-flex--col velin-gap-2" aria-label="Sidebar">
124
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#main">Overview</a>
125
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#uploads">Uploads</a>
126
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#calendar">Calendar</a>
127
+ </nav>
128
+ <div class="velin-mbs-6" id="calendar">
129
+ <h2 class="velin-text-sm velin-font-bold velin-mbe-2">Calendar</h2>
130
+ <velin-calendar label="Pick a day" value="${today}"></velin-calendar>
131
+ </div>
132
+ </aside>
133
+ <div class="velin-app-shell__body">
134
+ <header class="velin-flex velin-flex--justify-between velin-flex--items-center velin-gap-3 velin-p-4 velin-border-block-end" role="banner">
135
+ <h1 class="velin-text-xl velin-font-bold">Operations</h1>
136
+ <velin-theme-toggle themes-base="${vendorPath}/themes/"></velin-theme-toggle>
137
+ </header>
138
+ <main id="main" class="velin-app-shell__content velin-p-6">
139
+ <p class="velin-text-muted velin-mbe-4">Generated by <code>velinstyle create dashboard</code>. Double-click a cell to edit.</p>
140
+ <label class="velin-flex velin-flex--col velin-gap-1 velin-mbe-3 velin-max-w-md" for="dash-filter">
141
+ <span>Filter rows</span>
142
+ <input id="dash-filter" class="velin-input" type="search" autocomplete="off">
143
+ </label>
144
+ <velin-data-table label="Team tasks" page-size="5" filter-input="#dash-filter" editable empty-text="No tasks">
145
+ <table>
146
+ <caption class="velin-sr-only">Team tasks</caption>
147
+ <thead>
148
+ <tr>
149
+ <th data-sort="text">Task</th>
150
+ <th data-sort="text">Owner</th>
151
+ <th data-sort="text">Status</th>
152
+ </tr>
153
+ </thead>
154
+ <tbody>
155
+ <tr><td data-editable>Ship trust gates</td><td data-editable>Ada</td><td data-editable>Done</td></tr>
156
+ <tr><td data-editable>Wire calendar</td><td data-editable>Lin</td><td data-editable>In review</td></tr>
157
+ <tr><td data-editable>Upload dropzone</td><td data-editable>Kai</td><td data-editable>Todo</td></tr>
158
+ <tr><td data-editable>Docs shell</td><td data-editable>Sam</td><td data-editable>Todo</td></tr>
159
+ <tr><td data-editable>Auth form</td><td data-editable>Rio</td><td data-editable>Done</td></tr>
160
+ <tr><td data-editable>SARIF check</td><td data-editable>Ada</td><td data-editable>Done</td></tr>
161
+ </tbody>
162
+ </table>
163
+ </velin-data-table>
164
+
165
+ <section class="velin-mbs-8" id="uploads" aria-labelledby="upload-title">
166
+ <h2 id="upload-title" class="velin-text-2xl velin-font-bold velin-mbe-3">Uploads</h2>
167
+ <velin-file-dropzone label="Project files" accept=".pdf,.png,.jpg,.csv" multiple></velin-file-dropzone>
168
+ </section>
169
+ </main>
170
+ </div>
171
+ </div>
172
+ ${bootScript(vendorPath, ['velin-theme-toggle', 'velin-data-table', 'velin-calendar', 'velin-file-dropzone'])}
173
+ </body>
174
+ </html>
175
+ `;
176
+ }
177
+
178
+ function docsHtml({ theme, vendorPath }) {
179
+ return `${head({ title: 'VelinStyle docs', theme, vendorPath, intent: 'page:docs', goals: ['docs-shell'] })}
180
+ <body>
181
+ <a class="velin-skip-link" href="#main">Skip to main content</a>
182
+ <header class="velin-container velin-flex velin-flex--justify-between velin-flex--items-center velin-py-4" role="banner">
183
+ <a class="velin-text-lg velin-font-bold velin-no-underline velin-text-inherit" href="#main">Docs</a>
184
+ <velin-theme-toggle themes-base="${vendorPath}/themes/"></velin-theme-toggle>
185
+ </header>
186
+ <div class="velin-container velin-flex velin-flex--wrap velin-gap-6 velin-py-6">
187
+ <nav class="velin-docs-nav velin-flex velin-flex--col velin-gap-2" aria-label="Docs">
188
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#intro">Introduction</a>
189
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#install">Install</a>
190
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#check">Check gate</a>
191
+ </nav>
192
+ <aside class="velin-toc velin-text-sm velin-text-muted" aria-label="On this page">
193
+ <p class="velin-font-bold velin-mbe-2">On this page</p>
194
+ <ul class="velin-stack">
195
+ <li><a href="#intro">Introduction</a></li>
196
+ <li><a href="#install">Install</a></li>
197
+ <li><a href="#check">Check gate</a></li>
198
+ </ul>
199
+ </aside>
200
+ <main id="main" class="velin-docs-main">
201
+ <h1 id="intro" class="velin-text-3xl velin-font-bold velin-mbe-4">Introduction</h1>
202
+ <p class="velin-mbe-4">This docs shell is generated by <code>velinstyle create docs</code>. Use it for guides and API notes.</p>
203
+ <h2 id="install" class="velin-text-2xl velin-font-bold velin-mbe-3">Install</h2>
204
+ <velin-code-block language="bash">npm install @birdapi/velinstyle
205
+ npx velinstyle create docs ./docs-site</velin-code-block>
206
+ <h2 id="check" class="velin-text-2xl velin-font-bold velin-mbs-6 velin-mbe-3">Check gate</h2>
207
+ <p class="velin-mbe-3">Run the quality gate before you ship:</p>
208
+ <velin-code-block language="bash">npx velinstyle check . --json</velin-code-block>
209
+ </main>
210
+ </div>
211
+ ${bootScript(vendorPath, ['velin-theme-toggle', 'velin-code-block'])}
212
+ </body>
213
+ </html>
214
+ `;
215
+ }
216
+
217
+ function authHtml({ theme, vendorPath }) {
218
+ return `${head({ title: 'VelinStyle sign in', theme, vendorPath, intent: 'page:auth', goals: ['auth-login'] })}
219
+ <body>
220
+ <a class="velin-skip-link" href="#main">Skip to main content</a>
221
+ <main id="main" class="velin-container velin-py-10 velin-max-w-md">
222
+ <h1 class="velin-text-3xl velin-font-bold velin-mbe-2">Sign in</h1>
223
+ <p class="velin-text-muted velin-mbe-6">Generated by <code>velinstyle create auth</code>.</p>
224
+ <form class="velin-flex velin-flex--col velin-gap-3" novalidate>
225
+ <velin-form-summary></velin-form-summary>
226
+ <label class="velin-flex velin-flex--col velin-gap-1" for="auth-email">
227
+ <span>Email</span>
228
+ <input id="auth-email" class="velin-input" type="email" name="email" required autocomplete="username">
229
+ </label>
230
+ <label class="velin-flex velin-flex--col velin-gap-1" for="auth-password">
231
+ <span>Password</span>
232
+ <input id="auth-password" class="velin-input" type="password" name="password" required autocomplete="current-password">
233
+ </label>
234
+ <button type="submit" class="velin-btn velin-btn--primary">Continue</button>
235
+ </form>
236
+ <p class="velin-text-sm velin-text-muted velin-mbs-4"><a href="#">Forgot password</a></p>
237
+ </main>
238
+ ${bootScript(vendorPath, ['velin-form-summary'])}
239
+ </body>
240
+ </html>
241
+ `;
242
+ }
243
+
244
+ const HTML_BY_KIND = {
245
+ landing: landingHtml,
246
+ dashboard: dashboardHtml,
247
+ docs: docsHtml,
248
+ auth: authHtml,
249
+ };
250
+
251
+ function copyVendor(pkgRoot, destVendor) {
252
+ const dist = join(pkgRoot, 'dist');
253
+ if (!existsSync(join(dist, 'velinstyle.min.css'))) {
254
+ return { ok: false, missing: dist };
255
+ }
256
+ mkdirSync(destVendor, { recursive: true });
257
+ const files = ['velinstyle.min.css', 'velinstyle-components.min.js', 'velin-icons.svg'];
258
+ const copied = [];
259
+ for (const f of files) {
260
+ const src = join(dist, f);
261
+ if (existsSync(src)) {
262
+ copyFileSync(src, join(destVendor, f));
263
+ copied.push(f);
264
+ }
265
+ }
266
+ const themesSrc = join(dist, 'themes');
267
+ if (existsSync(themesSrc)) {
268
+ cpSync(themesSrc, join(destVendor, 'themes'), { recursive: true });
269
+ copied.push('themes/');
270
+ }
271
+ const docsSrc = join(pkgRoot, 'docs/generated/components');
272
+ const mini = [
273
+ 'velin-toast.md',
274
+ 'velin-data-table.md',
275
+ 'velin-calendar.md',
276
+ 'velin-file-dropzone.md',
277
+ 'velin-stepper.md',
278
+ 'velin-search.md',
279
+ 'velin-form-summary.md',
280
+ 'velin-theme-toggle.md',
281
+ 'velin-rating.md',
282
+ ];
283
+ if (existsSync(docsSrc)) {
284
+ const destDocs = join(destVendor, 'docs');
285
+ mkdirSync(destDocs, { recursive: true });
286
+ const indexLines = [
287
+ '# VelinStyle WC mini-docs (offline)',
288
+ '',
289
+ 'Copied with `velinstyle create`. Full set: framework `docs/generated/components/`.',
290
+ 'CLI: `velinstyle wc api <tag>` (e.g. `velin-toast`).',
291
+ '',
292
+ ];
293
+ for (const f of mini) {
294
+ const src = join(docsSrc, f);
295
+ if (existsSync(src)) {
296
+ copyFileSync(src, join(destDocs, f));
297
+ copied.push(`docs/${f}`);
298
+ indexLines.push(`- [${f.replace('.md', '')}](./${f})`);
299
+ }
300
+ }
301
+ writeFileSync(join(destDocs, 'README.md'), `${indexLines.join('\n')}\n`, 'utf-8');
302
+ copied.push('docs/README.md');
303
+ }
304
+ return { ok: copied.includes('velinstyle.min.css'), copied, destVendor };
305
+ }
306
+
307
+ /**
308
+ * @param {{ kind: string, dir: string, pkgRoot: string, theme?: string, copyAssets?: boolean }} opts
309
+ */
310
+ export function createProject(opts) {
311
+ const kind = opts.kind || 'landing';
312
+ if (!CREATE_KINDS.includes(kind)) {
313
+ return { ok: false, error: `Unknown create kind "${kind}". Use: ${CREATE_KINDS.join('|')}` };
314
+ }
315
+ const dir = resolve(opts.dir || kind);
316
+ const theme = opts.theme || (kind === 'dashboard' ? 'forest' : 'earth');
317
+ const vendorRel = 'vendor/velinstyle';
318
+ mkdirSync(dir, { recursive: true });
319
+
320
+ let vendorResult = null;
321
+ if (opts.copyAssets !== false) {
322
+ vendorResult = copyVendor(opts.pkgRoot, join(dir, vendorRel));
323
+ if (!vendorResult.ok) {
324
+ return {
325
+ ok: false,
326
+ error: `Framework dist/ not found at ${vendorResult.missing}. Build the framework or copy dist into ${vendorRel} manually.`,
327
+ };
328
+ }
329
+ }
330
+
331
+ let html = HTML_BY_KIND[kind]({ theme, vendorPath: vendorRel });
332
+ const check = validateBlueprintHtml(html, loadKnownCssClasses());
333
+ if (!check.ok) {
334
+ return { ok: false, error: `Scaffold emitted unknown classes: ${check.missing.join(', ')}` };
335
+ }
336
+
337
+ const indexPath = join(dir, 'index.html');
338
+ writeFileSync(indexPath, html, 'utf-8');
339
+
340
+ const readme = `# VelinStyle ${kind}
341
+
342
+ Created with \`velinstyle create ${kind}\`.
343
+
344
+ \`\`\`bash
345
+ velinstyle serve .
346
+ velinstyle check .
347
+ \`\`\`
348
+
349
+ Assets: \`${vendorRel}/\` · Theme: \`${theme}\`.
350
+ Offline WC notes: \`${vendorRel}/docs/\` · API: \`velinstyle wc api velin-toast\`.
351
+ Prefer \`import { bootFromDOM } from '@birdapi/velinstyle/runtime'\` in apps with the npm package.
352
+ `;
353
+ writeFileSync(join(dir, 'README.md'), readme, 'utf-8');
354
+
355
+ return {
356
+ ok: true,
357
+ kind,
358
+ dir,
359
+ indexPath,
360
+ vendor: join(dir, vendorRel),
361
+ vendorRel,
362
+ theme,
363
+ vendorCopied: vendorResult?.copied || [],
364
+ };
365
+ }
366
+
367
+ /** @deprecated use createProject({ kind: 'landing', ... }) */
368
+ export function createLanding(opts) {
369
+ return createProject({ ...opts, kind: 'landing' });
370
+ }
@@ -21,10 +21,12 @@ export const WCAG_AAA_CRITERIA = [
21
21
  { id: '2.5.7', level: 'AA', name: 'Dragging Movements', owner: 'CSS + Sample', status: 'pass', testId: 'wcag22-dragging' },
22
22
  { id: '2.5.8', level: 'AA', name: 'Target Size', owner: 'CSS + WC', status: 'pass', testId: 'target-size' },
23
23
  { id: '3.2.6', level: 'A', name: 'Consistent Help', owner: 'CSS', status: 'pass', testId: 'consistent-help' },
24
- { id: '3.3.2', level: 'A', name: 'Labels or Instructions', owner: 'Forms + WC', status: 'partial', testId: 'scan-a11y' },
24
+ { id: '3.3.1', level: 'A', name: 'Error Identification', owner: 'velin-form-summary', status: 'pass', testId: 'velin-form-summary' },
25
+ { id: '3.3.2', level: 'A', name: 'Labels or Instructions', owner: 'Forms + WC + velin-form-summary', status: 'partial', testId: 'scan-a11y' },
26
+ { id: '3.3.3', level: 'AA', name: 'Error Suggestion', owner: 'velin-form-summary', status: 'pass', testId: 'velin-form-summary' },
25
27
  { id: '3.3.7', level: 'A', name: 'Redundant Entry', owner: 'velin-persist + Author', status: 'partial', testId: 'velin-persist' },
26
28
  { id: '3.3.8', level: 'AA', name: 'Accessible Authentication', owner: 'CSS + Sample', status: 'pass', testId: 'wcag22-auth' },
27
- { id: '4.1.2', level: 'A', name: 'Name, Role, Value', owner: 'Web Components', status: 'partial', testId: 'contracts' },
29
+ { id: '4.1.2', level: 'A', name: 'Name, Role, Value', owner: 'Web Components + velin-form-summary', status: 'partial', testId: 'contracts' },
28
30
  { id: '4.1.3', level: 'AA', name: 'Status Messages', owner: 'Announcer + WC', status: 'pass', testId: 'live-regions' },
29
31
  ];
30
32
 
@@ -1,6 +1,6 @@
1
1
  import { join } from 'path';
2
2
  import { listRegisteredAttributes } from '../../core/attributes/registry.js';
3
- import { banner, heading } from './markdown.js';
3
+ import { banner, heading, table } from './markdown.js';
4
4
 
5
5
  const ATTRIBUTE_DOCS = {
6
6
  'velin-modal': 'Opens a modal dialog (bridges to `<velin-modal>`).',
@@ -21,6 +21,7 @@ const ATTRIBUTE_DOCS = {
21
21
  'velin-hover': 'Hover lift/glow animation.',
22
22
  'velin-stagger': 'Stagger child animations (delay in ms).',
23
23
  'velin-scroll': 'Smooth scroll to anchor (`href="#id"`).',
24
+ 'velin-scroll-top': 'Inject / configure `<velin-scroll-top>` (empty or `threshold` px).',
24
25
  'velin-anchor': 'Scroll-margin for anchor targets.',
25
26
  'velin-lazy': 'Lazy-load images with optional skeleton.',
26
27
  'velin-skeleton': 'Skeleton placeholder (`text`, `avatar`, `image`, …).',
@@ -31,6 +32,102 @@ const ATTRIBUTE_DOCS = {
31
32
  'velin-highlight': 'Inline text mark (not syntax highlighting — use `velin-code` or `velinSyntax`).',
32
33
  };
33
34
 
35
+ /** Value | Meaning | Bridges to */
36
+ const ATTRIBUTE_VALUES = {
37
+ 'velin-modal': [
38
+ ['(empty / present)', 'Upgrade host to modal trigger / content bridge', '`<velin-modal>`'],
39
+ ],
40
+ 'velin-tabs': [
41
+ ['(empty / present)', 'Bridge host to tabs controller', '`<velin-tabs>`'],
42
+ ],
43
+ 'velin-accordion': [
44
+ ['(empty / present)', 'Bridge host to accordion', '`<velin-accordion>`'],
45
+ ],
46
+ 'velin-tooltip': [
47
+ ['(empty)', 'Use host `title` / text as tooltip', '`<velin-tooltip>`'],
48
+ ['`text`', 'Explicit tooltip label', '`<velin-tooltip>`'],
49
+ ],
50
+ 'velin-copy': [
51
+ ['(empty)', 'Copy host text content', '`<velin-copy>` / Clipboard API'],
52
+ ['`selector` / value', 'Copy from related node when provided by enhance', 'Clipboard API'],
53
+ ],
54
+ 'velin-counter': [
55
+ ['number', 'Target value to animate toward', '`<velin-counter>`'],
56
+ ],
57
+ 'velin-notify': [
58
+ ['message', 'Toast body text', '`<velin-toast>`'],
59
+ ],
60
+ 'velin-theme': [
61
+ ['`toggle`', 'Cycle light/dark (or theme picker behavior)', '`data-velin-theme`'],
62
+ ['`<name>`', 'Set named theme / scheme', '`data-velin-theme`'],
63
+ ],
64
+ 'velin-progress': [
65
+ ['`0`–`100`', 'Linear progress value', '`<velin-progress>`'],
66
+ ['`ring`', 'Use progress ring instead of bar', '`<velin-progress-ring>`'],
67
+ ],
68
+ 'velin-search': [
69
+ ['(empty / present)', 'Attach search UI / behavior', 'VelinSearch / `<velin-search>`'],
70
+ ],
71
+ 'velin-scroll-top': [
72
+ ['(empty)', 'Mount default scroll-top control', '`<velin-scroll-top>`'],
73
+ ['threshold px', 'Show after scroll distance', '`<velin-scroll-top>`'],
74
+ ],
75
+ 'velin-reveal': [
76
+ ['(empty / present)', 'Reveal when in view', 'Motion runtime'],
77
+ ],
78
+ 'velin-fade': [
79
+ ['(empty / present)', 'Fade in on scroll', 'Motion runtime'],
80
+ ],
81
+ 'velin-slide': [
82
+ ['`up`', 'Slide from below', 'Motion runtime'],
83
+ ['`down`', 'Slide from above', 'Motion runtime'],
84
+ ['`left` / `right`', 'Horizontal slide', 'Motion runtime'],
85
+ ],
86
+ 'velin-scale': [
87
+ ['(empty / present)', 'Scale in on scroll', 'Motion runtime'],
88
+ ],
89
+ 'velin-parallax': [
90
+ ['(empty)', 'Default parallax speed', 'Motion runtime'],
91
+ ['`slow`', 'Reduced parallax factor', 'Motion runtime'],
92
+ ],
93
+ 'velin-hover': [
94
+ ['(empty / present)', 'Hover lift / glow', 'Motion CSS'],
95
+ ],
96
+ 'velin-stagger': [
97
+ ['ms number', 'Stagger delay between children', 'Motion runtime'],
98
+ ],
99
+ 'velin-scroll': [
100
+ ['(empty / present)', 'Smooth-scroll using `href="#id"`', 'Scroll behavior'],
101
+ ],
102
+ 'velin-anchor': [
103
+ ['(empty / length)', 'Apply scroll-margin for in-page targets', 'CSS scroll-margin'],
104
+ ],
105
+ 'velin-lazy': [
106
+ ['(empty / present)', 'Lazy-load `<img>` (`loading="lazy"`)', 'Native lazy + optional skeleton'],
107
+ ],
108
+ 'velin-skeleton': [
109
+ ['`text`', 'Text-line placeholder', 'Skeleton CSS'],
110
+ ['`avatar`', 'Circular placeholder', 'Skeleton CSS'],
111
+ ['`image`', 'Media block placeholder', 'Skeleton CSS'],
112
+ ['`card` / other', 'Preset shapes when supported', 'Skeleton CSS'],
113
+ ],
114
+ 'velin-loading': [
115
+ ['(empty / present)', 'Busy / spinner state (`aria-busy`)', 'Loading CSS'],
116
+ ],
117
+ 'velin-grid': [
118
+ ['column count', 'Auto-fit grid columns', 'CSS grid'],
119
+ ],
120
+ 'velin-code': [
121
+ ['language id (`js`, `css`, …)', 'Syntax highlight + copy chrome', 'VelinHighlight / `<velin-code-block>`'],
122
+ ],
123
+ 'velin-quote': [
124
+ ['(empty / present)', 'Style host as blockquote', 'Quote CSS'],
125
+ ],
126
+ 'velin-highlight': [
127
+ ['(empty / present)', 'Inline mark emphasis', 'Mark CSS'],
128
+ ],
129
+ };
130
+
34
131
  const A11Y_NOTES = {
35
132
  'velin-reveal': 'Honors `prefers-reduced-motion`: content shown immediately without animation.',
36
133
  'velin-fade': 'Honors `prefers-reduced-motion`.',
@@ -44,12 +141,29 @@ const A11Y_NOTES = {
44
141
  'velin-loading': 'Sets `aria-busy`, `role="status"`, default `aria-label="Loading"`.',
45
142
  'velin-notify': 'Dispatches toast event; pair with `<velin-announcer>` or `initA11y()`.',
46
143
  'velin-lazy': 'Adds `loading="lazy"` on `<img>` only.',
144
+ 'velin-scroll-top': 'Ensure the control has an accessible name when rendered.',
145
+ 'velin-modal': 'Prefer the web component for focus trap / `velin-close`; attribute is a bridge.',
146
+ };
147
+
148
+ const EXAMPLES = {
149
+ 'velin-code': '<pre velin-code="js" language="js"><code>const x = 42;</code></pre>',
150
+ 'velin-scroll': '<a href="#section" velin-scroll>Jump to section</a>',
151
+ 'velin-slide': '<div velin-slide="up">…</div>',
152
+ 'velin-theme': '<button type="button" velin-theme="toggle">Theme</button>',
153
+ 'velin-progress': '<div velin-progress="42"></div>',
154
+ 'velin-skeleton': '<div velin-skeleton="text"></div>',
155
+ 'velin-scroll-top': '<body velin-scroll-top>',
156
+ 'velin-notify': '<button type="button" velin-notify="Saved">Notify</button>',
157
+ 'velin-stagger': '<ul velin-stagger="80">…</ul>',
158
+ 'velin-grid': '<div velin-grid="3">…</div>',
159
+ 'velin-parallax': '<div velin-parallax="slow">…</div>',
47
160
  };
48
161
 
49
162
  export function extractAttributes() {
50
163
  return listRegisteredAttributes().map((name) => ({
51
164
  name,
52
165
  description: ATTRIBUTE_DOCS[name] || 'Velin HTML attribute extension.',
166
+ values: ATTRIBUTE_VALUES[name] || [['(empty / present)', 'Enable the attribute behavior', 'Attribute registry']],
53
167
  }));
54
168
  }
55
169
 
@@ -57,14 +171,15 @@ export function renderAttribute(attr) {
57
171
  let md = banner('velinstyle docs generate');
58
172
  md += heading(1, attr.name);
59
173
  md += `\n${attr.description}\n\n`;
174
+
175
+ md += heading(2, 'Values');
176
+ md += table(
177
+ ['Value', 'Meaning', 'Bridges to'],
178
+ (attr.values || []).map((row) => row.map((cell) => cell)),
179
+ );
180
+
60
181
  md += '## Example\n\n```html\n';
61
- if (attr.name === 'velin-code') {
62
- md += '<pre velin-code="js" language="js"><code>const x = 42;</code></pre>\n';
63
- } else if (attr.name === 'velin-scroll') {
64
- md += '<a href="#section" velin-scroll>Jump to section</a>\n';
65
- } else {
66
- md += `<div ${attr.name}${attr.name === 'velin-slide' ? '="up"' : ''}>…</div>\n`;
67
- }
182
+ md += `${EXAMPLES[attr.name] || `<div ${attr.name}>…</div>`}\n`;
68
183
  md += '```\n';
69
184
  if (A11Y_NOTES[attr.name]) {
70
185
  md += '\n## Accessibility\n\n';
@@ -77,9 +192,10 @@ export function renderAttributesIndex(attrs) {
77
192
  let md = banner('velinstyle docs generate');
78
193
  md += heading(1, 'Velin HTML attributes');
79
194
  md += '\nDeclarative extensions interpreted by `bootAttributes()` / `bootFromDOM({ attributes: true })`.\n\n';
80
- md += '| Attribute | Description |\n| --- | --- |\n';
195
+ md += '| Attribute | Description | Values |\n| --- | --- | --- |\n';
81
196
  for (const a of attrs) {
82
- md += `| [\`${a.name}\`](./${a.name}.md) | ${a.description} |\n`;
197
+ const n = (a.values && a.values.length) || 0;
198
+ md += `| [\`${a.name}\`](./${a.name}.md) | ${a.description} | ${n} |\n`;
83
199
  }
84
200
  return md;
85
201
  }
@@ -7,8 +7,9 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
7
7
 
8
8
  /** Commands registered in cli/index.js switch */
9
9
  export const REGISTERED_COMMANDS = [
10
- 'init', 'build', 'themes', 'add', 'icons', 'blueprint', 'tokens',
11
- 'scan', 'prefix', 'scaffold', 'layout', 'perf', 'docs', 'meta',
10
+ 'init', 'build', 'themes', 'add', 'icons', 'blueprint', 'create', 'serve', 'doctor', 'check', 'tokens',
11
+ 'scan', 'prefix', 'scaffold', 'plan', 'review', 'layout', 'perf', 'docs', 'meta',
12
+ 'search', 'skills', 'workflow', 'wc',
12
13
  ];
13
14
 
14
15
  export function loadCliManifest() {