@birdapi/velinstyle 1.1.0 → 1.2.1

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 (328) hide show
  1. package/README.de.md +89 -161
  2. package/README.md +187 -119
  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-attributes.js +128 -10
  27. package/cli/docgen/extract-cli.js +3 -2
  28. package/cli/docgen/extract-components.js +61 -2
  29. package/cli/docgen/extract-utilities.js +10 -10
  30. package/cli/doctor.js +119 -0
  31. package/cli/index.js +560 -44
  32. package/cli/meta.js +84 -1
  33. package/cli/perf-audit.js +15 -2
  34. package/cli/prompt-engine.js +243 -0
  35. package/cli/review.js +268 -0
  36. package/cli/scaffold.js +119 -4
  37. package/cli/scanner-rules-data.js +7 -0
  38. package/cli/scanner.js +357 -4
  39. package/cli/serve.js +81 -0
  40. package/cli/skills.js +223 -0
  41. package/cli/transparency.js +221 -0
  42. package/cli/wc-api.js +89 -0
  43. package/cli/workflow.js +42 -0
  44. package/components/index.js +2 -0
  45. package/components/runtime/component-loaders.js +2 -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 +78 -1
  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-icon.js +22 -1
  55. package/components/velin-lightbox.js +5 -3
  56. package/components/velin-modal.js +2 -4
  57. package/components/velin-search.js +1 -1
  58. package/components/velin-sheet.js +2 -4
  59. package/core/a11y/component-contracts.json +20 -3
  60. package/core/attributes/registry.js +14 -0
  61. package/core/meta/build.js +125 -5
  62. package/core/meta/design-constraints/contact.json +9 -0
  63. package/core/meta/design-constraints/faq.json +9 -0
  64. package/core/meta/design-constraints/hero.json +13 -0
  65. package/core/meta/knowledge/components.json +622 -0
  66. package/core/meta/knowledge/tokens.json +282 -0
  67. package/core/meta/pages/registry.json +294 -0
  68. package/core/meta/schema.js +13 -1
  69. package/core/meta/sections/registry.json +185 -0
  70. package/core/transparency/attach.js +74 -0
  71. package/core/transparency/claims.js +97 -0
  72. package/core/transparency/doctor.js +142 -0
  73. package/core/transparency/engine.js +75 -0
  74. package/core/transparency/export.js +98 -0
  75. package/core/transparency/index.js +30 -0
  76. package/core/transparency/migrate.js +130 -0
  77. package/core/transparency/normalize.js +125 -0
  78. package/core/transparency/policy.js +105 -0
  79. package/core/transparency/providers.js +235 -0
  80. package/core/transparency/registry.js +104 -0
  81. package/core/transparency/renderer.js +111 -0
  82. package/core/transparency/reporter.js +113 -0
  83. package/core/transparency/validator.js +112 -0
  84. package/dist/chunks/attach-H2ZSEAE6.js +365 -0
  85. package/dist/chunks/{attributes-STYCS3O5.js → attributes-A423NX5J.js} +3 -3
  86. package/dist/chunks/attributes-DZCXX2RZ.js +404 -0
  87. package/dist/chunks/{attributes-353XDOAX.js → attributes-F6UPIEVP.js} +1 -1
  88. package/dist/chunks/{attributes-ADOKLKA7.js → attributes-GLYXGGAL.js} +3 -3
  89. package/dist/chunks/{attributes-TPANLMLF.js → attributes-UFTYOSAU.js} +3 -3
  90. package/dist/chunks/attributes-XGLXLR2T.js +391 -0
  91. package/dist/chunks/attributes-YF4NI2QS.js +391 -0
  92. package/dist/chunks/browser-AUABBYUK.js +1544 -0
  93. package/dist/chunks/{chunk-RSMRR27R.js → chunk-2LSKX57P.js} +12 -10
  94. package/dist/chunks/{chunk-IEHKRARD.js → chunk-2TGCVDUL.js} +11 -9
  95. package/dist/chunks/{chunk-SRL6EWHP.js → chunk-5JWGUAPC.js} +17 -13
  96. package/dist/chunks/chunk-7YSO2OQ2.js +113 -0
  97. package/dist/chunks/{chunk-QVHYL3R4.js → chunk-BHR3ZG6U.js} +6 -6
  98. package/dist/chunks/chunk-CQMTCEI6.js +113 -0
  99. package/dist/chunks/{chunk-J472ERN2.js → chunk-JMSIHEYX.js} +15 -4
  100. package/dist/chunks/{chunk-MKZP2TBH.js → chunk-L7ZGUU4D.js} +2 -2
  101. package/dist/chunks/chunk-TUGIPKW5.js +113 -0
  102. package/dist/chunks/{highlight-GJHHV4KM.js → highlight-M2ELQNYK.js} +1 -1
  103. package/dist/chunks/runtime-entry.js +1 -1
  104. package/dist/chunks/{velin-accordion-FBIPAEXG.js → velin-accordion-WSY6BMLA.js} +64 -10
  105. package/dist/chunks/{velin-bottom-nav-7GEMPIM6.js → velin-bottom-nav-5RVRNGIP.js} +25 -0
  106. package/dist/chunks/{velin-bottom-nav-N3DFQR66.js → velin-bottom-nav-N5F4UO2I.js} +26 -1
  107. package/dist/chunks/velin-calendar-OFE6THUD.js +210 -0
  108. package/dist/chunks/velin-calendar-PGVNJTXK.js +217 -0
  109. package/dist/chunks/velin-calendar-XC7JRDSH.js +217 -0
  110. package/dist/chunks/{velin-code-block-CIAURDRJ.js → velin-code-block-ZGWG7JI5.js} +1 -1
  111. package/dist/chunks/{velin-combobox-NXS4QB4R.js → velin-combobox-56V2ZWT5.js} +1 -1
  112. package/dist/chunks/{velin-command-ONKO2A3J.js → velin-command-2HO2EKR6.js} +29 -2
  113. package/dist/chunks/{velin-command-TMLSRGIU.js → velin-command-ZJSLPK7B.js} +30 -3
  114. package/dist/chunks/{velin-copy-NYDBOKXT.js → velin-copy-XDQSV2XU.js} +1 -1
  115. package/dist/chunks/{velin-countdown-4ZVDGK4R.js → velin-countdown-V4Z5MA63.js} +1 -1
  116. package/dist/chunks/velin-data-table-UVR42UUM.js +372 -0
  117. package/dist/chunks/{velin-dialog-GTTZI564.js → velin-dialog-3YK2RPRV.js} +9 -2
  118. package/dist/chunks/{velin-dialog-ELFOZIXZ.js → velin-dialog-S24KAP4S.js} +3 -1
  119. package/dist/chunks/{velin-drawer-BE6TYN3H.js → velin-drawer-5PNU624J.js} +2 -4
  120. package/dist/chunks/{velin-drawer-DLL2GLT6.js → velin-drawer-CCM6S25D.js} +3 -5
  121. package/dist/chunks/{velin-email-RBX6ZR4S.js → velin-email-TNFONXPW.js} +1 -1
  122. package/dist/chunks/velin-file-dropzone-QRGF2JNA.js +154 -0
  123. package/dist/chunks/velin-file-dropzone-XIZMJ3NB.js +154 -0
  124. package/dist/chunks/{velin-icon-7M76DOPB.js → velin-icon-A6NCXGUK.js} +59 -17
  125. package/dist/chunks/{velin-icon-ZTSKUOVN.js → velin-icon-EC4B5XCM.js} +18 -5
  126. package/dist/chunks/{velin-lightbox-6E7CAATP.js → velin-lightbox-FFK4TUUP.js} +7 -6
  127. package/dist/chunks/{velin-lightbox-NXA3U2FM.js → velin-lightbox-P725FLTY.js} +5 -4
  128. package/dist/chunks/{velin-menubar-J66JXRWW.js → velin-menubar-6I2LM5HL.js} +1 -1
  129. package/dist/chunks/{velin-modal-5HYNNNUI.js → velin-modal-ICTMGRSU.js} +7 -8
  130. package/dist/chunks/{velin-modal-AEOTZ67O.js → velin-modal-JBNODH7D.js} +2 -4
  131. package/dist/chunks/{velin-popover-T72HK3DF.js → velin-popover-WZG2GHBL.js} +25 -4
  132. package/dist/chunks/{velin-rating-N4DI2XNL.js → velin-rating-QBBYRRBU.js} +1 -1
  133. package/dist/chunks/{velin-search-7B4KJ6TX.js → velin-search-B3L6J2RP.js} +2 -2
  134. package/dist/chunks/{velin-search-2XRQFBCS.js → velin-search-L3UG6NDQ.js} +5 -4
  135. package/dist/chunks/{velin-secure-field-6PV7RZDJ.js → velin-secure-field-DGYMP7OK.js} +1 -1
  136. package/dist/chunks/{velin-segmented-control-GYD5BIXQ.js → velin-segmented-control-P74GJPAR.js} +1 -1
  137. package/dist/chunks/{velin-sheet-R2Y67X6H.js → velin-sheet-M5GZZD7G.js} +2 -4
  138. package/dist/chunks/{velin-sheet-OUK6572T.js → velin-sheet-X7RXIWKV.js} +3 -5
  139. package/dist/chunks/{velin-stepper-X54WGHDG.js → velin-stepper-4YQJUHPC.js} +12 -5
  140. package/dist/chunks/{velin-toast-OMMOA2DK.js → velin-toast-UG5LWTG2.js} +5 -1
  141. package/dist/chunks/{velin-tooltip-BDHGRTQB.js → velin-tooltip-ZDH5SDLU.js} +1 -1
  142. package/dist/llms.txt +31 -8
  143. package/dist/search-index.json +182 -10
  144. package/dist/velin-agent.json +3980 -31
  145. package/dist/velinstyle-components.iife.js +1622 -286
  146. package/dist/velinstyle-components.js +1624 -286
  147. package/dist/velinstyle-components.min.js +262 -114
  148. package/dist/velinstyle.css +412 -67
  149. package/dist/velinstyle.d.ts +2 -0
  150. package/dist/velinstyle.min.css +1 -1
  151. package/package.json +21 -6
  152. package/packages/skill-engine/README.md +24 -0
  153. package/packages/skill-engine/package.json +7 -0
  154. package/packages/skill-engine/src/catalog.js +29 -0
  155. package/packages/skill-engine/src/index.js +5 -0
  156. package/packages/skill-engine/src/install.js +69 -0
  157. package/packages/skill-engine/src/registry.js +27 -0
  158. package/packages/skill-engine/src/resolve.js +68 -0
  159. package/packages/skill-engine/src/validate.js +40 -0
  160. package/packages/velinstyle-skills/README.md +6 -0
  161. package/packages/velinstyle-skills/adapter.json +8 -0
  162. package/packages/velinstyle-skills/bundles/landing-starter.bundle.yaml +12 -0
  163. package/packages/velinstyle-skills/bundles/review-suite.bundle.yaml +11 -0
  164. package/packages/velinstyle-skills/catalog.json +1004 -0
  165. package/packages/velinstyle-skills/graphs/component-ship.graph.yaml +14 -0
  166. package/packages/velinstyle-skills/graphs/landingpage.graph.yaml +21 -0
  167. package/packages/velinstyle-skills/graphs/release-gate.graph.yaml +15 -0
  168. package/packages/velinstyle-skills/index.js +22 -0
  169. package/packages/velinstyle-skills/package.json +7 -0
  170. package/packages/velinstyle-skills/packs/accessibility.pack.yaml +9 -0
  171. package/packages/velinstyle-skills/packs/design.pack.yaml +10 -0
  172. package/packages/velinstyle-skills/packs/documentation.pack.yaml +8 -0
  173. package/packages/velinstyle-skills/packs/enterprise.pack.yaml +10 -0
  174. package/packages/velinstyle-skills/packs/frontend.pack.yaml +10 -0
  175. package/packages/velinstyle-skills/packs/review.pack.yaml +9 -0
  176. package/packages/velinstyle-skills/projects/admin-panel.project.yaml +12 -0
  177. package/packages/velinstyle-skills/projects/blog.project.yaml +11 -0
  178. package/packages/velinstyle-skills/projects/documentation-portal.project.yaml +13 -0
  179. package/packages/velinstyle-skills/projects/ecommerce-shop.project.yaml +12 -0
  180. package/packages/velinstyle-skills/projects/landing-page.project.yaml +12 -0
  181. package/packages/velinstyle-skills/projects/laravel-dashboard.project.yaml +12 -0
  182. package/packages/velinstyle-skills/projects/marketing-website.project.yaml +14 -0
  183. package/packages/velinstyle-skills/projects/portfolio.project.yaml +12 -0
  184. package/packages/velinstyle-skills/registry.json +142 -0
  185. package/packages/velinstyle-skills/scripts/generate-assets.mjs +163 -0
  186. package/packages/velinstyle-skills/skills/velin-a11y-focus-keyboard/SKILL.md +57 -0
  187. package/packages/velinstyle-skills/skills/velin-a11y-page-checklist/SKILL.md +57 -0
  188. package/packages/velinstyle-skills/skills/velin-a11y-scan-fix/SKILL.md +57 -0
  189. package/packages/velinstyle-skills/skills/velin-ai-agent-briefing/SKILL.md +57 -0
  190. package/packages/velinstyle-skills/skills/velin-ai-plan-scaffold-review/SKILL.md +57 -0
  191. package/packages/velinstyle-skills/skills/velin-ai-skill-authoring/SKILL.md +57 -0
  192. package/packages/velinstyle-skills/skills/velin-components-accessibility-map/SKILL.md +57 -0
  193. package/packages/velinstyle-skills/skills/velin-components-api-contract/SKILL.md +57 -0
  194. package/packages/velinstyle-skills/skills/velin-components-recipe/SKILL.md +57 -0
  195. package/packages/velinstyle-skills/skills/velin-components-select-compose/SKILL.md +57 -0
  196. package/packages/velinstyle-skills/skills/velin-design-hero-compose/SKILL.md +57 -0
  197. package/packages/velinstyle-skills/skills/velin-design-section-rhythm/SKILL.md +57 -0
  198. package/packages/velinstyle-skills/skills/velin-design-surface-roles/SKILL.md +57 -0
  199. package/packages/velinstyle-skills/skills/velin-dev-component-wire/SKILL.md +57 -0
  200. package/packages/velinstyle-skills/skills/velin-dev-page-scaffold/SKILL.md +57 -0
  201. package/packages/velinstyle-skills/skills/velin-dev-plan-first/SKILL.md +57 -0
  202. package/packages/velinstyle-skills/skills/velin-docs-component-guide/SKILL.md +57 -0
  203. package/packages/velinstyle-skills/skills/velin-docs-generate-api/SKILL.md +57 -0
  204. package/packages/velinstyle-skills/skills/velin-dx-doctor-setup/SKILL.md +57 -0
  205. package/packages/velinstyle-skills/skills/velin-dx-project-init/SKILL.md +57 -0
  206. package/packages/velinstyle-skills/skills/velin-migration-legacy-wc/SKILL.md +57 -0
  207. package/packages/velinstyle-skills/skills/velin-migration-prefix-classes/SKILL.md +57 -0
  208. package/packages/velinstyle-skills/skills/velin-motion-reduced-safe/SKILL.md +57 -0
  209. package/packages/velinstyle-skills/skills/velin-motion-reveal-feedback/SKILL.md +57 -0
  210. package/packages/velinstyle-skills/skills/velin-perf-audit-fix/SKILL.md +57 -0
  211. package/packages/velinstyle-skills/skills/velin-perf-runtime-tree-shake/SKILL.md +57 -0
  212. package/packages/velinstyle-skills/skills/velin-release-changelog-sync/SKILL.md +57 -0
  213. package/packages/velinstyle-skills/skills/velin-release-meta-rebuild/SKILL.md +57 -0
  214. package/packages/velinstyle-skills/skills/velin-review-conversion-hero/SKILL.md +57 -0
  215. package/packages/velinstyle-skills/skills/velin-review-page-gate/SKILL.md +57 -0
  216. package/packages/velinstyle-skills/skills/velin-review-seo-meta/SKILL.md +57 -0
  217. package/packages/velinstyle-skills/skills/velin-security-sanitize-html/SKILL.md +57 -0
  218. package/packages/velinstyle-skills/skills/velin-security-scan-pii/SKILL.md +57 -0
  219. package/packages/velinstyle-skills/skills/velin-testing-a11y-suite/SKILL.md +57 -0
  220. package/packages/velinstyle-skills/skills/velin-testing-visual-smoke/SKILL.md +57 -0
  221. package/packages/velinstyle-skills/skills/velin-themes-apply-token/SKILL.md +57 -0
  222. package/packages/velinstyle-skills/skills/velin-themes-contrast-check/SKILL.md +57 -0
  223. package/packages/velinstyle-skills/skills/velin-utilities-layout-apply/SKILL.md +57 -0
  224. package/packages/velinstyle-skills/skills/velin-utilities-prefix-fix/SKILL.md +57 -0
  225. package/packages/velinstyle-skills/skills/velin-utilities-token-map/SKILL.md +57 -0
  226. package/packages/velinstyle-skills/templates/admin-panel.template.yaml +12 -0
  227. package/packages/velinstyle-skills/templates/blog.template.yaml +12 -0
  228. package/packages/velinstyle-skills/templates/documentation-portal.template.yaml +12 -0
  229. package/packages/velinstyle-skills/templates/ecommerce-shop.template.yaml +13 -0
  230. package/packages/velinstyle-skills/templates/landing-page.template.yaml +12 -0
  231. package/packages/velinstyle-skills/templates/laravel-dashboard.template.yaml +11 -0
  232. package/packages/velinstyle-skills/templates/marketing-website.template.yaml +13 -0
  233. package/packages/velinstyle-skills/templates/portfolio.template.yaml +12 -0
  234. package/schemas/component-knowledge.schema.json +33 -0
  235. package/schemas/design-constraint.schema.json +15 -0
  236. package/schemas/design-intelligence.schema.json +19 -0
  237. package/schemas/design-rule.schema.json +19 -0
  238. package/schemas/page-template.schema.json +24 -0
  239. package/schemas/review-report.schema.json +36 -0
  240. package/schemas/section.schema.json +22 -0
  241. package/schemas/skill-bundle.schema.json +15 -0
  242. package/schemas/skill-graph.schema.json +25 -0
  243. package/schemas/skill-pack.schema.json +14 -0
  244. package/schemas/skill-project.schema.json +16 -0
  245. package/schemas/skill-record.schema.json +27 -0
  246. package/schemas/skill-registry.schema.json +17 -0
  247. package/schemas/skill-template.schema.json +17 -0
  248. package/schemas/token-graph.schema.json +27 -0
  249. package/schemas/utility.schema.json +166 -0
  250. package/src/components/alert.css +22 -1
  251. package/src/components/calendar-dropzone.css +5 -0
  252. package/src/components/transparency.css +138 -0
  253. package/src/layout/app-shell.css +33 -0
  254. package/src/tokens/shadow.css +13 -0
  255. package/src/utilities/border.css +2 -0
  256. package/src/utilities/display.css +1 -24
  257. package/src/utilities/responsive.css +16 -1
  258. package/src/utilities/spacing.css +32 -0
  259. package/src/velinstyle.css +3 -0
  260. package/dist/chunks/attributes-3BZLI7XF.js +0 -364
  261. package/dist/chunks/attributes-4N5JP4CG.js +0 -364
  262. package/dist/chunks/attributes-5Q2WXGRC.js +0 -374
  263. package/dist/chunks/attributes-AIR7SVLK.js +0 -364
  264. package/dist/chunks/attributes-BGRN5XZO.js +0 -364
  265. package/dist/chunks/attributes-BVSQAYLR.js +0 -364
  266. package/dist/chunks/attributes-CDYFUY7Y.js +0 -364
  267. package/dist/chunks/attributes-JMYJZBPE.js +0 -364
  268. package/dist/chunks/attributes-R5JY3X4O.js +0 -374
  269. package/dist/chunks/attributes-TNSPQTHX.js +0 -374
  270. package/dist/chunks/chunk-2354NEBP.js +0 -109
  271. package/dist/chunks/chunk-2VNA7G7S.js +0 -109
  272. package/dist/chunks/chunk-AQLRJSGG.js +0 -109
  273. package/dist/chunks/chunk-EWPSDMQT.js +0 -109
  274. package/dist/chunks/chunk-LA7264K4.js +0 -85
  275. package/dist/chunks/chunk-QTJJ3DPO.js +0 -109
  276. package/dist/chunks/chunk-RZQVWFHW.js +0 -109
  277. package/dist/chunks/chunk-U4XHMZ7D.js +0 -109
  278. package/dist/chunks/chunk-V5YIUA6G.js +0 -109
  279. package/dist/chunks/chunk-XIET2VSZ.js +0 -109
  280. package/dist/chunks/chunk-XYLJ2GCB.js +0 -205
  281. package/dist/chunks/chunk-ZPSPKUYD.js +0 -109
  282. package/dist/chunks/highlight-XTHRKBA3.js +0 -37
  283. package/dist/chunks/velin-bottom-nav-2N2TYWOF.js +0 -86
  284. package/dist/chunks/velin-carousel-Y5VCOABZ.js +0 -213
  285. package/dist/chunks/velin-code-block-ASUBTAQV.js +0 -119
  286. package/dist/chunks/velin-code-block-TSUKPY4C.js +0 -123
  287. package/dist/chunks/velin-code-block-Y6CM726Q.js +0 -119
  288. package/dist/chunks/velin-combobox-2KDTCQ7N.js +0 -155
  289. package/dist/chunks/velin-command-M7RNHUPR.js +0 -136
  290. package/dist/chunks/velin-copy-T5KDTDXP.js +0 -81
  291. package/dist/chunks/velin-countdown-5XSTN3BH.js +0 -101
  292. package/dist/chunks/velin-counter-ISCTEAHI.js +0 -118
  293. package/dist/chunks/velin-dialog-D2GUHSCD.js +0 -144
  294. package/dist/chunks/velin-dialog-IJLFDXAJ.js +0 -144
  295. package/dist/chunks/velin-dialog-TNS3WXMB.js +0 -144
  296. package/dist/chunks/velin-drawer-MJS6WCF7.js +0 -130
  297. package/dist/chunks/velin-email-N5B5ZYTE.js +0 -90
  298. package/dist/chunks/velin-icon-KZO3IEHG.js +0 -164
  299. package/dist/chunks/velin-lightbox-I75U6JF4.js +0 -140
  300. package/dist/chunks/velin-lightbox-QOTB4PRL.js +0 -140
  301. package/dist/chunks/velin-lightbox-UCD6N7HF.js +0 -140
  302. package/dist/chunks/velin-live-dot-XHUZCIDZ.js +0 -67
  303. package/dist/chunks/velin-menubar-SFEXJE56.js +0 -86
  304. package/dist/chunks/velin-modal-2HOBXE6F.js +0 -176
  305. package/dist/chunks/velin-modal-GLI2XZZB.js +0 -176
  306. package/dist/chunks/velin-popover-EXINRIGJ.js +0 -145
  307. package/dist/chunks/velin-popover-OXX7MRZ6.js +0 -145
  308. package/dist/chunks/velin-popover-YKCCROJG.js +0 -145
  309. package/dist/chunks/velin-rating-XRQJV4LO.js +0 -91
  310. package/dist/chunks/velin-scroll-top-F2FCZNYD.js +0 -58
  311. package/dist/chunks/velin-search-4YHJWYSS.js +0 -556
  312. package/dist/chunks/velin-search-LWHY23Q5.js +0 -474
  313. package/dist/chunks/velin-secure-field-H7FSBUJW.js +0 -95
  314. package/dist/chunks/velin-segmented-control-PQX6LKOJ.js +0 -109
  315. package/dist/chunks/velin-sheet-3OGI4HD7.js +0 -119
  316. package/dist/chunks/velin-sparkline-GVEANJVW.js +0 -184
  317. package/dist/chunks/velin-sparkline-KDA3GQAN.js +0 -162
  318. package/dist/chunks/velin-stepper-2ZIHLKGM.js +0 -141
  319. package/dist/chunks/velin-stepper-FYEUEWE6.js +0 -141
  320. package/dist/chunks/velin-stepper-wc-QU3KRVQR.js +0 -133
  321. package/dist/chunks/velin-theme-toggle-BNNS7WLV.js +0 -285
  322. package/dist/chunks/velin-theme-toggle-NO7V4TWI.js +0 -285
  323. package/dist/chunks/velin-theme-toggle-QELCJM2Q.js +0 -291
  324. package/dist/chunks/velin-toast-RCZ4CSUC.js +0 -109
  325. package/dist/chunks/velin-toast-WEUBTJG6.js +0 -109
  326. package/dist/chunks/velin-tooltip-664IOHZA.js +0 -112
  327. package/dist/chunks/velin-tooltip-wc-LXDVT6DE.js +0 -103
  328. 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.1.0",
2
+ "version": "1.2.1",
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 };