@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,474 +0,0 @@
1
- import {
2
- escapeHTMLAttribute,
3
- sanitizeSearchUrl
4
- } from "./chunk-LA7264K4.js";
5
-
6
- // core/search/types.js
7
- var SEARCH_CATEGORIES = (
8
- /** @type {const} */
9
- ["docs", "components", "api", "examples"]
10
- );
11
- var CATEGORY_BOOST = {
12
- components: 1.25,
13
- api: 1.15,
14
- docs: 1,
15
- examples: 0.9
16
- };
17
- function normalizeEntry(entry) {
18
- if (!entry || typeof entry !== "object") return null;
19
- const e = (
20
- /** @type {Record<string, unknown>} */
21
- entry
22
- );
23
- const id = String(e.id || e.url || e.title || "").trim();
24
- const title = String(e.title || "").trim();
25
- const url = String(e.url || "").trim();
26
- if (!id || !title) return null;
27
- const keywords = Array.isArray(e.keywords) ? e.keywords.map((k) => String(k)) : typeof e.keywords === "string" ? e.keywords.split(/\s+/).filter(Boolean) : [];
28
- let category = (
29
- /** @type {SearchCategory} */
30
- SEARCH_CATEGORIES.includes(
31
- /** @type {SearchCategory} */
32
- e.category
33
- ) ? e.category : "docs"
34
- );
35
- if (!e.category && typeof e.url === "string") {
36
- if (e.url.includes("/components/")) category = "components";
37
- else if (e.url.includes("/cli/") || e.url.includes("/api/")) category = "api";
38
- else if (e.url.includes("samples/") || e.url.includes("examples/")) category = "examples";
39
- }
40
- const safeUrl = url ? sanitizeSearchUrl(url) : `#${id}`;
41
- return {
42
- id,
43
- title,
44
- excerpt: String(e.excerpt || e.section || "").slice(0, 200),
45
- url: safeUrl,
46
- category: (
47
- /** @type {SearchCategory} */
48
- category
49
- ),
50
- keywords,
51
- weight: typeof e.weight === "number" ? e.weight : 1
52
- };
53
- }
54
-
55
- // core/search/engine.js
56
- var VelinSearchEngine = class {
57
- constructor() {
58
- this._entries = [];
59
- }
60
- /** @param {import('./types.js').SearchEntry[]} entries */
61
- setEntries(entries) {
62
- this._entries = entries.map((e) => normalizeEntry(e)).filter(Boolean);
63
- }
64
- /** @param {import('./types.js').SearchEntry[]} entries */
65
- addEntries(entries) {
66
- const next = entries.map((e) => normalizeEntry(e)).filter(Boolean);
67
- const ids = new Set(this._entries.map((e) => e.id));
68
- for (const e of next) {
69
- if (!ids.has(e.id)) {
70
- this._entries.push(e);
71
- ids.add(e.id);
72
- }
73
- }
74
- }
75
- /**
76
- * @param {string} query
77
- * @param {object} [opts]
78
- * @param {number} [opts.limit]
79
- * @param {number} [opts.minChars]
80
- * @param {number} [opts.fuzzy] 0–1 threshold for typo tolerance
81
- * @param {import('./types.js').SearchCategory[]} [opts.categories]
82
- */
83
- query(query, opts = {}) {
84
- const q = String(query || "").trim().toLowerCase();
85
- const minChars = opts.minChars ?? 2;
86
- const limit = opts.limit ?? 12;
87
- const fuzzy = opts.fuzzy ?? 0.2;
88
- const categories = opts.categories;
89
- if (q.length < minChars) {
90
- return { results: [], groups: {} };
91
- }
92
- const scored = [];
93
- for (const entry of this._entries) {
94
- if (categories && categories.length && !categories.includes(entry.category)) continue;
95
- const s = scoreEntry(entry, q, fuzzy);
96
- if (s > 0) scored.push({ entry, score: s });
97
- }
98
- scored.sort((a, b) => b.score - a.score);
99
- const results = scored.slice(0, limit).map((x) => ({ ...x.entry, _score: x.score }));
100
- const groups = {};
101
- for (const r of results) {
102
- if (!groups[r.category]) groups[r.category] = [];
103
- groups[r.category].push(r);
104
- }
105
- return { results, groups };
106
- }
107
- };
108
- function scoreEntry(entry, q, fuzzy) {
109
- const title = entry.title.toLowerCase();
110
- const excerpt = (entry.excerpt || "").toLowerCase();
111
- const keywords = (entry.keywords || []).join(" ").toLowerCase();
112
- const boost = (CATEGORY_BOOST[entry.category] || 1) * (entry.weight || 1);
113
- let score = 0;
114
- if (title === q) score = 100;
115
- else if (title.startsWith(q)) score = 70;
116
- else if (title.includes(q)) score = 50;
117
- else if (keywords.includes(q)) score = 35;
118
- else if (excerpt.includes(q)) score = 25;
119
- else if (fuzzy > 0 && fuzzyMatch(title, q, fuzzy)) score = 40;
120
- else if (fuzzy > 0 && fuzzyMatch(keywords, q, fuzzy)) score = 28;
121
- else if (fuzzy > 0 && fuzzyMatch(excerpt, q, fuzzy)) score = 18;
122
- else if (subsequenceMatch(title, q)) score = 22;
123
- else if (fuzzy > 0) {
124
- for (const word of title.split(/[^a-z0-9]+/)) {
125
- if (word.length >= 3 && fuzzyMatch(word, q, fuzzy)) {
126
- score = 32;
127
- break;
128
- }
129
- }
130
- }
131
- return score > 0 ? score * boost : 0;
132
- }
133
- function subsequenceMatch(haystack, needle) {
134
- let j = 0;
135
- for (let i = 0; i < haystack.length && j < needle.length; i++) {
136
- if (haystack[i] === needle[j]) j++;
137
- }
138
- return j === needle.length;
139
- }
140
- function fuzzyMatch(text, query, threshold) {
141
- if (!text || !query) return false;
142
- if (text.includes(query)) return true;
143
- if (subsequenceMatch(text, query)) return true;
144
- const maxDist = Math.max(1, Math.floor(query.length * threshold * 2));
145
- return levenshtein(text.slice(0, Math.min(text.length, query.length + 8)), query) <= maxDist;
146
- }
147
- function levenshtein(a, b) {
148
- const m = a.length;
149
- const n = b.length;
150
- if (m === 0) return n;
151
- if (n === 0) return m;
152
- const dp = new Uint16Array((n + 1) * (m + 1));
153
- for (let j = 0; j <= n; j++) dp[j] = j;
154
- for (let i = 1; i <= m; i++) {
155
- dp[i * (n + 1)] = i;
156
- for (let j = 1; j <= n; j++) {
157
- const cost = a[i - 1] === b[j - 1] ? 0 : 1;
158
- dp[i * (n + 1) + j] = Math.min(
159
- dp[(i - 1) * (n + 1) + j] + 1,
160
- dp[i * (n + 1) + (j - 1)] + 1,
161
- dp[(i - 1) * (n + 1) + (j - 1)] + cost
162
- );
163
- }
164
- }
165
- return dp[m * (n + 1) + n];
166
- }
167
-
168
- // core/search/highlight.js
169
- function highlightHtml(text, query) {
170
- const raw = String(text || "");
171
- const q = String(query || "").trim();
172
- if (!q || q.length < 2) return escapeHtml(raw);
173
- const lower = raw.toLowerCase();
174
- const ql = q.toLowerCase();
175
- let start = lower.indexOf(ql);
176
- let len = q.length;
177
- if (start === -1) {
178
- start = fuzzySubsequenceIndex(lower, ql);
179
- if (start === -1) return escapeHtml(raw);
180
- len = Math.min(q.length, raw.length - start);
181
- }
182
- return escapeHtml(raw.slice(0, start)) + '<mark class="velin-search-hit">' + escapeHtml(raw.slice(start, start + len)) + "</mark>" + escapeHtml(raw.slice(start + len));
183
- }
184
- function escapeHtml(s) {
185
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
186
- }
187
- function fuzzySubsequenceIndex(haystack, needle) {
188
- let j = 0;
189
- let start = -1;
190
- for (let i = 0; i < haystack.length && j < needle.length; i++) {
191
- if (haystack[i] === needle[j]) {
192
- if (j === 0) start = i;
193
- j++;
194
- }
195
- }
196
- return j === needle.length ? start : -1;
197
- }
198
-
199
- // core/search/index.js
200
- var defaultEngine = new VelinSearchEngine();
201
- function parseIndexPayload(data) {
202
- if (Array.isArray(data)) return data;
203
- if (data && Array.isArray(data.entries)) return data.entries;
204
- return [];
205
- }
206
- function createSearch(config = {}) {
207
- const engine = new VelinSearchEngine();
208
- const wantWorker = config.worker === true;
209
- let workerClient = null;
210
- async function getWorker() {
211
- if (!wantWorker || workerClient) return workerClient;
212
- if (typeof Worker === "undefined") return null;
213
- const { createSearchWorker } = await import("./worker-client-R6DBYPFT.js");
214
- workerClient = createSearchWorker(config.workerUrl);
215
- return workerClient;
216
- }
217
- return {
218
- engine,
219
- async loadIndex(source) {
220
- let entries = [];
221
- if (typeof source === "string") {
222
- const res = await fetch(source);
223
- entries = parseIndexPayload(await res.json());
224
- } else if (Array.isArray(source)) {
225
- entries = source;
226
- }
227
- engine.setEntries(entries);
228
- const w = await getWorker();
229
- if (w) await w.setEntries(engine._entries);
230
- return entries.length;
231
- },
232
- async query(q, opts) {
233
- const w = await getWorker();
234
- if (w) return w.query(q, opts);
235
- return engine.query(q, opts);
236
- },
237
- addEntries(entries) {
238
- engine.addEntries(entries);
239
- void getWorker().then((w) => w?.setEntries(engine._entries));
240
- }
241
- };
242
- }
243
-
244
- // components/velin-search.js
245
- var CATEGORY_LABELS = {
246
- docs: "Documentation",
247
- components: "Components",
248
- api: "API",
249
- examples: "Examples"
250
- };
251
- var VelinSearch = class extends HTMLElement {
252
- static get observedAttributes() {
253
- return ["index", "categories", "min-chars", "fuzzy", "placeholder", "debounce"];
254
- }
255
- constructor() {
256
- super();
257
- this._search = createSearch();
258
- this._debounceTimer = null;
259
- this._activeIndex = -1;
260
- this._flatResults = [];
261
- this._indexLoaded = false;
262
- this._listId = `velin-search-listbox-${Math.random().toString(36).slice(2, 9)}`;
263
- this._mounted = false;
264
- }
265
- connectedCallback() {
266
- if (this._mounted) return;
267
- this._mounted = true;
268
- this._ensureMarkup();
269
- this._loadIndex();
270
- this._bindEvents();
271
- }
272
- disconnectedCallback() {
273
- this._teardown?.();
274
- this._mounted = false;
275
- }
276
- get indexUrl() {
277
- return this.getAttribute("index") || "/search-index.json";
278
- }
279
- get minChars() {
280
- return parseInt(this.getAttribute("min-chars") || "2", 10);
281
- }
282
- get fuzzy() {
283
- const v = this.getAttribute("fuzzy");
284
- return v === null ? 0.2 : parseFloat(v) || 0;
285
- }
286
- get categories() {
287
- const raw = this.getAttribute("categories");
288
- if (!raw) return null;
289
- return raw.split(",").map((c) => c.trim()).filter((c) => SEARCH_CATEGORIES.includes(c));
290
- }
291
- get debounceMs() {
292
- return parseInt(this.getAttribute("debounce") || "120", 10);
293
- }
294
- _ensureMarkup() {
295
- if (this.querySelector("[data-velin-search-input]")) return;
296
- const ph = escapeHTMLAttribute(this.getAttribute("placeholder") || "Search\u2026");
297
- this.innerHTML = `
298
- <div class="velin-search">
299
- <div class="velin-search__field">
300
- <input type="search" class="velin-search__input" data-velin-search-input
301
- placeholder="${ph}" autocomplete="off" role="combobox" aria-expanded="false"
302
- aria-controls="${this._listId}" aria-autocomplete="list" />
303
- </div>
304
- <div class="velin-search__status velin-visually-hidden" data-velin-search-status aria-live="polite" aria-atomic="true"></div>
305
- <div class="velin-search__results" data-velin-search-results role="listbox"
306
- id="${this._listId}" hidden></div>
307
- </div>
308
- `;
309
- }
310
- _inputEl() {
311
- return this.querySelector("[data-velin-search-input]");
312
- }
313
- _resultsEl() {
314
- return this.querySelector("[data-velin-search-results]");
315
- }
316
- async _loadIndex() {
317
- try {
318
- await this._search.loadIndex(this.indexUrl);
319
- this._indexLoaded = true;
320
- } catch {
321
- this._indexLoaded = false;
322
- }
323
- }
324
- _bindEvents() {
325
- const input = this._inputEl();
326
- const panel = this._resultsEl();
327
- if (!input || !panel) return;
328
- input.addEventListener("input", () => {
329
- clearTimeout(this._debounceTimer);
330
- this._debounceTimer = setTimeout(() => this._runQuery(input.value), this.debounceMs);
331
- });
332
- input.addEventListener("focus", () => {
333
- if (input.value.trim().length >= this.minChars) this._runQuery(input.value);
334
- });
335
- input.addEventListener("keydown", (e) => this._onKeydown(e, input, panel));
336
- const onDocClick = (e) => {
337
- if (!this.contains(e.target)) this._hide(panel, input);
338
- };
339
- document.addEventListener("click", onDocClick);
340
- this._teardown = () => {
341
- document.removeEventListener("click", onDocClick);
342
- clearTimeout(this._debounceTimer);
343
- };
344
- }
345
- async _runQuery(raw) {
346
- const input = this._inputEl();
347
- const panel = this._resultsEl();
348
- if (!input || !panel) return;
349
- const q = raw.trim();
350
- if (q.length < this.minChars) {
351
- this._hide(panel, input);
352
- return;
353
- }
354
- if (!this._indexLoaded) await this._loadIndex();
355
- const { groups } = this._search.query(q, {
356
- minChars: this.minChars,
357
- fuzzy: this.fuzzy,
358
- categories: this.categories || void 0,
359
- limit: 12
360
- });
361
- this._activeIndex = -1;
362
- this._renderResults(panel, input, q, groups);
363
- if (this._flatResults.length) {
364
- panel.hidden = false;
365
- panel.classList.add("velin-search__results--open");
366
- input.setAttribute("aria-expanded", "true");
367
- } else {
368
- this._hide(panel, input);
369
- }
370
- }
371
- _renderResults(panel, input, q, groups) {
372
- panel.innerHTML = "";
373
- const order = this.categories || [...SEARCH_CATEGORIES];
374
- this._flatResults = [];
375
- let globalIdx = 0;
376
- for (const cat of order) {
377
- const items = groups[cat];
378
- if (!items?.length) continue;
379
- const groupId = `${this._listId}-group-${cat}`;
380
- const group = document.createElement("div");
381
- group.setAttribute("role", "group");
382
- group.setAttribute("aria-labelledby", groupId);
383
- const heading = document.createElement("div");
384
- heading.className = "velin-search__group-label";
385
- heading.id = groupId;
386
- heading.textContent = CATEGORY_LABELS[cat] || cat;
387
- group.appendChild(heading);
388
- const base = typeof location !== "undefined" ? location.href : void 0;
389
- for (const item of items) {
390
- const a = document.createElement("a");
391
- a.href = sanitizeSearchUrl(item.url, base);
392
- a.className = "velin-search__item";
393
- a.setAttribute("role", "option");
394
- a.id = `velin-search-opt-${globalIdx}`;
395
- a.innerHTML = `<span class="velin-search__title">${highlightHtml(item.title, q)}</span><span class="velin-search__excerpt">${highlightHtml(item.excerpt || "", q)}</span>`;
396
- a.addEventListener("mouseenter", () => this._setActive(globalIdx, panel, input));
397
- group.appendChild(a);
398
- this._flatResults.push(item);
399
- globalIdx++;
400
- }
401
- panel.appendChild(group);
402
- }
403
- const status = this._statusEl();
404
- if (status) {
405
- status.textContent = this._flatResults.length ? `${this._flatResults.length} results` : "No results";
406
- }
407
- }
408
- _statusEl() {
409
- return this.querySelector("[data-velin-search-status]");
410
- }
411
- _setActive(idx, panel, input) {
412
- this._activeIndex = idx;
413
- panel.querySelectorAll(".velin-search__item").forEach((el, i) => {
414
- el.classList.toggle("velin-search__item--active", i === idx);
415
- if (i === idx) {
416
- input.setAttribute("aria-activedescendant", el.id);
417
- el.scrollIntoView({ block: "nearest" });
418
- }
419
- });
420
- }
421
- _onKeydown(e, input, panel) {
422
- if (e.key === "Escape") {
423
- this._hide(panel, input);
424
- return;
425
- }
426
- if (!this._flatResults.length) return;
427
- if (e.key === "ArrowDown") {
428
- e.preventDefault();
429
- const next = this._activeIndex < this._flatResults.length - 1 ? this._activeIndex + 1 : 0;
430
- this._setActive(next, panel, input);
431
- } else if (e.key === "ArrowUp") {
432
- e.preventDefault();
433
- const prev = this._activeIndex > 0 ? this._activeIndex - 1 : this._flatResults.length - 1;
434
- this._setActive(prev, panel, input);
435
- } else if (e.key === "Enter") {
436
- const target = this._activeIndex >= 0 ? this._flatResults[this._activeIndex] : this._flatResults[0];
437
- if (target?.url) {
438
- e.preventDefault();
439
- const base = typeof location !== "undefined" ? location.href : void 0;
440
- window.location.href = sanitizeSearchUrl(target.url, base);
441
- }
442
- }
443
- }
444
- _hide(panel, input) {
445
- panel.hidden = true;
446
- panel.classList.remove("velin-search__results--open");
447
- input.setAttribute("aria-expanded", "false");
448
- input.removeAttribute("aria-activedescendant");
449
- this._activeIndex = -1;
450
- }
451
- };
452
- var velin_search_default = VelinSearch;
453
- if (typeof HTMLElement !== "undefined" && typeof customElements !== "undefined" && !customElements.get("velin-search")) {
454
- customElements.define("velin-search", VelinSearch);
455
- }
456
- function bindDeclarativeSearch(root = document) {
457
- root.querySelectorAll("[velin-search-input]").forEach((input) => {
458
- if (input.dataset.velinSearchBound) return;
459
- input.dataset.velinSearchBound = "1";
460
- let host = input.closest("velin-search");
461
- if (!host) {
462
- host = document.createElement("velin-search");
463
- host.setAttribute("index", input.getAttribute("data-search-index") || "/search-index.json");
464
- const results = input.parentElement?.querySelector("[velin-search-results]");
465
- input.before(host);
466
- host.appendChild(input);
467
- if (results) host.appendChild(results);
468
- }
469
- });
470
- }
471
- export {
472
- bindDeclarativeSearch,
473
- velin_search_default as default
474
- };
@@ -1,95 +0,0 @@
1
- import {
2
- escapeHTML,
3
- escapeHTMLAttribute,
4
- sanitizeInputType
5
- } from "./chunk-LA7264K4.js";
6
-
7
- // components/velin-secure-field.js
8
- var styles = `
9
- :host { display: block; }
10
- label { display: block; font-size: var(--velin-text-sm); margin-block-end: var(--velin-space-1); }
11
- input {
12
- width: 100%;
13
- min-height: 2.75rem;
14
- padding: var(--velin-space-2) var(--velin-space-3);
15
- font: inherit;
16
- border: 1px solid var(--velin-color-border);
17
- border-radius: var(--velin-radius-md);
18
- }
19
- input:focus-visible {
20
- outline: 3px solid var(--velin-color-focus);
21
- outline-offset: 2px;
22
- }
23
- .velin-field-help {
24
- font-size: var(--velin-text-xs);
25
- color: var(--velin-color-text-muted);
26
- margin-block-start: var(--velin-space-1);
27
- }
28
- `;
29
- async function encryptValue(plain, mode) {
30
- if (mode !== "aes-gcm" || !globalThis.crypto?.subtle) {
31
- return JSON.stringify({ encoding: "base64", payload: btoa(unescape(encodeURIComponent(plain))) });
32
- }
33
- const iv = crypto.getRandomValues(new Uint8Array(12));
34
- const key = await crypto.subtle.generateKey({ name: "AES-GCM", length: 256 }, false, ["encrypt"]);
35
- const encoded = new TextEncoder().encode(plain);
36
- const cipher = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, encoded);
37
- return JSON.stringify({
38
- encoding: "aes-gcm",
39
- iv: Array.from(iv),
40
- cipher: Array.from(new Uint8Array(cipher))
41
- });
42
- }
43
- var VelinSecureField = class extends HTMLElement {
44
- static get observedAttributes() {
45
- return ["type", "name", "label", "mode", "autocomplete"];
46
- }
47
- constructor() {
48
- super();
49
- this.attachShadow({ mode: "open" });
50
- this._onChange = null;
51
- }
52
- connectedCallback() {
53
- if (!this._onChange) this.render();
54
- }
55
- disconnectedCallback() {
56
- const input = this.shadowRoot?.querySelector("input");
57
- if (input && this._onChange) input.removeEventListener("change", this._onChange);
58
- this._onChange = null;
59
- }
60
- attributeChangedCallback() {
61
- if (this.isConnected) this.render();
62
- }
63
- render() {
64
- const type = sanitizeInputType(this.getAttribute("type"));
65
- const name = this.getAttribute("name") || "secure";
66
- const label = this.getAttribute("label") || "Secure field";
67
- const autocomplete = escapeHTMLAttribute(this.getAttribute("autocomplete") || "off");
68
- const id = `velin-secure-${Math.random().toString(36).slice(2, 9)}`;
69
- const input = this.shadowRoot?.querySelector("input");
70
- if (input && this._onChange) input.removeEventListener("change", this._onChange);
71
- this.shadowRoot.innerHTML = `
72
- <style>${styles}</style>
73
- <label for="${id}">${escapeHTML(label)}</label>
74
- <input id="${id}" type="${type}" autocomplete="${autocomplete}" part="input" />
75
- <p class="velin-field-help">Demo-only client encoding \u2014 use HTTPS and server-side crypto for real secrets.</p>
76
- `;
77
- const newInput = this.shadowRoot.querySelector("input");
78
- this._onChange = async () => {
79
- const mode = this.getAttribute("mode") || "aes-gcm";
80
- const payload = await encryptValue(newInput.value, mode);
81
- this.dispatchEvent(new CustomEvent("velin-secure-submit", {
82
- bubbles: true,
83
- detail: { name, payload }
84
- }));
85
- };
86
- newInput.addEventListener("change", this._onChange);
87
- }
88
- };
89
- if (!customElements.get("velin-secure-field")) {
90
- customElements.define("velin-secure-field", VelinSecureField);
91
- }
92
- var velin_secure_field_default = VelinSecureField;
93
- export {
94
- velin_secure_field_default as default
95
- };
@@ -1,109 +0,0 @@
1
- import {
2
- SHADOW_A11Y_STYLES
3
- } from "./chunk-F7OLHTGX.js";
4
- import {
5
- rovingTabindex
6
- } from "./chunk-42VVPW6N.js";
7
- import {
8
- escapeHTML
9
- } from "./chunk-LA7264K4.js";
10
-
11
- // components/velin-segmented-control.js
12
- var styles = `
13
- ${SHADOW_A11Y_STYLES}
14
- :host { display: block; }
15
- .group {
16
- display: inline-flex;
17
- gap: var(--velin-space-1, 0.25rem);
18
- padding: var(--velin-space-1, 0.25rem);
19
- background: var(--velin-color-surface-dim, #eee);
20
- border-radius: var(--velin-radius-md, 0.5rem);
21
- }
22
- ::slotted(button) {
23
- min-inline-size: 2.75rem;
24
- min-block-size: 2.75rem;
25
- padding: var(--velin-space-2, 0.5rem) var(--velin-space-4, 1rem);
26
- border: none;
27
- border-radius: var(--velin-radius-sm, 0.25rem);
28
- background: transparent;
29
- color: var(--velin-color-text-muted, #666);
30
- cursor: pointer;
31
- font-size: var(--velin-text-sm, 0.875rem);
32
- }
33
- ::slotted(button[aria-pressed="true"]) {
34
- background: var(--velin-color-surface-bright, #fff);
35
- color: var(--velin-color-text, #111);
36
- font-weight: var(--velin-weight-semibold, 600);
37
- box-shadow: var(--velin-shadow-sm, 0 1px 2px rgba(0,0,0,0.06));
38
- }
39
- `;
40
- var VelinSegmentedControl = class extends HTMLElement {
41
- constructor() {
42
- super();
43
- this.attachShadow({ mode: "open", delegatesFocus: true });
44
- this._onClick = this._onClick.bind(this);
45
- this._onKey = this._onKey.bind(this);
46
- }
47
- connectedCallback() {
48
- const label = escapeHTML(this.getAttribute("aria-label") || "Segmented control");
49
- this.shadowRoot.innerHTML = `
50
- <style>${styles}</style>
51
- <div class="group" role="group" aria-label="${label}"><slot></slot></div>
52
- `;
53
- this.addEventListener("click", this._onClick);
54
- this.addEventListener("keydown", this._onKey);
55
- this.shadowRoot.querySelector("slot")?.addEventListener("slotchange", () => this._init());
56
- this._init();
57
- }
58
- _getButtons() {
59
- const slot = this.shadowRoot.querySelector("slot");
60
- return slot ? slot.assignedElements().filter((el) => el.tagName === "BUTTON") : [];
61
- }
62
- _init() {
63
- const buttons = this._getButtons();
64
- const selected = buttons.find((b) => b.hasAttribute("selected")) || buttons[0];
65
- buttons.forEach((btn, i) => {
66
- btn.setAttribute("aria-pressed", btn === selected ? "true" : "false");
67
- btn.setAttribute("tabindex", btn === selected ? "0" : "-1");
68
- });
69
- }
70
- _onClick(e) {
71
- const btn = e.target.closest("button");
72
- if (!btn || !this.contains(btn)) return;
73
- this._select(btn);
74
- }
75
- _select(btn) {
76
- this._getButtons().forEach((b) => {
77
- b.setAttribute("aria-pressed", b === btn ? "true" : "false");
78
- b.setAttribute("tabindex", b === btn ? "0" : "-1");
79
- });
80
- this.dispatchEvent(new CustomEvent("velin-change", { bubbles: true, detail: { value: btn.value || btn.textContent?.trim() } }));
81
- }
82
- _onKey(e) {
83
- const buttons = this._getButtons();
84
- if (!buttons.includes(e.target)) return;
85
- rovingTabindex(this, buttons, e);
86
- if (["ArrowLeft", "ArrowRight", "Home", "End"].includes(e.key)) {
87
- const focused = buttons.find((b) => b.getAttribute("tabindex") === "0");
88
- if (focused) this._select(focused);
89
- }
90
- }
91
- static get observedAttributes() {
92
- return ["aria-label"];
93
- }
94
- attributeChangedCallback(name) {
95
- if (name === "aria-label") {
96
- const group = this.shadowRoot?.querySelector(".group");
97
- if (group) group.setAttribute("aria-label", escapeHTML(this.getAttribute("aria-label") || "Segmented control"));
98
- }
99
- }
100
- disconnectedCallback() {
101
- this.removeEventListener("click", this._onClick);
102
- this.removeEventListener("keydown", this._onKey);
103
- }
104
- };
105
- customElements.define("velin-segmented-control", VelinSegmentedControl);
106
- var velin_segmented_control_default = VelinSegmentedControl;
107
- export {
108
- velin_segmented_control_default as default
109
- };