@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.
- package/README.de.md +89 -161
- package/README.md +187 -119
- package/cli/blueprint.js +98 -5
- package/cli/blueprints/app-chrome.html +18 -0
- package/cli/blueprints/benefits-grid.html +9 -0
- package/cli/blueprints/bottom-nav-mobile.html +2 -1
- package/cli/blueprints/cookie-consent.html +1 -1
- package/cli/blueprints/cta-band.html +6 -0
- package/cli/blueprints/faq-section.html +18 -0
- package/cli/blueprints/filter-bar.html +4 -4
- package/cli/blueprints/form-contact.html +6 -5
- package/cli/blueprints/hero-section.html +3 -3
- package/cli/blueprints/notification-center.html +1 -1
- package/cli/blueprints/onboarding.html +2 -1
- package/cli/blueprints/ops-console.html +29 -0
- package/cli/blueprints/pricing-band.html +37 -0
- package/cli/blueprints/process-steps.html +10 -0
- package/cli/blueprints/services-grid.html +9 -0
- package/cli/blueprints/settings-panel.html +8 -6
- package/cli/blueprints/split-hero.html +25 -0
- package/cli/blueprints/testimonials.html +8 -0
- package/cli/blueprints/trust-bar.html +10 -0
- package/cli/cli-manifest.json +81 -17
- package/cli/contrast-utils.js +97 -0
- package/cli/create.js +370 -0
- package/cli/docgen/extract-attributes.js +128 -10
- package/cli/docgen/extract-cli.js +3 -2
- package/cli/docgen/extract-components.js +61 -2
- package/cli/docgen/extract-utilities.js +10 -10
- package/cli/doctor.js +119 -0
- package/cli/index.js +560 -44
- package/cli/meta.js +84 -1
- package/cli/perf-audit.js +15 -2
- package/cli/prompt-engine.js +243 -0
- package/cli/review.js +268 -0
- package/cli/scaffold.js +119 -4
- package/cli/scanner-rules-data.js +7 -0
- package/cli/scanner.js +357 -4
- package/cli/serve.js +81 -0
- package/cli/skills.js +223 -0
- package/cli/transparency.js +221 -0
- package/cli/wc-api.js +89 -0
- package/cli/workflow.js +42 -0
- package/components/index.js +2 -0
- package/components/runtime/component-loaders.js +2 -0
- package/components/velin-accordion.js +62 -13
- package/components/velin-bottom-nav.js +10 -0
- package/components/velin-calendar.js +212 -0
- package/components/velin-command.js +18 -2
- package/components/velin-data-table.js +78 -1
- package/components/velin-dialog.js +4 -1
- package/components/velin-drawer.js +2 -4
- package/components/velin-file-dropzone.js +162 -0
- package/components/velin-icon.js +22 -1
- package/components/velin-lightbox.js +5 -3
- package/components/velin-modal.js +2 -4
- package/components/velin-search.js +1 -1
- package/components/velin-sheet.js +2 -4
- package/core/a11y/component-contracts.json +20 -3
- package/core/attributes/registry.js +14 -0
- package/core/meta/build.js +125 -5
- package/core/meta/design-constraints/contact.json +9 -0
- package/core/meta/design-constraints/faq.json +9 -0
- package/core/meta/design-constraints/hero.json +13 -0
- package/core/meta/knowledge/components.json +622 -0
- package/core/meta/knowledge/tokens.json +282 -0
- package/core/meta/pages/registry.json +294 -0
- package/core/meta/schema.js +13 -1
- package/core/meta/sections/registry.json +185 -0
- package/core/transparency/attach.js +74 -0
- package/core/transparency/claims.js +97 -0
- package/core/transparency/doctor.js +142 -0
- package/core/transparency/engine.js +75 -0
- package/core/transparency/export.js +98 -0
- package/core/transparency/index.js +30 -0
- package/core/transparency/migrate.js +130 -0
- package/core/transparency/normalize.js +125 -0
- package/core/transparency/policy.js +105 -0
- package/core/transparency/providers.js +235 -0
- package/core/transparency/registry.js +104 -0
- package/core/transparency/renderer.js +111 -0
- package/core/transparency/reporter.js +113 -0
- package/core/transparency/validator.js +112 -0
- package/dist/chunks/attach-H2ZSEAE6.js +365 -0
- package/dist/chunks/{attributes-STYCS3O5.js → attributes-A423NX5J.js} +3 -3
- package/dist/chunks/attributes-DZCXX2RZ.js +404 -0
- package/dist/chunks/{attributes-353XDOAX.js → attributes-F6UPIEVP.js} +1 -1
- package/dist/chunks/{attributes-ADOKLKA7.js → attributes-GLYXGGAL.js} +3 -3
- package/dist/chunks/{attributes-TPANLMLF.js → attributes-UFTYOSAU.js} +3 -3
- package/dist/chunks/attributes-XGLXLR2T.js +391 -0
- package/dist/chunks/attributes-YF4NI2QS.js +391 -0
- package/dist/chunks/browser-AUABBYUK.js +1544 -0
- package/dist/chunks/{chunk-RSMRR27R.js → chunk-2LSKX57P.js} +12 -10
- package/dist/chunks/{chunk-IEHKRARD.js → chunk-2TGCVDUL.js} +11 -9
- package/dist/chunks/{chunk-SRL6EWHP.js → chunk-5JWGUAPC.js} +17 -13
- package/dist/chunks/chunk-7YSO2OQ2.js +113 -0
- package/dist/chunks/{chunk-QVHYL3R4.js → chunk-BHR3ZG6U.js} +6 -6
- package/dist/chunks/chunk-CQMTCEI6.js +113 -0
- package/dist/chunks/{chunk-J472ERN2.js → chunk-JMSIHEYX.js} +15 -4
- package/dist/chunks/{chunk-MKZP2TBH.js → chunk-L7ZGUU4D.js} +2 -2
- package/dist/chunks/chunk-TUGIPKW5.js +113 -0
- package/dist/chunks/{highlight-GJHHV4KM.js → highlight-M2ELQNYK.js} +1 -1
- package/dist/chunks/runtime-entry.js +1 -1
- package/dist/chunks/{velin-accordion-FBIPAEXG.js → velin-accordion-WSY6BMLA.js} +64 -10
- package/dist/chunks/{velin-bottom-nav-7GEMPIM6.js → velin-bottom-nav-5RVRNGIP.js} +25 -0
- package/dist/chunks/{velin-bottom-nav-N3DFQR66.js → velin-bottom-nav-N5F4UO2I.js} +26 -1
- package/dist/chunks/velin-calendar-OFE6THUD.js +210 -0
- package/dist/chunks/velin-calendar-PGVNJTXK.js +217 -0
- package/dist/chunks/velin-calendar-XC7JRDSH.js +217 -0
- package/dist/chunks/{velin-code-block-CIAURDRJ.js → velin-code-block-ZGWG7JI5.js} +1 -1
- package/dist/chunks/{velin-combobox-NXS4QB4R.js → velin-combobox-56V2ZWT5.js} +1 -1
- package/dist/chunks/{velin-command-ONKO2A3J.js → velin-command-2HO2EKR6.js} +29 -2
- package/dist/chunks/{velin-command-TMLSRGIU.js → velin-command-ZJSLPK7B.js} +30 -3
- package/dist/chunks/{velin-copy-NYDBOKXT.js → velin-copy-XDQSV2XU.js} +1 -1
- package/dist/chunks/{velin-countdown-4ZVDGK4R.js → velin-countdown-V4Z5MA63.js} +1 -1
- package/dist/chunks/velin-data-table-UVR42UUM.js +372 -0
- package/dist/chunks/{velin-dialog-GTTZI564.js → velin-dialog-3YK2RPRV.js} +9 -2
- package/dist/chunks/{velin-dialog-ELFOZIXZ.js → velin-dialog-S24KAP4S.js} +3 -1
- package/dist/chunks/{velin-drawer-BE6TYN3H.js → velin-drawer-5PNU624J.js} +2 -4
- package/dist/chunks/{velin-drawer-DLL2GLT6.js → velin-drawer-CCM6S25D.js} +3 -5
- package/dist/chunks/{velin-email-RBX6ZR4S.js → velin-email-TNFONXPW.js} +1 -1
- package/dist/chunks/velin-file-dropzone-QRGF2JNA.js +154 -0
- package/dist/chunks/velin-file-dropzone-XIZMJ3NB.js +154 -0
- package/dist/chunks/{velin-icon-7M76DOPB.js → velin-icon-A6NCXGUK.js} +59 -17
- package/dist/chunks/{velin-icon-ZTSKUOVN.js → velin-icon-EC4B5XCM.js} +18 -5
- package/dist/chunks/{velin-lightbox-6E7CAATP.js → velin-lightbox-FFK4TUUP.js} +7 -6
- package/dist/chunks/{velin-lightbox-NXA3U2FM.js → velin-lightbox-P725FLTY.js} +5 -4
- package/dist/chunks/{velin-menubar-J66JXRWW.js → velin-menubar-6I2LM5HL.js} +1 -1
- package/dist/chunks/{velin-modal-5HYNNNUI.js → velin-modal-ICTMGRSU.js} +7 -8
- package/dist/chunks/{velin-modal-AEOTZ67O.js → velin-modal-JBNODH7D.js} +2 -4
- package/dist/chunks/{velin-popover-T72HK3DF.js → velin-popover-WZG2GHBL.js} +25 -4
- package/dist/chunks/{velin-rating-N4DI2XNL.js → velin-rating-QBBYRRBU.js} +1 -1
- package/dist/chunks/{velin-search-7B4KJ6TX.js → velin-search-B3L6J2RP.js} +2 -2
- package/dist/chunks/{velin-search-2XRQFBCS.js → velin-search-L3UG6NDQ.js} +5 -4
- package/dist/chunks/{velin-secure-field-6PV7RZDJ.js → velin-secure-field-DGYMP7OK.js} +1 -1
- package/dist/chunks/{velin-segmented-control-GYD5BIXQ.js → velin-segmented-control-P74GJPAR.js} +1 -1
- package/dist/chunks/{velin-sheet-R2Y67X6H.js → velin-sheet-M5GZZD7G.js} +2 -4
- package/dist/chunks/{velin-sheet-OUK6572T.js → velin-sheet-X7RXIWKV.js} +3 -5
- package/dist/chunks/{velin-stepper-X54WGHDG.js → velin-stepper-4YQJUHPC.js} +12 -5
- package/dist/chunks/{velin-toast-OMMOA2DK.js → velin-toast-UG5LWTG2.js} +5 -1
- package/dist/chunks/{velin-tooltip-BDHGRTQB.js → velin-tooltip-ZDH5SDLU.js} +1 -1
- package/dist/llms.txt +31 -8
- package/dist/search-index.json +182 -10
- package/dist/velin-agent.json +3980 -31
- package/dist/velinstyle-components.iife.js +1622 -286
- package/dist/velinstyle-components.js +1624 -286
- package/dist/velinstyle-components.min.js +262 -114
- package/dist/velinstyle.css +412 -67
- package/dist/velinstyle.d.ts +2 -0
- package/dist/velinstyle.min.css +1 -1
- package/package.json +21 -6
- package/packages/skill-engine/README.md +24 -0
- package/packages/skill-engine/package.json +7 -0
- package/packages/skill-engine/src/catalog.js +29 -0
- package/packages/skill-engine/src/index.js +5 -0
- package/packages/skill-engine/src/install.js +69 -0
- package/packages/skill-engine/src/registry.js +27 -0
- package/packages/skill-engine/src/resolve.js +68 -0
- package/packages/skill-engine/src/validate.js +40 -0
- package/packages/velinstyle-skills/README.md +6 -0
- package/packages/velinstyle-skills/adapter.json +8 -0
- package/packages/velinstyle-skills/bundles/landing-starter.bundle.yaml +12 -0
- package/packages/velinstyle-skills/bundles/review-suite.bundle.yaml +11 -0
- package/packages/velinstyle-skills/catalog.json +1004 -0
- package/packages/velinstyle-skills/graphs/component-ship.graph.yaml +14 -0
- package/packages/velinstyle-skills/graphs/landingpage.graph.yaml +21 -0
- package/packages/velinstyle-skills/graphs/release-gate.graph.yaml +15 -0
- package/packages/velinstyle-skills/index.js +22 -0
- package/packages/velinstyle-skills/package.json +7 -0
- package/packages/velinstyle-skills/packs/accessibility.pack.yaml +9 -0
- package/packages/velinstyle-skills/packs/design.pack.yaml +10 -0
- package/packages/velinstyle-skills/packs/documentation.pack.yaml +8 -0
- package/packages/velinstyle-skills/packs/enterprise.pack.yaml +10 -0
- package/packages/velinstyle-skills/packs/frontend.pack.yaml +10 -0
- package/packages/velinstyle-skills/packs/review.pack.yaml +9 -0
- package/packages/velinstyle-skills/projects/admin-panel.project.yaml +12 -0
- package/packages/velinstyle-skills/projects/blog.project.yaml +11 -0
- package/packages/velinstyle-skills/projects/documentation-portal.project.yaml +13 -0
- package/packages/velinstyle-skills/projects/ecommerce-shop.project.yaml +12 -0
- package/packages/velinstyle-skills/projects/landing-page.project.yaml +12 -0
- package/packages/velinstyle-skills/projects/laravel-dashboard.project.yaml +12 -0
- package/packages/velinstyle-skills/projects/marketing-website.project.yaml +14 -0
- package/packages/velinstyle-skills/projects/portfolio.project.yaml +12 -0
- package/packages/velinstyle-skills/registry.json +142 -0
- package/packages/velinstyle-skills/scripts/generate-assets.mjs +163 -0
- package/packages/velinstyle-skills/skills/velin-a11y-focus-keyboard/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-a11y-page-checklist/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-a11y-scan-fix/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-ai-agent-briefing/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-ai-plan-scaffold-review/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-ai-skill-authoring/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-components-accessibility-map/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-components-api-contract/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-components-recipe/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-components-select-compose/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-design-hero-compose/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-design-section-rhythm/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-design-surface-roles/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dev-component-wire/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dev-page-scaffold/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dev-plan-first/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-docs-component-guide/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-docs-generate-api/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dx-doctor-setup/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-dx-project-init/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-migration-legacy-wc/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-migration-prefix-classes/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-motion-reduced-safe/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-motion-reveal-feedback/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-perf-audit-fix/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-perf-runtime-tree-shake/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-release-changelog-sync/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-release-meta-rebuild/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-review-conversion-hero/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-review-page-gate/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-review-seo-meta/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-security-sanitize-html/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-security-scan-pii/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-testing-a11y-suite/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-testing-visual-smoke/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-themes-apply-token/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-themes-contrast-check/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-utilities-layout-apply/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-utilities-prefix-fix/SKILL.md +57 -0
- package/packages/velinstyle-skills/skills/velin-utilities-token-map/SKILL.md +57 -0
- package/packages/velinstyle-skills/templates/admin-panel.template.yaml +12 -0
- package/packages/velinstyle-skills/templates/blog.template.yaml +12 -0
- package/packages/velinstyle-skills/templates/documentation-portal.template.yaml +12 -0
- package/packages/velinstyle-skills/templates/ecommerce-shop.template.yaml +13 -0
- package/packages/velinstyle-skills/templates/landing-page.template.yaml +12 -0
- package/packages/velinstyle-skills/templates/laravel-dashboard.template.yaml +11 -0
- package/packages/velinstyle-skills/templates/marketing-website.template.yaml +13 -0
- package/packages/velinstyle-skills/templates/portfolio.template.yaml +12 -0
- package/schemas/component-knowledge.schema.json +33 -0
- package/schemas/design-constraint.schema.json +15 -0
- package/schemas/design-intelligence.schema.json +19 -0
- package/schemas/design-rule.schema.json +19 -0
- package/schemas/page-template.schema.json +24 -0
- package/schemas/review-report.schema.json +36 -0
- package/schemas/section.schema.json +22 -0
- package/schemas/skill-bundle.schema.json +15 -0
- package/schemas/skill-graph.schema.json +25 -0
- package/schemas/skill-pack.schema.json +14 -0
- package/schemas/skill-project.schema.json +16 -0
- package/schemas/skill-record.schema.json +27 -0
- package/schemas/skill-registry.schema.json +17 -0
- package/schemas/skill-template.schema.json +17 -0
- package/schemas/token-graph.schema.json +27 -0
- package/schemas/utility.schema.json +166 -0
- package/src/components/alert.css +22 -1
- package/src/components/calendar-dropzone.css +5 -0
- package/src/components/transparency.css +138 -0
- package/src/layout/app-shell.css +33 -0
- package/src/tokens/shadow.css +13 -0
- package/src/utilities/border.css +2 -0
- package/src/utilities/display.css +1 -24
- package/src/utilities/responsive.css +16 -1
- package/src/utilities/spacing.css +32 -0
- package/src/velinstyle.css +3 -0
- package/dist/chunks/attributes-3BZLI7XF.js +0 -364
- package/dist/chunks/attributes-4N5JP4CG.js +0 -364
- package/dist/chunks/attributes-5Q2WXGRC.js +0 -374
- package/dist/chunks/attributes-AIR7SVLK.js +0 -364
- package/dist/chunks/attributes-BGRN5XZO.js +0 -364
- package/dist/chunks/attributes-BVSQAYLR.js +0 -364
- package/dist/chunks/attributes-CDYFUY7Y.js +0 -364
- package/dist/chunks/attributes-JMYJZBPE.js +0 -364
- package/dist/chunks/attributes-R5JY3X4O.js +0 -374
- package/dist/chunks/attributes-TNSPQTHX.js +0 -374
- package/dist/chunks/chunk-2354NEBP.js +0 -109
- package/dist/chunks/chunk-2VNA7G7S.js +0 -109
- package/dist/chunks/chunk-AQLRJSGG.js +0 -109
- package/dist/chunks/chunk-EWPSDMQT.js +0 -109
- package/dist/chunks/chunk-LA7264K4.js +0 -85
- package/dist/chunks/chunk-QTJJ3DPO.js +0 -109
- package/dist/chunks/chunk-RZQVWFHW.js +0 -109
- package/dist/chunks/chunk-U4XHMZ7D.js +0 -109
- package/dist/chunks/chunk-V5YIUA6G.js +0 -109
- package/dist/chunks/chunk-XIET2VSZ.js +0 -109
- package/dist/chunks/chunk-XYLJ2GCB.js +0 -205
- package/dist/chunks/chunk-ZPSPKUYD.js +0 -109
- package/dist/chunks/highlight-XTHRKBA3.js +0 -37
- package/dist/chunks/velin-bottom-nav-2N2TYWOF.js +0 -86
- package/dist/chunks/velin-carousel-Y5VCOABZ.js +0 -213
- package/dist/chunks/velin-code-block-ASUBTAQV.js +0 -119
- package/dist/chunks/velin-code-block-TSUKPY4C.js +0 -123
- package/dist/chunks/velin-code-block-Y6CM726Q.js +0 -119
- package/dist/chunks/velin-combobox-2KDTCQ7N.js +0 -155
- package/dist/chunks/velin-command-M7RNHUPR.js +0 -136
- package/dist/chunks/velin-copy-T5KDTDXP.js +0 -81
- package/dist/chunks/velin-countdown-5XSTN3BH.js +0 -101
- package/dist/chunks/velin-counter-ISCTEAHI.js +0 -118
- package/dist/chunks/velin-dialog-D2GUHSCD.js +0 -144
- package/dist/chunks/velin-dialog-IJLFDXAJ.js +0 -144
- package/dist/chunks/velin-dialog-TNS3WXMB.js +0 -144
- package/dist/chunks/velin-drawer-MJS6WCF7.js +0 -130
- package/dist/chunks/velin-email-N5B5ZYTE.js +0 -90
- package/dist/chunks/velin-icon-KZO3IEHG.js +0 -164
- package/dist/chunks/velin-lightbox-I75U6JF4.js +0 -140
- package/dist/chunks/velin-lightbox-QOTB4PRL.js +0 -140
- package/dist/chunks/velin-lightbox-UCD6N7HF.js +0 -140
- package/dist/chunks/velin-live-dot-XHUZCIDZ.js +0 -67
- package/dist/chunks/velin-menubar-SFEXJE56.js +0 -86
- package/dist/chunks/velin-modal-2HOBXE6F.js +0 -176
- package/dist/chunks/velin-modal-GLI2XZZB.js +0 -176
- package/dist/chunks/velin-popover-EXINRIGJ.js +0 -145
- package/dist/chunks/velin-popover-OXX7MRZ6.js +0 -145
- package/dist/chunks/velin-popover-YKCCROJG.js +0 -145
- package/dist/chunks/velin-rating-XRQJV4LO.js +0 -91
- package/dist/chunks/velin-scroll-top-F2FCZNYD.js +0 -58
- package/dist/chunks/velin-search-4YHJWYSS.js +0 -556
- package/dist/chunks/velin-search-LWHY23Q5.js +0 -474
- package/dist/chunks/velin-secure-field-H7FSBUJW.js +0 -95
- package/dist/chunks/velin-segmented-control-PQX6LKOJ.js +0 -109
- package/dist/chunks/velin-sheet-3OGI4HD7.js +0 -119
- package/dist/chunks/velin-sparkline-GVEANJVW.js +0 -184
- package/dist/chunks/velin-sparkline-KDA3GQAN.js +0 -162
- package/dist/chunks/velin-stepper-2ZIHLKGM.js +0 -141
- package/dist/chunks/velin-stepper-FYEUEWE6.js +0 -141
- package/dist/chunks/velin-stepper-wc-QU3KRVQR.js +0 -133
- package/dist/chunks/velin-theme-toggle-BNNS7WLV.js +0 -285
- package/dist/chunks/velin-theme-toggle-NO7V4TWI.js +0 -285
- package/dist/chunks/velin-theme-toggle-QELCJM2Q.js +0 -291
- package/dist/chunks/velin-toast-RCZ4CSUC.js +0 -109
- package/dist/chunks/velin-toast-WEUBTJG6.js +0 -109
- package/dist/chunks/velin-tooltip-664IOHZA.js +0 -112
- package/dist/chunks/velin-tooltip-wc-LXDVT6DE.js +0 -103
- 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;
|
package/components/velin-icon.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
100
|
+
clearBackgroundInert(this);
|
|
103
101
|
}
|
|
104
102
|
}
|
|
105
103
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"wcagLevel": "AAA",
|
|
3
|
-
"version": "1.1
|
|
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": "
|
|
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.
|
|
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
|
}
|
package/core/meta/build.js
CHANGED
|
@@ -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
|
|
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: [
|
|
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
|
|
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
|
|
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
|
+
}
|