@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
@@ -1,9 +1,9 @@
1
- <form class="velin-flex velin-flex-wrap velin-gap-3 velin-p-4 velin-border-b" role="search" aria-label="Filter list">
2
- <label class="velin-flex velin-flex-col velin-gap-1">
1
+ <form class="velin-flex velin-flex--wrap velin-gap-3 velin-p-4 velin-border-block-end" role="search" aria-label="Filter list">
2
+ <label class="velin-flex velin-flex--col velin-gap-1">
3
3
  <span class="velin-text-sm">Query</span>
4
4
  <input type="search" class="velin-input" name="q" placeholder="Search…" />
5
5
  </label>
6
- <label class="velin-flex velin-flex-col velin-gap-1">
6
+ <label class="velin-flex velin-flex--col velin-gap-1">
7
7
  <span class="velin-text-sm">Status</span>
8
8
  <select class="velin-select" name="status">
9
9
  <option value="">All</option>
@@ -11,5 +11,5 @@
11
11
  <option value="done">Done</option>
12
12
  </select>
13
13
  </label>
14
- <button type="submit" class="velin-btn velin-btn--primary velin-self-end">Apply</button>
14
+ <button type="submit" class="velin-btn velin-btn--primary">Apply</button>
15
15
  </form>
@@ -1,17 +1,18 @@
1
1
  <!-- VelinStyle blueprint: contact form -->
2
- <form class="velin-container" style="max-width:32rem" novalidate>
3
- <h2 class="velin-text-2xl" style="font-weight:var(--velin-weight-semibold);margin-block-end:var(--velin-space-6)">Contact</h2>
2
+ <form class="velin-container" style="max-width:32rem" id="contact" novalidate>
3
+ <h2 class="velin-text-2xl" style="font-weight:var(--velin-weight-semibold);margin-block-end:var(--velin-space-4)">Contact</h2>
4
+ <velin-form-summary></velin-form-summary>
4
5
  <div class="velin-field">
5
6
  <label class="velin-label" for="bp-contact-name">Name</label>
6
- <input type="text" id="bp-contact-name" class="velin-input" autocomplete="name" required>
7
+ <input type="text" id="bp-contact-name" name="name" class="velin-input" autocomplete="name" required>
7
8
  </div>
8
9
  <div class="velin-field">
9
10
  <label class="velin-label" for="bp-contact-email">Email</label>
10
- <input type="email" id="bp-contact-email" class="velin-input" autocomplete="email" required>
11
+ <input type="email" id="bp-contact-email" name="email" class="velin-input" autocomplete="email" required>
11
12
  </div>
12
13
  <div class="velin-field">
13
14
  <label class="velin-label" for="bp-contact-msg">Message</label>
14
- <textarea id="bp-contact-msg" class="velin-input" rows="4" required></textarea>
15
+ <textarea id="bp-contact-msg" name="message" class="velin-input" rows="4" required></textarea>
15
16
  </div>
16
17
  <button type="submit" class="velin-btn velin-btn--primary">Send</button>
17
18
  </form>
@@ -1,9 +1,9 @@
1
1
  <!-- VelinStyle blueprint: hero section -->
2
- <section class="velin-container velin-p-8" style="text-align:center;max-width:48rem;margin-inline:auto">
2
+ <section class="velin-container velin-py-10" style="text-align:center;max-width:48rem;margin-inline:auto">
3
3
  <h1 class="velin-text-4xl" style="font-weight:var(--velin-weight-bold);letter-spacing:-0.02em;margin-block-end:var(--velin-space-4)">Headline</h1>
4
4
  <p class="velin-text-lg" style="color:var(--velin-color-text-muted);margin-block-end:var(--velin-space-6)">Short value proposition for your product.</p>
5
5
  <div class="velin-flex velin-flex--gap-3 velin-flex--justify-center velin-flex--wrap">
6
- <a class="velin-btn velin-btn--primary" href="#">Primary CTA</a>
7
- <a class="velin-btn velin-btn--outline" href="#">Secondary</a>
6
+ <a class="velin-btn velin-btn--primary" href="#contact">Primary CTA</a>
7
+ <a class="velin-btn velin-btn--outline" href="#services">Secondary</a>
8
8
  </div>
9
9
  </section>
@@ -1,6 +1,6 @@
1
1
  <section class="velin-p-4" aria-labelledby="notif-title">
2
2
  <h2 id="notif-title" class="velin-text-lg velin-font-bold velin-mbe-4">Notifications</h2>
3
- <ul class="velin-flex velin-flex-col velin-gap-3" role="list">
3
+ <ul class="velin-flex velin-flex--col velin-gap-3" role="list">
4
4
  <li class="velin-p-3 velin-border velin-rounded-lg">
5
5
  <p class="velin-font-medium">Backup complete</p>
6
6
  <p class="velin-text-sm velin-text-muted">2 minutes ago</p>
@@ -15,7 +15,8 @@
15
15
  </section>
16
16
  </velin-stepper>
17
17
  <script type="module">
18
- import '../../dist/velinstyle-components.min.js';
18
+ // Prefer package entry; for offline vendor installs use: import './vendor/velinstyle/velinstyle-components.min.js';
19
+ import '@birdapi/velinstyle/bundle';
19
20
  const stepper = document.getElementById('onboard');
20
21
  document.querySelectorAll('[data-next]').forEach((btn) => {
21
22
  btn.addEventListener('click', () => stepper?.next());
@@ -0,0 +1,29 @@
1
+ <!-- VelinStyle blueprint: ops console (holy-grail + table) -->
2
+ <div class="velin-layout-holy-grail">
3
+ <header class="velin-p-3 velin-border-block-end" role="banner">
4
+ <strong>Ops console</strong>
5
+ </header>
6
+ <aside class="velin-p-4" aria-label="Console navigation">
7
+ <nav class="velin-flex velin-flex--col velin-gap-2">
8
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#queue">Queue</a>
9
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#reviews">Reviews</a>
10
+ <a class="velin-btn velin-btn--ghost velin-btn--sm" href="#shipped">Shipped</a>
11
+ </nav>
12
+ </aside>
13
+ <main id="main" class="velin-p-6" role="main">
14
+ <h1 class="velin-text-xl velin-font-bold velin-mbe-4">Queue</h1>
15
+ <div class="velin-table-wrapper">
16
+ <table class="velin-table">
17
+ <caption class="velin-sr-only">Ops queue</caption>
18
+ <thead>
19
+ <tr><th scope="col">Item</th><th scope="col">Owner</th><th scope="col">Status</th></tr>
20
+ </thead>
21
+ <tbody>
22
+ <tr><td>Brand refresh</td><td>Alex</td><td><span class="velin-badge velin-badge--success">Ready</span></td></tr>
23
+ <tr><td>Case study</td><td>Sam</td><td><span class="velin-badge">Draft</span></td></tr>
24
+ </tbody>
25
+ </table>
26
+ </div>
27
+ </main>
28
+ <footer class="velin-p-3 velin-border-block-start velin-text-sm velin-text-muted" role="contentinfo">Status · live</footer>
29
+ </div>
@@ -0,0 +1,37 @@
1
+ <!-- VelinStyle blueprint: contiguous pricing band -->
2
+ <section class="velin-container velin-py-10" id="pricing" aria-labelledby="pricing-title">
3
+ <header class="velin-mbe-6" style="text-align:center;max-inline-size:40rem;margin-inline:auto">
4
+ <h2 id="pricing-title" class="velin-text-3xl velin-font-bold velin-mbe-2">Pricing</h2>
5
+ <p class="velin-text-muted">Contiguous columns — highlight the recommended plan with border-primary.</p>
6
+ </header>
7
+ <div class="velin-grid velin-gap-0" style="grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));border:1px solid var(--velin-color-border);border-radius:var(--velin-radius-lg);overflow:hidden">
8
+ <article class="velin-p-6 velin-border-inline" style="border-inline-end:1px solid var(--velin-color-border)">
9
+ <h3 class="velin-text-lg velin-font-bold">Starter</h3>
10
+ <p class="velin-text-3xl velin-font-bold velin-mbs-2 velin-mbe-4">$0</p>
11
+ <ul class="velin-text-sm velin-mbe-4" role="list">
12
+ <li>1 workspace</li>
13
+ <li>Community support</li>
14
+ </ul>
15
+ <button type="button" class="velin-btn velin-btn--outline velin-w-full">Choose</button>
16
+ </article>
17
+ <article class="velin-p-6 velin-border velin-border-primary" style="border-width:2px;z-index:1">
18
+ <span class="velin-badge velin-badge--primary">Recommended</span>
19
+ <h3 class="velin-text-lg velin-font-bold velin-mbs-2">Pro</h3>
20
+ <p class="velin-text-3xl velin-font-bold velin-mbs-2 velin-mbe-4">$29</p>
21
+ <ul class="velin-text-sm velin-mbe-4" role="list">
22
+ <li>Unlimited projects</li>
23
+ <li>Priority support</li>
24
+ </ul>
25
+ <button type="button" class="velin-btn velin-btn--primary velin-w-full">Choose</button>
26
+ </article>
27
+ <article class="velin-p-6">
28
+ <h3 class="velin-text-lg velin-font-bold">Studio</h3>
29
+ <p class="velin-text-3xl velin-font-bold velin-mbs-2 velin-mbe-4">$99</p>
30
+ <ul class="velin-text-sm velin-mbe-4" role="list">
31
+ <li>SSO + seats</li>
32
+ <li>Dedicated success</li>
33
+ </ul>
34
+ <button type="button" class="velin-btn velin-btn--outline velin-w-full">Contact</button>
35
+ </article>
36
+ </div>
37
+ </section>
@@ -0,0 +1,10 @@
1
+ <!-- VelinStyle blueprint: process steps -->
2
+ <section class="velin-container velin-py-8" id="process">
3
+ <h2 class="velin-text-3xl" style="font-weight:var(--velin-weight-semibold);margin-block-end:var(--velin-space-6)">How it works</h2>
4
+ <ol class="velin-stack" style="padding-inline-start:1.25rem">
5
+ <li><strong>Discover</strong> — short intake to clarify goals and constraints.</li>
6
+ <li><strong>Plan</strong> — transparent next steps and timeline.</li>
7
+ <li><strong>Deliver</strong> — reviewed output with clear ownership.</li>
8
+ <li><strong>Support</strong> — follow-up when regulations or needs change.</li>
9
+ </ol>
10
+ </section>
@@ -0,0 +1,9 @@
1
+ <!-- VelinStyle blueprint: services / Leistungen grid -->
2
+ <section class="velin-container velin-py-8" id="services">
3
+ <h2 class="velin-text-3xl" style="font-weight:var(--velin-weight-semibold);margin-block-end:var(--velin-space-6)">Services</h2>
4
+ <div class="velin-grid velin-grid--auto-fit">
5
+ <article class="velin-card"><div class="velin-card__body"><h3 class="velin-card__title">Service one</h3><p class="velin-card__text">Outcome-focused description.</p><a href="#contact" class="velin-btn velin-btn--outline velin-btn--sm">Learn more</a></div></article>
6
+ <article class="velin-card"><div class="velin-card__body"><h3 class="velin-card__title">Service two</h3><p class="velin-card__text">Outcome-focused description.</p><a href="#contact" class="velin-btn velin-btn--outline velin-btn--sm">Learn more</a></div></article>
7
+ <article class="velin-card"><div class="velin-card__body"><h3 class="velin-card__title">Service three</h3><p class="velin-card__text">Outcome-focused description.</p><a href="#contact" class="velin-btn velin-btn--outline velin-btn--sm">Learn more</a></div></article>
8
+ </div>
9
+ </section>
@@ -1,19 +1,21 @@
1
1
  <velin-sheet id="settings-sheet" title="Settings">
2
- <form class="velin-flex velin-flex-col velin-gap-4 velin-p-4">
3
- <label class="velin-flex velin-flex-col velin-gap-1">
2
+ <form class="velin-flex velin-flex--col velin-gap-4 velin-p-4">
3
+ <label class="velin-flex velin-flex--col velin-gap-1">
4
4
  <span>Display name</span>
5
5
  <input type="text" class="velin-input" name="name" autocomplete="name" />
6
6
  </label>
7
- <label class="velin-flex velin-items-center velin-gap-2">
8
- <input type="checkbox" class="velin-checkbox" name="notify" />
9
- <span>Email notifications</span>
7
+ <label class="velin-switch">
8
+ <input type="checkbox" class="velin-switch__input" name="notify" />
9
+ <span class="velin-switch__track" aria-hidden="true"></span>
10
+ <span class="velin-switch__label">Email notifications</span>
10
11
  </label>
11
12
  <button type="submit" class="velin-btn velin-btn--primary">Save</button>
12
13
  </form>
13
14
  </velin-sheet>
14
15
  <button type="button" class="velin-btn velin-btn--outline" id="open-settings">Open settings</button>
15
16
  <script type="module">
16
- import '../../dist/velinstyle-components.min.js';
17
+ // Prefer package entry; for offline vendor installs use: import './vendor/velinstyle/velinstyle-components.min.js';
18
+ import '@birdapi/velinstyle/bundle';
17
19
  document.getElementById('open-settings')?.addEventListener('click', () => {
18
20
  document.getElementById('settings-sheet')?.open?.();
19
21
  });
@@ -0,0 +1,25 @@
1
+ <!-- VelinStyle blueprint: split hero (copy + ops panel) -->
2
+ <section class="velin-container velin-py-10" id="hero" data-velin-section="hero" aria-labelledby="split-hero-title">
3
+ <div class="velin-grid velin-gap-6" style="grid-template-columns:repeat(auto-fit,minmax(16rem,1fr));align-items:center">
4
+ <div>
5
+ <p class="velin-text-sm velin-text-muted velin-mbe-2">Creative ops</p>
6
+ <h1 id="split-hero-title" class="velin-text-4xl velin-font-bold velin-mbe-4">Ship editorial work without chaos</h1>
7
+ <p class="velin-text-lg velin-text-muted velin-mbe-6">Split layout hero — primary and secondary CTAs only.</p>
8
+ <div class="velin-flex velin-flex--gap-3 velin-flex--wrap">
9
+ <a class="velin-btn velin-btn--primary" href="#contact">Book a call</a>
10
+ <a class="velin-btn velin-btn--outline" href="#capabilities">See capabilities</a>
11
+ </div>
12
+ </div>
13
+ <aside class="velin-card" aria-label="Ops snapshot">
14
+ <div class="velin-card__body">
15
+ <h2 class="velin-card__title">Live ops</h2>
16
+ <p class="velin-card__text velin-text-muted">Queue · reviews · publishes</p>
17
+ <ul class="velin-stack velin-mbs-4" role="list">
18
+ <li class="velin-flex velin-flex--justify-between"><span>Briefs</span><strong>12</strong></li>
19
+ <li class="velin-flex velin-flex--justify-between"><span>In review</span><strong>4</strong></li>
20
+ <li class="velin-flex velin-flex--justify-between"><span>Shipped</span><strong>38</strong></li>
21
+ </ul>
22
+ </div>
23
+ </aside>
24
+ </div>
25
+ </section>
@@ -0,0 +1,8 @@
1
+ <!-- VelinStyle blueprint: testimonials -->
2
+ <section class="velin-container velin-py-8" id="testimonials">
3
+ <h2 class="velin-text-3xl" style="font-weight:var(--velin-weight-semibold);margin-block-end:var(--velin-space-6)">What clients say</h2>
4
+ <div class="velin-grid velin-grid--auto-fit">
5
+ <figure class="velin-card"><div class="velin-card__body"><blockquote class="velin-card__text">“Clear advice and a process we could follow.”</blockquote><figcaption class="velin-text-sm" style="color:var(--velin-color-text-muted);margin-block-start:var(--velin-space-3)">— A. Meyer, Founder</figcaption></div></figure>
6
+ <figure class="velin-card"><div class="velin-card__body"><blockquote class="velin-card__text">“We finally understood our options without pressure.”</blockquote><figcaption class="velin-text-sm" style="color:var(--velin-color-text-muted);margin-block-start:var(--velin-space-3)">— S. Keller, Operator</figcaption></div></figure>
7
+ </div>
8
+ </section>
@@ -0,0 +1,10 @@
1
+ <!-- VelinStyle blueprint: trust bar -->
2
+ <section class="velin-container velin-py-6" aria-label="Trusted by">
3
+ <p class="velin-text-sm velin-text-center" style="color:var(--velin-color-text-muted);margin-block-end:var(--velin-space-4)">Trusted by teams who value clarity</p>
4
+ <ul class="velin-flex velin-flex--wrap velin-flex--justify-center velin-flex--gap-6" style="list-style:none;padding:0;margin:0">
5
+ <li class="velin-text-sm" style="font-weight:var(--velin-weight-semibold)">Acme Audit</li>
6
+ <li class="velin-text-sm" style="font-weight:var(--velin-weight-semibold)">Nordic Ledger</li>
7
+ <li class="velin-text-sm" style="font-weight:var(--velin-weight-semibold)">Rhein Finance</li>
8
+ <li class="velin-text-sm" style="font-weight:var(--velin-weight-semibold)">Helix Tax</li>
9
+ </ul>
10
+ </section>
@@ -1,17 +1,17 @@
1
1
  {
2
- "version": "1.0.0",
2
+ "version": "1.2.0",
3
3
  "commands": [
4
4
  {
5
5
  "name": "init",
6
- "summary": "Create velinstyle.config.js",
6
+ "summary": "Create velinstyle.config.js, optional vendor copy, and starter HTML with reveal/sprite defaults",
7
7
  "flags": [],
8
8
  "example": "velinstyle init"
9
9
  },
10
10
  {
11
11
  "name": "build",
12
12
  "summary": "Build custom CSS with selected layers from config",
13
- "flags": [],
14
- "example": "velinstyle build"
13
+ "flags": ["--output", "-o", "--minify", "--preset"],
14
+ "example": "velinstyle build --preset lite -o ./lite.css"
15
15
  },
16
16
  {
17
17
  "name": "themes",
@@ -34,9 +34,9 @@
34
34
  },
35
35
  {
36
36
  "name": "scan",
37
- "summary": "Security, accessibility, CSS, and PII scanner",
37
+ "summary": "Security, accessibility, CSS, and PII scanner (directory or single file)",
38
38
  "flags": ["--format", "--severity", "--only", "--fix", "--fix-dry-run", "--fix-lang"],
39
- "example": "velinstyle scan . --only pii --fix-dry-run"
39
+ "example": "velinstyle scan index.html"
40
40
  },
41
41
  {
42
42
  "name": "prefix",
@@ -46,17 +46,61 @@
46
46
  },
47
47
  {
48
48
  "name": "blueprint",
49
- "summary": "Print HTML blueprint snippets",
50
- "flags": ["--output", "-o"],
49
+ "summary": "Print HTML blueprint snippets; --strict fails on classes missing from CSS",
50
+ "flags": ["--output", "-o", "--strict"],
51
51
  "subcommands": ["list"],
52
- "example": "velinstyle blueprint modal -o snippet.html"
52
+ "example": "velinstyle blueprint modal -o snippet.html --strict"
53
+ },
54
+ {
55
+ "name": "create",
56
+ "summary": "Scaffold a runnable project: landing | dashboard | docs | auth",
57
+ "flags": ["--theme", "--no-copy"],
58
+ "subcommands": ["landing", "dashboard", "docs", "auth"],
59
+ "example": "velinstyle create landing ./my-site --theme earth"
60
+ },
61
+ {
62
+ "name": "serve",
63
+ "summary": "Serve a directory over HTTP (default port 4173)",
64
+ "flags": ["--port"],
65
+ "example": "velinstyle serve . --port 4173"
66
+ },
67
+ {
68
+ "name": "doctor",
69
+ "summary": "Check dist assets, themes, config, icons, and Windows ESM import hints",
70
+ "flags": [],
71
+ "example": "velinstyle doctor"
72
+ },
73
+ {
74
+ "name": "check",
75
+ "summary": "Aggregate gate: doctor + blueprint --strict + scan + review (alias: validate)",
76
+ "flags": ["--json", "--sarif", "--profile"],
77
+ "example": "velinstyle check . --profile marketing"
53
78
  },
54
79
  {
55
80
  "name": "scaffold",
56
- "summary": "Generate layout HTML from natural language prompt",
81
+ "summary": "Plan-first page HTML or recipe fragment from natural language",
57
82
  "flags": ["--output", "-o", "--json"],
58
83
  "subcommands": ["list-intents"],
59
- "example": "velinstyle scaffold \"dashboard with sidebar\""
84
+ "example": "velinstyle scaffold \"Steuerberater Landingpage mit Kontakt\""
85
+ },
86
+ {
87
+ "name": "plan",
88
+ "summary": "Emit page plan JSON from a prompt (no HTML)",
89
+ "flags": ["--output", "-o", "--json"],
90
+ "example": "velinstyle plan \"SaaS landing with pricing\""
91
+ },
92
+ {
93
+ "name": "review",
94
+ "summary": "Design / a11y / SEO / performance / conversion review gate",
95
+ "flags": ["--json", "--prompt", "--profile"],
96
+ "example": "velinstyle review out.html --profile marketing"
97
+ },
98
+ {
99
+ "name": "wc",
100
+ "summary": "Inspect Web Component APIs from source",
101
+ "flags": [],
102
+ "subcommands": ["api"],
103
+ "example": "velinstyle wc api velin-toast"
60
104
  },
61
105
  {
62
106
  "name": "layout",
@@ -67,10 +111,10 @@
67
111
  },
68
112
  {
69
113
  "name": "perf",
70
- "summary": "Performance audit for images and scripts",
114
+ "summary": "Performance audit for images and scripts (directory or .html file)",
71
115
  "flags": ["--json", "--write", "--dry-run"],
72
116
  "subcommands": ["audit", "suggest", "fix"],
73
- "example": "velinstyle perf audit samples/"
117
+ "example": "velinstyle perf audit index.html"
74
118
  },
75
119
  {
76
120
  "name": "tokens",
@@ -81,17 +125,37 @@
81
125
  },
82
126
  {
83
127
  "name": "docs",
84
- "summary": "Generate developer reference Markdown",
128
+ "summary": "Generate developer reference Markdown (alias: documentation)",
85
129
  "flags": ["--scope", "--out"],
86
130
  "subcommands": ["generate"],
87
131
  "example": "velinstyle docs generate --scope all"
88
132
  },
89
133
  {
90
134
  "name": "meta",
91
- "summary": "Build Velin-Meta agent bundle (velin-agent.json, llms.txt)",
92
- "flags": ["--out", "--llms-out", "--base-url", "--no-llms"],
135
+ "summary": "Build Velin-Meta agent bundle; page --write merges curated goals/intent",
136
+ "flags": ["--out", "--llms-out", "--base-url", "--no-llms", "--write"],
93
137
  "subcommands": ["page"],
94
- "example": "velinstyle meta"
138
+ "example": "velinstyle meta page index.html --write"
139
+ },
140
+ {
141
+ "name": "search",
142
+ "summary": "Build JSON search index for VelinSearch",
143
+ "flags": ["--out", "--extra-html"],
144
+ "subcommands": ["index"],
145
+ "example": "velinstyle search index --out dist/search-index.json"
146
+ },
147
+ {
148
+ "name": "skills",
149
+ "summary": "Registry-first AI skill catalog and install runner",
150
+ "flags": ["--capability", "--status", "--priority", "--origin", "--category", "--target", "--no-deps", "--json", "--human"],
151
+ "subcommands": ["list", "show", "install", "run", "validate", "doctor", "packs", "bundles", "templates", "projects", "graphs"],
152
+ "example": "velinstyle skills show scaffold.landing --human"
153
+ },
154
+ {
155
+ "name": "workflow",
156
+ "summary": "Resolve workflow graph or project workflow steps",
157
+ "flags": ["--json", "--dry-run", "--step"],
158
+ "example": "velinstyle workflow landingpage --json"
95
159
  }
96
160
  ]
97
161
  }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Shared WCAG contrast math for token checks and HTML scan (inline styles).
3
+ */
4
+
5
+ const AA_NORMAL = 4.5;
6
+ const AA_LARGE = 3;
7
+
8
+ export function parseOklch(str) {
9
+ const m = String(str).match(/oklch\(\s*([\d.]+%?)\s+([\d.]+)\s+([\d.]+)/i);
10
+ if (!m) return null;
11
+ const L = m[1].includes('%') ? parseFloat(m[1]) / 100 : parseFloat(m[1]);
12
+ const C = parseFloat(m[2]);
13
+ const H = (parseFloat(m[3]) * Math.PI) / 180;
14
+ const a = C * Math.cos(H);
15
+ const b = C * Math.sin(H);
16
+ return oklabToXyz(L, a, b);
17
+ }
18
+
19
+ function oklabToXyz(L, a, b) {
20
+ const l_ = L + 0.3963377774 * a + 0.2158037573 * b;
21
+ const m_ = L - 0.1055613458 * a - 0.0638541728 * b;
22
+ const s_ = L - 0.0894841775 * a - 1.291485548 * b;
23
+ const l = l_ ** 3;
24
+ const m = m_ ** 3;
25
+ const s = s_ ** 3;
26
+ return {
27
+ x: 1.2268798758 * l - 0.557814996 * m + 0.2813910455 * s,
28
+ y: -0.0405801784 * l + 1.1122568696 * m - 0.0717110581 * s,
29
+ z: -0.0192546317 * l - 0.2163216959 * m + 1.5169393792 * s,
30
+ };
31
+ }
32
+
33
+ export function parseHex(str) {
34
+ const m = String(str).trim().match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
35
+ if (!m) return null;
36
+ let hex = m[1];
37
+ if (hex.length === 3) hex = hex.split('').map((c) => c + c).join('');
38
+ const r = parseInt(hex.slice(0, 2), 16) / 255;
39
+ const g = parseInt(hex.slice(2, 4), 16) / 255;
40
+ const b = parseInt(hex.slice(4, 6), 16) / 255;
41
+ const lin = (v) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);
42
+ return { x: 0, y: 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b), z: 0, _lum: 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b) };
43
+ }
44
+
45
+ export function relLuminance(xyz) {
46
+ if (xyz && typeof xyz._lum === 'number') return xyz._lum;
47
+ const { x, y, z } = xyz;
48
+ const lin = (v) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);
49
+ const r = lin(3.2406 * x - 1.5372 * y - 0.4986 * z);
50
+ const g = lin(-0.9689 * x + 1.8758 * y + 0.0415 * z);
51
+ const b = lin(0.0557 * x - 0.204 * y + 1.057 * z);
52
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
53
+ }
54
+
55
+ export function contrastRatio(l1, l2) {
56
+ const [hi, lo] = l1 > l2 ? [l1, l2] : [l2, l1];
57
+ return (hi + 0.05) / (lo + 0.05);
58
+ }
59
+
60
+ export function parseColor(str) {
61
+ if (!str) return null;
62
+ const s = String(str).trim();
63
+ if (s.startsWith('#')) return parseHex(s);
64
+ if (/^oklch\(/i.test(s)) return parseOklch(s);
65
+ const rgb = s.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i);
66
+ if (rgb) {
67
+ const r = Number(rgb[1]) / 255;
68
+ const g = Number(rgb[2]) / 255;
69
+ const b = Number(rgb[3]) / 255;
70
+ const lin = (v) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);
71
+ return { x: 0, y: 0, z: 0, _lum: 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b) };
72
+ }
73
+ return null;
74
+ }
75
+
76
+ export function styleDecl(style, prop) {
77
+ const re = new RegExp(`(?:^|;)\\s*${prop}\\s*:\\s*([^;]+)`, 'i');
78
+ const m = String(style).match(re);
79
+ return m ? m[1].trim() : null;
80
+ }
81
+
82
+ /** Returns ratio or null if colors cannot be parsed. */
83
+ export function contrastFromInlineStyle(style, { largeText = false } = {}) {
84
+ const fgRaw = styleDecl(style, 'color');
85
+ const bgRaw = styleDecl(style, 'background-color') || styleDecl(style, 'background');
86
+ if (!fgRaw || !bgRaw) return null;
87
+ // Ignore gradients / images
88
+ if (/gradient|url\(/i.test(bgRaw)) return null;
89
+ const fg = parseColor(fgRaw.split(/\s+/)[0] === 'url' ? null : fgRaw);
90
+ const bg = parseColor(bgRaw.split(/\s/)[0]);
91
+ if (!fg || !bg) return null;
92
+ const ratio = contrastRatio(relLuminance(fg), relLuminance(bg));
93
+ const min = largeText ? AA_LARGE : AA_NORMAL;
94
+ return { ratio, min, pass: ratio >= min, fg: fgRaw, bg: bgRaw };
95
+ }
96
+
97
+ export { AA_NORMAL, AA_LARGE };