@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
@@ -0,0 +1,162 @@
1
+ import { escapeHTML } from './sanitize.js';
2
+
3
+ const styles = `
4
+ :host { display: block; }
5
+ .zone {
6
+ border: 2px dashed var(--velin-color-border, #cbd5e1);
7
+ border-radius: var(--velin-radius-md, 0.5rem);
8
+ padding: var(--velin-space-6, 1.5rem);
9
+ background: var(--velin-color-surface-dim, var(--velin-color-bg-subtle, #f8fafc));
10
+ color: var(--velin-color-text, #111);
11
+ text-align: center;
12
+ transition: border-color 150ms ease, background 150ms ease;
13
+ }
14
+ :host([dragging]) .zone {
15
+ border-color: var(--velin-color-primary, #2563eb);
16
+ background: var(--velin-color-primary-subtle, #eff6ff);
17
+ }
18
+ .hint { margin: 0 0 var(--velin-space-3, 0.75rem); color: var(--velin-color-text-muted, #64748b); }
19
+ .browse {
20
+ display: inline-flex; align-items: center; justify-content: center;
21
+ min-block-size: 2.75rem; padding-inline: var(--velin-space-4, 1rem);
22
+ border-radius: var(--velin-radius-md, 0.5rem);
23
+ border: none; cursor: pointer;
24
+ background: var(--velin-color-primary, #2563eb);
25
+ color: var(--velin-color-on-primary, #fff);
26
+ font: inherit;
27
+ }
28
+ .browse:focus-visible { outline: 2px solid var(--velin-color-focus, #2563eb); outline-offset: 2px; }
29
+ input[type="file"] {
30
+ position: absolute; inline-size: 1px; block-size: 1px; padding: 0; margin: -1px;
31
+ overflow: hidden; clip: rect(0,0,0,0); border: 0;
32
+ }
33
+ .list { list-style: none; padding: 0; margin: var(--velin-space-4, 1rem) 0 0; text-align: start; }
34
+ .list li {
35
+ display: flex; justify-content: space-between; gap: var(--velin-space-3, 0.75rem);
36
+ padding: var(--velin-space-2, 0.5rem) 0;
37
+ border-block-end: 1px solid var(--velin-color-border, #e2e8f0);
38
+ font-size: var(--velin-text-sm, 0.875rem);
39
+ }
40
+ .progress {
41
+ margin-block-start: var(--velin-space-3, 0.75rem);
42
+ block-size: 0.5rem; border-radius: 999px;
43
+ background: var(--velin-color-border, #e2e8f0); overflow: hidden;
44
+ }
45
+ .bar {
46
+ block-size: 100%; inline-size: 0%;
47
+ background: var(--velin-color-primary, #2563eb);
48
+ transition: inline-size 150ms ease;
49
+ }
50
+ .status { margin: var(--velin-space-2, 0.5rem) 0 0; font-size: var(--velin-text-sm, 0.875rem); }
51
+ .status[data-tone="error"] { color: var(--velin-color-danger, #b91c1c); }
52
+ `;
53
+
54
+ class VelinFileDropzone extends HTMLElement {
55
+ static get observedAttributes() {
56
+ return ['accept', 'multiple', 'label', 'progress'];
57
+ }
58
+
59
+ constructor() {
60
+ super();
61
+ this.attachShadow({ mode: 'open' });
62
+ this._files = [];
63
+ }
64
+
65
+ connectedCallback() {
66
+ this._render();
67
+ }
68
+
69
+ attributeChangedCallback() {
70
+ if (this.shadowRoot?.querySelector('.zone')) this._render();
71
+ }
72
+
73
+ get files() {
74
+ return this._files.slice();
75
+ }
76
+
77
+ _emitFiles(fileList) {
78
+ const accept = this.getAttribute('accept');
79
+ const files = [...fileList];
80
+ if (accept) {
81
+ const parts = accept.split(',').map((s) => s.trim().toLowerCase());
82
+ const bad = files.find((f) => {
83
+ const name = f.name.toLowerCase();
84
+ const type = (f.type || '').toLowerCase();
85
+ return !parts.some((p) => (p.startsWith('.') ? name.endsWith(p) : type === p || type.startsWith(p.replace('/*', '/'))));
86
+ });
87
+ if (bad) {
88
+ this._setStatus(`File type not allowed: ${bad.name}`, 'error');
89
+ this.dispatchEvent(new CustomEvent('velin-error', { bubbles: true, detail: { message: 'accept', file: bad } }));
90
+ return;
91
+ }
92
+ }
93
+ this._files = files;
94
+ this._setStatus(files.length ? `${files.length} file(s) ready` : '', 'ok');
95
+ this.dispatchEvent(new CustomEvent('velin-files', { bubbles: true, detail: { files } }));
96
+ this._renderList();
97
+ }
98
+
99
+ _setStatus(text, tone = 'ok') {
100
+ const el = this.shadowRoot?.querySelector('.status');
101
+ if (!el) return;
102
+ el.textContent = text;
103
+ el.dataset.tone = tone;
104
+ }
105
+
106
+ _renderList() {
107
+ const ul = this.shadowRoot?.querySelector('.list');
108
+ if (!ul) return;
109
+ ul.innerHTML = this._files.map((f) => `<li><span>${escapeHTML(f.name)}</span><span>${Math.round(f.size / 1024)} KB</span></li>`).join('');
110
+ }
111
+
112
+ _render() {
113
+ const label = escapeHTML(this.getAttribute('label') || 'Upload files');
114
+ const accept = this.getAttribute('accept') || '';
115
+ const multiple = this.hasAttribute('multiple');
116
+ const progress = Math.max(0, Math.min(100, Number(this.getAttribute('progress') || 0)));
117
+
118
+ this.shadowRoot.innerHTML = `
119
+ <style>${styles}</style>
120
+ <div class="zone" role="group" aria-label="${label}">
121
+ <p class="hint">Drag and drop files here, or browse. Client-side only — wire <code>velin-files</code> to your upload API.</p>
122
+ <button type="button" class="browse">Browse files</button>
123
+ <input type="file" ${accept ? `accept="${escapeHTML(accept)}"` : ''} ${multiple ? 'multiple' : ''} />
124
+ <div class="progress" hidden="${progress <= 0 ? 'true' : 'false'}" aria-hidden="${progress <= 0 ? 'true' : 'false'}">
125
+ <div class="bar" style="inline-size:${progress}%"></div>
126
+ </div>
127
+ <p class="status" role="status" aria-live="polite"></p>
128
+ <ul class="list"></ul>
129
+ </div>
130
+ `;
131
+
132
+ const input = this.shadowRoot.querySelector('input');
133
+ const browse = this.shadowRoot.querySelector('.browse');
134
+ const zone = this.shadowRoot.querySelector('.zone');
135
+ browse.addEventListener('click', () => input.click());
136
+ input.addEventListener('change', () => {
137
+ if (input.files?.length) this._emitFiles(input.files);
138
+ });
139
+
140
+ ['dragenter', 'dragover'].forEach((ev) => {
141
+ zone.addEventListener(ev, (e) => {
142
+ e.preventDefault();
143
+ this.setAttribute('dragging', '');
144
+ });
145
+ });
146
+ ['dragleave', 'drop'].forEach((ev) => {
147
+ zone.addEventListener(ev, (e) => {
148
+ e.preventDefault();
149
+ this.removeAttribute('dragging');
150
+ });
151
+ });
152
+ zone.addEventListener('drop', (e) => {
153
+ const list = e.dataTransfer?.files;
154
+ if (list?.length) this._emitFiles(list);
155
+ });
156
+
157
+ this._renderList();
158
+ }
159
+ }
160
+
161
+ customElements.define('velin-file-dropzone', VelinFileDropzone);
162
+ export default VelinFileDropzone;
@@ -32,8 +32,28 @@ function resolveProviderUrl(provider, variant) {
32
32
  }
33
33
 
34
34
  const _svgCache = new Map();
35
+ const DEFAULT_SPRITE = 'velin-icons.svg';
36
+
37
+ /**
38
+ * Resolve default sprite URL: attribute → meta/html data → VelinIcon.defaultSprite → relative fallback.
39
+ * Avoids hardcoded absolute `/dist/...` which breaks offline/vendor installs.
40
+ */
41
+ function resolveDefaultSpriteUrl() {
42
+ if (typeof document !== 'undefined') {
43
+ const meta = document.querySelector('meta[name="velin-icon-sprite"]');
44
+ const fromMeta = meta?.getAttribute('content')?.trim();
45
+ if (fromMeta) return fromMeta;
46
+ const fromHtml = document.documentElement?.getAttribute('data-velin-icon-sprite')?.trim();
47
+ if (fromHtml) return fromHtml;
48
+ }
49
+ const configured = typeof VelinIcon.defaultSprite === 'string' ? VelinIcon.defaultSprite.trim() : '';
50
+ return configured || DEFAULT_SPRITE;
51
+ }
35
52
 
36
53
  class VelinIcon extends HTMLElement {
54
+ /** @type {string} Relative or absolute sprite URL used when `sprite` attribute is omitted. */
55
+ static defaultSprite = DEFAULT_SPRITE;
56
+
37
57
  static get observedAttributes() {
38
58
  return ['name', 'size', 'label', 'provider', 'variant', 'sprite'];
39
59
  }
@@ -99,7 +119,8 @@ class VelinIcon extends HTMLElement {
99
119
  if (spriteAttr === '' || (spriteAttr == null && isLocalSymbol)) {
100
120
  href = `#${name}`;
101
121
  } else {
102
- const spriteUrl = sanitizeURL(spriteAttr || '/dist/velin-icons.svg') || '/dist/velin-icons.svg';
122
+ const fallback = resolveDefaultSpriteUrl();
123
+ const spriteUrl = sanitizeURL(spriteAttr || fallback) || fallback || DEFAULT_SPRITE;
103
124
  href = `${spriteUrl}#${name}`;
104
125
  }
105
126
  use.setAttribute('href', href);
@@ -92,7 +92,6 @@ class VelinLightbox extends HTMLElement {
92
92
  this.setAttribute('open', '');
93
93
  setBackgroundInert(this);
94
94
  this._render();
95
- document.body.style.overflow = 'hidden';
96
95
  const overlay = this.shadowRoot.querySelector('.overlay');
97
96
  overlay.removeEventListener('keydown', this._onTrapKey);
98
97
  overlay.addEventListener('keydown', this._onTrapKey);
@@ -101,8 +100,7 @@ class VelinLightbox extends HTMLElement {
101
100
 
102
101
  close() {
103
102
  this.removeAttribute('open');
104
- clearBackgroundInert();
105
- document.body.style.overflow = '';
103
+ clearBackgroundInert(this);
106
104
  if (this._previousFocus) {
107
105
  this._previousFocus.focus();
108
106
  this._previousFocus = null;
@@ -110,6 +108,10 @@ class VelinLightbox extends HTMLElement {
110
108
  this.dispatchEvent(new CustomEvent('velin-close', { bubbles: true }));
111
109
  }
112
110
 
111
+ disconnectedCallback() {
112
+ clearBackgroundInert(this);
113
+ }
114
+
113
115
  _prev() { this._index = (this._index - 1 + this._items.length) % this._items.length; this._render(); }
114
116
  _next() { this._index = (this._index + 1) % this._items.length; this._render(); }
115
117
 
@@ -146,7 +146,6 @@ class VelinModal extends HTMLElement {
146
146
  this._previouslyFocused = saveFocus();
147
147
  setBackgroundInert(this);
148
148
  document.addEventListener('keydown', this._onKeydown);
149
- document.body.style.overflow = 'hidden';
150
149
 
151
150
  requestAnimationFrame(() => {
152
151
  const focusable = getFocusableElements(this.shadowRoot);
@@ -156,8 +155,7 @@ class VelinModal extends HTMLElement {
156
155
 
157
156
  _close() {
158
157
  document.removeEventListener('keydown', this._onKeydown);
159
- document.body.style.overflow = '';
160
- clearBackgroundInert();
158
+ clearBackgroundInert(this);
161
159
  restoreFocus(this._previouslyFocused);
162
160
  }
163
161
 
@@ -171,7 +169,7 @@ class VelinModal extends HTMLElement {
171
169
 
172
170
  disconnectedCallback() {
173
171
  document.removeEventListener('keydown', this._onKeydown);
174
- document.body.style.overflow = '';
172
+ clearBackgroundInert(this);
175
173
  }
176
174
  }
177
175
 
@@ -129,7 +129,7 @@ class VelinSearch extends HTMLElement {
129
129
  return;
130
130
  }
131
131
  if (!this._indexLoaded) await this._loadIndex();
132
- const { groups } = this._search.query(q, {
132
+ const { groups } = await this._search.query(q, {
133
133
  minChars: this.minChars,
134
134
  fuzzy: this.fuzzy,
135
135
  categories: this.categories || undefined,
@@ -78,7 +78,6 @@ class VelinSheet extends HTMLElement {
78
78
  this._prev = saveFocus();
79
79
  setBackgroundInert(this);
80
80
  document.addEventListener('keydown', this._onKey);
81
- document.body.style.overflow = 'hidden';
82
81
  requestAnimationFrame(() => {
83
82
  const f = getFocusableElements(this.shadowRoot);
84
83
  if (f.length) f[0].focus();
@@ -87,8 +86,7 @@ class VelinSheet extends HTMLElement {
87
86
 
88
87
  _close() {
89
88
  document.removeEventListener('keydown', this._onKey);
90
- document.body.style.overflow = '';
91
- clearBackgroundInert();
89
+ clearBackgroundInert(this);
92
90
  restoreFocus(this._prev);
93
91
  }
94
92
 
@@ -99,7 +97,7 @@ class VelinSheet extends HTMLElement {
99
97
 
100
98
  disconnectedCallback() {
101
99
  document.removeEventListener('keydown', this._onKey);
102
- document.body.style.overflow = '';
100
+ clearBackgroundInert(this);
103
101
  }
104
102
  }
105
103
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "wcagLevel": "AAA",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "components": {
5
5
  "velin-accordion": {
6
6
  "status": "pass",
@@ -77,11 +77,28 @@
77
77
  "velin-data-table": {
78
78
  "status": "pass",
79
79
  "roles": ["button"],
80
- "keyboard": "Native buttons for column sort and pagination",
80
+ "keyboard": "Sort buttons; editable cells: Enter/F2 edit, Escape cancel; pagination",
81
81
  "liveRegion": "polite",
82
82
  "reducedMotion": true,
83
83
  "requiredAttributes": [],
84
- "notes": "Enhances a light-DOM table. Sort state exposed via aria-sort; sort triggers are real buttons. Needs a caption, aria-label, or label attribute (warns otherwise). Filtered and off-page rows use hidden so they leave the a11y tree; sort, filter and page changes are announced."
84
+ "notes": "Enhances a light-DOM table. Optional editable attribute or data-editable cells for inline edit (velin-data-table-edit). No virtualization in v1."
85
+ },
86
+ "velin-calendar": {
87
+ "status": "pass",
88
+ "roles": ["group", "grid", "button"],
89
+ "keyboard": "Arrows, Home/End, PageUp/Down, Enter/Space",
90
+ "reducedMotion": true,
91
+ "requiredAttributes": [],
92
+ "notes": "Month calendar. value ISO date; velin-change event. Optional min/max."
93
+ },
94
+ "velin-file-dropzone": {
95
+ "status": "pass",
96
+ "roles": ["group"],
97
+ "keyboard": "Browse button + native file input",
98
+ "liveRegion": "polite",
99
+ "reducedMotion": true,
100
+ "requiredAttributes": [],
101
+ "notes": "Client-side dropzone. Events velin-files / velin-error. Does not upload to a server."
85
102
  },
86
103
  "velin-dialog": {
87
104
  "status": "pass",
@@ -226,6 +226,20 @@ function registerBuiltins() {
226
226
  },
227
227
  });
228
228
 
229
+ registerAttribute('velin-transparency', {
230
+ async enhance(el) {
231
+ const { attach } = await import('../transparency/attach.js');
232
+ attach(el);
233
+ },
234
+ });
235
+ registerAttribute('velin-disclosure', {
236
+ async enhance(el) {
237
+ const { attach } = await import('../transparency/attach.js');
238
+ if (!el.hasAttribute('velin-transparency')) el.setAttribute('velin-transparency', '');
239
+ attach(el);
240
+ },
241
+ });
242
+
229
243
  for (const motion of ['velin-reveal', 'velin-fade', 'velin-slide', 'velin-scale', 'velin-parallax', 'velin-hover', 'velin-stagger', 'velin-scroll']) {
230
244
  registerAttribute(motion, { enhance() {} });
231
245
  }
@@ -164,6 +164,35 @@ export async function buildAgentBundle(options) {
164
164
  }
165
165
  }
166
166
 
167
+ const readJsonSafe = (rel) => {
168
+ const p = join(pkgRoot, rel);
169
+ if (!existsSync(p)) return null;
170
+ try {
171
+ return JSON.parse(readFileSync(p, 'utf-8'));
172
+ } catch {
173
+ return null;
174
+ }
175
+ };
176
+
177
+ const knowledgeComponents = readJsonSafe('core/meta/knowledge/components.json');
178
+ const knowledgeTokens = readJsonSafe('core/meta/knowledge/tokens.json');
179
+ const pageRegistry = readJsonSafe('core/meta/pages/registry.json');
180
+ const sectionRegistry = readJsonSafe('core/meta/sections/registry.json');
181
+ const skillsRegistry = readJsonSafe('packages/velinstyle-skills/registry.json');
182
+ const skillsCatalog = readJsonSafe('packages/velinstyle-skills/catalog.json');
183
+
184
+ const constraintDir = join(pkgRoot, 'core', 'meta', 'design-constraints');
185
+ const designConstraints = [];
186
+ if (existsSync(constraintDir)) {
187
+ for (const file of readdirSync(constraintDir).filter((f) => f.endsWith('.json'))) {
188
+ try {
189
+ designConstraints.push(JSON.parse(readFileSync(join(constraintDir, file), 'utf-8')));
190
+ } catch {
191
+ /* skip bad files */
192
+ }
193
+ }
194
+ }
195
+
167
196
  const bundle = {
168
197
  schemaVersion: VELIN_AGENT_SCHEMA_VERSION,
169
198
  mime: VELIN_META_MIME,
@@ -174,7 +203,8 @@ export async function buildAgentBundle(options) {
174
203
  homepage: pkg.homepage,
175
204
  repository: pkg.repository,
176
205
  tagline:
177
- 'VelinStyle is the WCAG 2.2 AAA CSS framework with native JavaScript runtime and Web Components.',
206
+ 'VelinStyle is a CSS framework with WCAG 2.2 AAA-oriented defaults, native JavaScript runtime, and Web Components.',
207
+ pipeline: 'Core Foundation → Design System → Knowledge Graph → Prompt Engine → Review Engine → AI Metadata',
178
208
  },
179
209
  packageExports: pkg.exports,
180
210
  release: {
@@ -185,6 +215,7 @@ export async function buildAgentBundle(options) {
185
215
  migration: [
186
216
  'Replace velin-tooltip-wc / velin-stepper-wc with velin-tooltip / velin-stepper.',
187
217
  'Point AI tools at velin-agent.json or docs/llms.txt for framework context.',
218
+ 'Prefer velinstyle scaffold / plan for page generation (plan → render → review).',
188
219
  ],
189
220
  },
190
221
  components: {
@@ -195,10 +226,73 @@ export async function buildAgentBundle(options) {
195
226
  legacyAliases,
196
227
  helpers,
197
228
  },
229
+ knowledgeGraph: {
230
+ components: knowledgeComponents?.components || [],
231
+ componentCount: knowledgeComponents?.components?.length || 0,
232
+ tokens: knowledgeTokens,
233
+ pages: pageRegistry?.pages || [],
234
+ pageCount: pageRegistry?.pages?.length || 0,
235
+ sections: sectionRegistry?.sections || [],
236
+ sectionCount: sectionRegistry?.sections?.length || 0,
237
+ designConstraints,
238
+ schemas: [
239
+ 'schemas/component-knowledge.schema.json',
240
+ 'schemas/design-intelligence.schema.json',
241
+ 'schemas/design-constraint.schema.json',
242
+ 'schemas/page-template.schema.json',
243
+ 'schemas/section.schema.json',
244
+ 'schemas/review-report.schema.json',
245
+ 'schemas/token-graph.schema.json',
246
+ 'schemas/design-rule.schema.json',
247
+ 'schemas/skill-record.schema.json',
248
+ 'schemas/skill-registry.schema.json',
249
+ 'schemas/skill-pack.schema.json',
250
+ 'schemas/skill-graph.schema.json',
251
+ 'schemas/skill-bundle.schema.json',
252
+ 'schemas/skill-template.schema.json',
253
+ 'schemas/skill-project.schema.json',
254
+ ],
255
+ },
256
+ skills: {
257
+ count: skillsCatalog?.totals?.skills || skillsRegistry?.skills?.length || 0,
258
+ categories: [...new Set((skillsRegistry?.skills || []).map((item) => item.category))].sort(),
259
+ capabilities: [...new Set((skillsRegistry?.skills || []).flatMap((item) => item.capabilities || []))].sort(),
260
+ items: (skillsRegistry?.skills || []).map((item) => ({
261
+ id: item.id,
262
+ category: item.category,
263
+ priority: item.priority,
264
+ status: item.status,
265
+ confidence: item.confidence,
266
+ capabilities: item.capabilities || [],
267
+ })),
268
+ },
269
+ skillPacks: skillsRegistry?.packs || [],
270
+ workflowGraphs: (skillsRegistry?.workflowGraphs || []).map((graph) => ({
271
+ id: graph.id,
272
+ name: graph.name,
273
+ entry: graph.entry,
274
+ nodeCount: Object.keys(graph.nodes || {}).length,
275
+ edgeCount: (graph.edges || []).length,
276
+ })),
277
+ bundles: skillsRegistry?.bundles || [],
278
+ templates: skillsRegistry?.templates || [],
279
+ projectSkills: skillsRegistry?.projects || [],
198
280
  attributes: { names: attributes, count: attributes.length },
199
281
  cli: { commands: cliCommands },
200
282
  tooling: {
201
- categories: ['scan', 'prefix', 'scaffold', 'layout', 'perf', 'tokens', 'docs', 'search', 'meta'],
283
+ categories: [
284
+ 'scan',
285
+ 'prefix',
286
+ 'scaffold',
287
+ 'plan',
288
+ 'review',
289
+ 'layout',
290
+ 'perf',
291
+ 'tokens',
292
+ 'docs',
293
+ 'search',
294
+ 'meta',
295
+ ],
202
296
  scannerRuleCount,
203
297
  },
204
298
  a11y: {
@@ -216,11 +310,17 @@ export async function buildAgentBundle(options) {
216
310
  generated: 'docs/generated/',
217
311
  guides: {
218
312
  velinMeta: 'docs/guides/velin-meta.html',
313
+ aiSkills: 'docs/guides/ai-skills.html',
219
314
  velinSearch: 'docs/guides/velin-search.html',
220
315
  syntaxHighlight: 'docs/guides/syntax-highlight.html',
221
316
  promptScaffolding: 'docs/guides/prompt-scaffolding.html',
222
317
  apiReference: 'docs/guides/api-reference.html',
223
318
  },
319
+ strategy: {
320
+ note: 'Maintainer strategy/ADR docs are not published (monorepo interne_docs/strategy).',
321
+ northStar: 'VELINSTYLE_2030.md',
322
+ architecture: 'ARCHITECTURE.md',
323
+ },
224
324
  agentFiles: {
225
325
  json: 'dist/velin-agent.json',
226
326
  llmsTxt: 'dist/llms.txt',
@@ -240,7 +340,7 @@ export async function buildAgentBundle(options) {
240
340
  export function buildLlmsTxt(bundle, baseUrl = 'https://velinstyle.info') {
241
341
  const tagline =
242
342
  bundle.framework.tagline ||
243
- 'VelinStyle is the WCAG 2.2 AAA CSS framework with native JavaScript runtime and Web Components.';
343
+ 'VelinStyle is a CSS framework with WCAG 2.2 AAA-oriented defaults, native JavaScript runtime, and Web Components.';
244
344
  const lines = [
245
345
  `# VelinStyle ${bundle.framework.version}`,
246
346
  '',
@@ -251,19 +351,34 @@ export function buildLlmsTxt(bundle, baseUrl = 'https://velinstyle.info') {
251
351
  '## Framework',
252
352
  `- npm: ${bundle.framework.name}`,
253
353
  `- ${tagline}`,
354
+ `- Pipeline: ${bundle.framework.pipeline || 'Core → Design → Knowledge → Prompt → Review → AI Metadata'}`,
355
+ `- Maturity: CSS/Web Components/runtime = stable; plan/review, knowledge graph, page/section registry, agent metadata = beta/foundation (seed, expanding); Studio + Utility Engine generator = planned`,
254
356
  `- Components: ${bundle.components.count} canonical Web Components (\`velin-*\`); ${bundle.components.loaderCount ?? bundle.components.count} lazy-loader entries`,
357
+ `- Knowledge graph: ${bundle.knowledgeGraph?.componentCount ?? 0} component nodes, ${bundle.knowledgeGraph?.pageCount ?? 0} page types, ${bundle.knowledgeGraph?.sectionCount ?? 0} sections, ${bundle.knowledgeGraph?.designConstraints?.length ?? 0} design constraint packs`,
255
358
  `- HTML attributes: ${bundle.attributes.count} \`velin-*\` bridges`,
256
- `- CLI: velinstyle (scan, scaffold, docs generate, search index, meta)`,
359
+ `- CLI: velinstyle (scan, scaffold, plan, review, docs generate, search index, meta)`,
360
+ '',
361
+ '## Agent briefing',
362
+ '- Treat plan/review/knowledge graph as beta foundation — usable, not a finished AI design system.',
363
+ '- Build pages with plan-first flow: analyze prompt → page registry → sections → design constraints → HTML → review.',
364
+ '- Prefer tokens (`--velin-color-*`, `--velin-space-*`) over raw hex.',
365
+ '- One H1 per page; form fields need labels + `velin-form-summary` when validating.',
366
+ '- Hero: max 2 CTAs; FAQ uses disclosure (`velin-accordion` / details).',
367
+ '- Do not invent non-`velin-*` utility classes.',
368
+ '- Prefer registry-backed skills/workflows (`velinstyle skills ...`, `velinstyle workflow ...`) before ad-hoc orchestration.',
257
369
  '',
258
370
  '## Conventions',
259
371
  ...bundle.conventions.map((c) => `- ${c}`),
260
372
  '',
261
373
  '## Key guides',
262
374
  `- [Velin-Meta](${baseUrl}/docs/guides/velin-meta.html)`,
375
+ `- [AI Skills](${baseUrl}/docs/guides/ai-skills.html)`,
263
376
  `- [VelinSearch](${baseUrl}/docs/guides/velin-search.html)`,
264
377
  `- [Syntax highlighting](${baseUrl}/docs/guides/syntax-highlight.html)`,
265
378
  `- [Prompt scaffolding](${baseUrl}/docs/guides/prompt-scaffolding.html)`,
266
379
  `- [API reference (generated)](${baseUrl}/docs/guides/api-reference.html)`,
380
+ `- North star: VELINSTYLE_2030.md`,
381
+ `- Architecture: ARCHITECTURE.md`,
267
382
  '',
268
383
  '## Generated reference',
269
384
  `- [Components index](${baseUrl}/docs/generated/components/)`,
@@ -273,9 +388,14 @@ export function buildLlmsTxt(bundle, baseUrl = 'https://velinstyle.info') {
273
388
  '',
274
389
  '## Usage for agents',
275
390
  '```',
391
+ 'npx velinstyle plan "Steuerberater Landingpage mit Kontaktformular"',
392
+ 'npx velinstyle scaffold "Steuerberater Landingpage mit Kontaktformular" -o out.html --json',
393
+ 'npx velinstyle review out.html --json',
276
394
  'npx velinstyle meta',
277
395
  'npx velinstyle docs generate',
278
- 'npx velinstyle search index',
396
+ 'npx velinstyle skills list --capability review',
397
+ 'npx velinstyle skills install frontend',
398
+ 'npx velinstyle workflow landingpage --json',
279
399
  '```',
280
400
  '',
281
401
  ];
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "contact",
3
+ "target": "section:contact",
4
+ "rules": [
5
+ { "id": "contact-labels", "scope": "section", "section": "contact", "rule": "Visible labels on all fields", "severity": "error" },
6
+ { "id": "contact-summary", "scope": "section", "section": "contact", "rule": "Include velin-form-summary for errors", "severity": "error" },
7
+ { "id": "contact-submit", "scope": "section", "section": "contact", "rule": "Single primary submit button", "severity": "warning" }
8
+ ]
9
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "id": "faq",
3
+ "target": "section:faq",
4
+ "rules": [
5
+ { "id": "faq-questions", "scope": "section", "section": "faq", "rule": "Entries must be clear interrogatives", "severity": "error" },
6
+ { "id": "faq-pattern", "scope": "section", "section": "faq", "rule": "Use accordion/disclosure, not long marketing paragraphs", "severity": "error" },
7
+ { "id": "faq-count", "scope": "section", "section": "faq", "rule": "Prefer 5–8 high-intent FAQs", "severity": "info" }
8
+ ]
9
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "hero",
3
+ "target": "section:hero",
4
+ "rules": [
5
+ { "id": "hero-headline-lines", "scope": "section", "section": "hero", "rule": "Headline max 2 lines on desktop", "severity": "error" },
6
+ { "id": "hero-cta-max", "scope": "section", "section": "hero", "rule": "Maximum 2 CTAs", "severity": "error" },
7
+ { "id": "hero-image-side", "scope": "section", "section": "hero", "rule": "Image left OR right, not competing dual heroes", "severity": "warning" },
8
+ { "id": "hero-padding", "scope": "section", "section": "hero", "rule": "Section padding by breakpoint", "breakpoints": { "mobile": "var(--velin-space-8)", "tablet": "var(--velin-space-10)", "desktop": "var(--velin-space-12)" }, "severity": "warning" },
9
+ { "id": "hero-contrast", "scope": "section", "section": "hero", "rule": "Text/surface pairs must meet contrast contract", "severity": "error" },
10
+ { "id": "hero-motion", "scope": "section", "section": "hero", "rule": "Animation only when motion-safe", "severity": "warning" },
11
+ { "id": "hero-container", "scope": "section", "section": "hero", "rule": "Content inside documented container width", "severity": "warning" }
12
+ ]
13
+ }