From c4cb986685c8f50484ebdce44660e2edab79ca25 Mon Sep 17 00:00:00 2001 From: Kirill Kolesnikov Date: Fri, 4 Sep 2026 19:54:54 +0700 Subject: [PATCH 1/3] Sunset VueForge: extract it to its own repository and remove it here VueForge is no longer developed. Its eight packages -- core, layouts, icons, theme, codeblock, playground, playground-core, playground-vite-plugin -- moved to codemonster-ru/vueforge with their commit history intact via git subtree split, the same mechanism this repo already used to split packages/razor into codemonster-ru/ui-razor. That repository's tooling was verified independently: install, build, lint, typecheck, and test all pass for all eight packages before anything was removed here. Two packages (vueforge-layouts, vueforge-icons) carry only 1-2 commits of history in the new repo rather than their full history, because they were renamed this week to free their names for CodeMonster UI's own packages, and git subtree split does not follow a rename across differently-named prefixes. The fuller history is not lost -- it stays in this repository's own git log -- it just is not linear in the new repository. What left the working tree, and why each piece is safe to remove: - The eight package directories and examples/vue, the frozen VueForge showcase pinned to commit fd793696. That showcase was the proof that CodeMonster UI reproduced VueForge pixel for pixel; the migration it proved is complete and permanent, so continuing to rebuild and compare against it forever protects nothing further. - The whole migration apparatus: migration/*.json, the codemod, and the vueforge-baseline/mapping/coverage checkers. It answered "does the migration map state what actually happened," a question that stops needing an answer once there is no more migrating to do. - Six completed verification records under docs/verification/ and the whole docs/design-audit/ directory -- VueForge's own phase-by-phase design-system audit trail, unrelated to the CodeMonster migration specifically. All of it is marked Complete or dated, historical, and self-contained; nothing living referenced any of it. - docs/core, docs/layouts, docs/icons, docs/codeblock, docs/playground, and the 1.x-to-2.x migration guide moved to the new repository instead of being deleted, on the same reasoning already used for the packages: documentation for a product belongs with the product. What stayed, on purpose, because it protects something real rather than something historical: - visual-baselines/vueforge-cross-platform and packages/tokens/parity/ vueforge-2-token-parity.json. Both are committed data whose pixels or values were captured once from VueForge, and both are still the live baseline the Vue and Razor adapters are compared against today -- proving the two platforms agree with each other, not with VueForge. Their provenance stays named honestly; nothing about what they protect depended on VueForge staying in this repository. - check:consumer-tree-shaking's forbidden-output markers and validateNoVueForgeImports in code-monster-ui-package-contracts.mjs. Both guard against a CodeMonster bundle accidentally retaining VueForge internals. That risk does not disappear because the packages are uninstalled right now -- it reappears the moment anyone reintroduces the dependency. Three real bugs surfaced along the way, none of them about VueForge: - package.json's verify script was missing "npm run " before its first step, a mechanical slip from an earlier edit this session that would have made every future `npm run verify` fail outright. - The check:frozen-showcase guard's own acknowledgedChanges list had gone stale, describing a path that no longer differed -- caught by the staleness check built into the guard itself. - component-palette-contract.spec.ts hardcoded 'layouts/src' as VueForge core's sibling to scan for color literals. On this repository's own main branch that path now belongs to CodeMonster's ui-layouts, so the test had been silently checking the wrong package's CSS and passing by coincidence. Fixed in the extracted copy, since the file was about to leave this repository anyway. Two scripts (check-package-contracts.mjs, check-packed-consumer.mjs) were built entirely around the VueForge release train and became either dead code or fully redundant with an existing, independent CodeMonster-only equivalent once that train was gone; both were rewritten or removed rather than left as unreachable code. check-documentation-contracts.mjs lost roughly 400 lines of a parallel component-doc-contract system that existed only to check VueForge's own Vf* components against docs/core and docs/layouts -- CodeMonster's Cm* components already have their own, separate check. ARCHITECTURE.md described Vf*/vf- as this repository's naming convention, which had already been wrong for weeks; it now points at the actual authoritative naming document instead of duplicating a stale copy of it. Known remaining gap, unrelated to this change: check:component-documentation verifies a component name appears in the guides by substring, so CmIcon counts as documented because the string "CmIcon" appears inside "CmIconButton". CmIcon has no real documentation entry of its own. Left for a follow-up since it predates this branch and fixing it well means writing real docs, not just tightening a regex. --- .github/workflows/ci.yml | 38 +- .../workflows/refresh-visual-baselines.yml | 118 - ARCHITECTURE.md | 39 +- README.md | 109 +- contracts/visual.config.json | 3 +- contracts/visual.states.json | 67 - .../application-shell-ownership.md | 5 +- docs/codeblock/api/index.md | 153 - docs/codeblock/components/code-block/api.md | 78 - .../components/code-block/features.md | 131 - docs/codeblock/components/code-block/index.md | 18 - .../components/code-block/theming.md | 86 - docs/codeblock/getting-started.md | 20 - docs/codeblock/guides/index.md | 69 - docs/codeblock/installation.md | 63 - docs/codemonster-ui-1.1-release-notes.md | 9 +- docs/codemonster-ui-2.0-release-notes.md | 4 +- docs/core/api/index.md | 128 - docs/core/components/accordion/api.md | 56 - docs/core/components/accordion/features.md | 58 - docs/core/components/accordion/index.md | 18 - docs/core/components/accordion/theming.md | 22 - docs/core/components/alert/api.md | 57 - docs/core/components/alert/features.md | 61 - docs/core/components/alert/index.md | 18 - docs/core/components/alert/theming.md | 27 - docs/core/components/avatar/api.md | 46 - docs/core/components/avatar/features.md | 36 - docs/core/components/avatar/index.md | 9 - docs/core/components/avatar/theming.md | 26 - docs/core/components/badge/api.md | 51 - docs/core/components/badge/features.md | 57 - docs/core/components/badge/index.md | 18 - docs/core/components/badge/theming.md | 19 - docs/core/components/breadcrumbs/api.md | 53 - docs/core/components/breadcrumbs/features.md | 72 - docs/core/components/breadcrumbs/index.md | 18 - docs/core/components/breadcrumbs/theming.md | 22 - docs/core/components/button/api.md | 56 - docs/core/components/button/features.md | 80 - docs/core/components/button/index.md | 18 - docs/core/components/button/theming.md | 49 - docs/core/components/card/api.md | 54 - docs/core/components/card/features.md | 67 - docs/core/components/card/index.md | 18 - docs/core/components/card/theming.md | 19 - docs/core/components/checkbox/api.md | 57 - docs/core/components/checkbox/features.md | 141 - docs/core/components/checkbox/index.md | 18 - docs/core/components/checkbox/theming.md | 24 - docs/core/components/command-palette/api.md | 80 - .../components/command-palette/features.md | 109 - docs/core/components/command-palette/index.md | 18 - .../components/command-palette/theming.md | 25 - docs/core/components/confirm-dialog/api.md | 39 - .../components/confirm-dialog/features.md | 26 - docs/core/components/confirm-dialog/index.md | 15 - .../core/components/confirm-dialog/theming.md | 5 - .../data-table-column-chooser/api.md | 24 - .../data-table-column-chooser/features.md | 15 - .../data-table-column-chooser/index.md | 15 - .../data-table-column-chooser/theming.md | 4 - docs/core/components/data-table/api.md | 142 - docs/core/components/data-table/features.md | 427 --- docs/core/components/data-table/index.md | 17 - docs/core/components/data-table/theming.md | 26 - docs/core/components/date-picker/api.md | 75 - docs/core/components/date-picker/features.md | 136 - docs/core/components/date-picker/index.md | 16 - docs/core/components/date-picker/theming.md | 20 - docs/core/components/dialog/api.md | 69 - docs/core/components/dialog/features.md | 72 - docs/core/components/dialog/index.md | 18 - docs/core/components/dialog/theming.md | 19 - docs/core/components/divider/api.md | 51 - docs/core/components/divider/features.md | 57 - docs/core/components/divider/index.md | 18 - docs/core/components/divider/theming.md | 19 - docs/core/components/drawer/api.md | 73 - docs/core/components/drawer/features.md | 86 - docs/core/components/drawer/index.md | 18 - docs/core/components/drawer/theming.md | 23 - docs/core/components/dropdown/api.md | 60 - docs/core/components/dropdown/features.md | 87 - docs/core/components/dropdown/index.md | 18 - docs/core/components/dropdown/theming.md | 22 - docs/core/components/field/api.md | 60 - docs/core/components/field/features.md | 187 - docs/core/components/field/index.md | 18 - docs/core/components/field/theming.md | 38 - docs/core/components/fieldset/api.md | 57 - docs/core/components/fieldset/features.md | 71 - docs/core/components/fieldset/index.md | 18 - docs/core/components/fieldset/theming.md | 27 - docs/core/components/form-layout/api.md | 20 - docs/core/components/form-layout/features.md | 22 - docs/core/components/form-layout/index.md | 15 - docs/core/components/form-layout/theming.md | 4 - docs/core/components/group-box/api.md | 40 - docs/core/components/group-box/features.md | 62 - docs/core/components/group-box/index.md | 15 - docs/core/components/group-box/theming.md | 28 - docs/core/components/icon-button/api.md | 56 - docs/core/components/icon-button/features.md | 58 - docs/core/components/icon-button/index.md | 18 - docs/core/components/icon-button/theming.md | 20 - docs/core/components/input/api.md | 59 - docs/core/components/input/features.md | 144 - docs/core/components/input/index.md | 18 - docs/core/components/input/theming.md | 25 - docs/core/components/link/api.md | 58 - docs/core/components/link/features.md | 68 - docs/core/components/link/index.md | 18 - docs/core/components/link/theming.md | 21 - docs/core/components/menu-bar/api.md | 57 - docs/core/components/menu-bar/features.md | 73 - docs/core/components/menu-bar/index.md | 18 - docs/core/components/menu-bar/theming.md | 23 - docs/core/components/menu/api.md | 25 - docs/core/components/menu/features.md | 52 - docs/core/components/menu/index.md | 16 - docs/core/components/menu/theming.md | 11 - docs/core/components/nav-menu/api.md | 65 - docs/core/components/nav-menu/features.md | 111 - docs/core/components/nav-menu/index.md | 18 - docs/core/components/nav-menu/theming.md | 26 - docs/core/components/page-header/api.md | 23 - docs/core/components/page-header/features.md | 24 - docs/core/components/page-header/index.md | 15 - docs/core/components/page-header/theming.md | 5 - docs/core/components/panel/api.md | 53 - docs/core/components/panel/features.md | 58 - docs/core/components/panel/index.md | 18 - docs/core/components/panel/theming.md | 19 - docs/core/components/popover/api.md | 59 - docs/core/components/popover/features.md | 80 - docs/core/components/popover/index.md | 18 - docs/core/components/popover/theming.md | 23 - docs/core/components/progress-bar/api.md | 59 - docs/core/components/progress-bar/features.md | 58 - docs/core/components/progress-bar/index.md | 17 - docs/core/components/progress-bar/theming.md | 47 - docs/core/components/progress-spinner/api.md | 54 - .../components/progress-spinner/features.md | 56 - .../core/components/progress-spinner/index.md | 17 - .../components/progress-spinner/theming.md | 36 - docs/core/components/radio/api.md | 57 - docs/core/components/radio/features.md | 97 - docs/core/components/radio/index.md | 18 - docs/core/components/radio/theming.md | 23 - docs/core/components/select/api.md | 65 - docs/core/components/select/features.md | 165 - docs/core/components/select/index.md | 18 - docs/core/components/select/theming.md | 25 - docs/core/components/skeleton-gate/api.md | 34 - .../core/components/skeleton-gate/features.md | 39 - docs/core/components/skeleton-gate/index.md | 18 - docs/core/components/skeleton-gate/theming.md | 22 - docs/core/components/skeleton/api.md | 29 - docs/core/components/skeleton/features.md | 22 - docs/core/components/skeleton/index.md | 18 - docs/core/components/skeleton/theming.md | 25 - docs/core/components/stepper/api.md | 58 - docs/core/components/stepper/features.md | 124 - docs/core/components/stepper/index.md | 17 - docs/core/components/stepper/theming.md | 38 - docs/core/components/switch/api.md | 60 - docs/core/components/switch/features.md | 97 - docs/core/components/switch/index.md | 18 - docs/core/components/switch/theming.md | 24 - docs/core/components/table-of-contents/api.md | 56 - .../components/table-of-contents/features.md | 90 - .../components/table-of-contents/index.md | 18 - .../components/table-of-contents/theming.md | 23 - docs/core/components/table/api.md | 58 - docs/core/components/table/features.md | 82 - docs/core/components/table/index.md | 18 - docs/core/components/table/theming.md | 19 - docs/core/components/tabs/api.md | 55 - docs/core/components/tabs/features.md | 65 - docs/core/components/tabs/index.md | 18 - docs/core/components/tabs/theming.md | 24 - docs/core/components/tag/api.md | 51 - docs/core/components/tag/features.md | 58 - docs/core/components/tag/index.md | 18 - docs/core/components/tag/theming.md | 19 - docs/core/components/textarea/api.md | 53 - docs/core/components/textarea/features.md | 138 - docs/core/components/textarea/index.md | 18 - docs/core/components/textarea/theming.md | 24 - docs/core/components/theme-switch/api.md | 59 - docs/core/components/theme-switch/features.md | 66 - docs/core/components/theme-switch/index.md | 18 - docs/core/components/theme-switch/theming.md | 19 - docs/core/components/tooltip/api.md | 56 - docs/core/components/tooltip/features.md | 61 - docs/core/components/tooltip/index.md | 18 - docs/core/components/tooltip/theming.md | 22 - docs/core/getting-started.md | 27 - docs/core/guides/accessibility.md | 183 - docs/core/guides/color-tokens.md | 318 -- docs/core/guides/index.md | 98 - .../core/guides/skeleton-gate-async-recipe.md | 106 - docs/core/guides/ssr.md | 254 -- docs/core/guides/theme-configuration.md | 275 -- docs/core/installation.md | 96 - docs/design-audit/accessibility-colors.md | 176 - docs/design-audit/color-audit-report.md | 396 -- docs/design-audit/color-inventory.md | 817 ---- docs/design-audit/phase-0-report.md | 282 -- docs/design-audit/phase-1-report.md | 250 -- docs/design-audit/phase-2-report.md | 556 --- docs/design-audit/phase-3-report.md | 637 --- docs/design-audit/phase-4-report.md | 519 --- docs/design-audit/phase-5-report.md | 312 -- .../design-audit/repository-hygiene-report.md | 342 -- docs/design-audit/ui-consistency-report.md | 215 -- .../design-audit/vueforge-2-cleanup-report.md | 254 -- docs/icons/api/index.md | 60 - docs/icons/components/vue-iconify/api.md | 62 - docs/icons/components/vue-iconify/features.md | 45 - docs/icons/components/vue-iconify/index.md | 9 - docs/icons/components/vue-iconify/theming.md | 20 - docs/icons/getting-started.md | 18 - docs/icons/guides/index.md | 61 - docs/icons/icons.md | 82 - docs/icons/installation.md | 64 - docs/index.md | 15 +- docs/layouts/api/index.md | 163 - docs/layouts/components/admin-layout/api.md | 64 - .../components/admin-layout/features.md | 131 - docs/layouts/components/admin-layout/index.md | 17 - .../components/admin-layout/theming.md | 17 - docs/layouts/components/admin-shell/api.md | 19 - .../components/admin-shell/features.md | 14 - docs/layouts/components/admin-shell/index.md | 34 - .../layouts/components/admin-shell/theming.md | 17 - docs/layouts/components/app-shell/api.md | 70 - docs/layouts/components/app-shell/features.md | 58 - docs/layouts/components/app-shell/index.md | 18 - docs/layouts/components/app-shell/theming.md | 23 - docs/layouts/components/aside-area/api.md | 52 - .../layouts/components/aside-area/features.md | 54 - docs/layouts/components/aside-area/index.md | 18 - docs/layouts/components/aside-area/theming.md | 19 - docs/layouts/components/auth-layout/api.md | 60 - .../components/auth-layout/features.md | 70 - docs/layouts/components/auth-layout/index.md | 18 - .../layouts/components/auth-layout/theming.md | 41 - docs/layouts/components/container/api.md | 53 - docs/layouts/components/container/features.md | 56 - docs/layouts/components/container/index.md | 18 - docs/layouts/components/container/theming.md | 19 - docs/layouts/components/content-area/api.md | 52 - .../components/content-area/features.md | 54 - docs/layouts/components/content-area/index.md | 18 - .../components/content-area/theming.md | 19 - .../layouts/components/document-layout/api.md | 65 - .../components/document-layout/features.md | 56 - .../components/document-layout/index.md | 18 - .../components/document-layout/theming.md | 24 - docs/layouts/components/error-layout/api.md | 60 - .../components/error-layout/features.md | 68 - docs/layouts/components/error-layout/index.md | 18 - .../components/error-layout/theming.md | 19 - docs/layouts/components/footer-area/api.md | 51 - .../components/footer-area/features.md | 54 - docs/layouts/components/footer-area/index.md | 18 - .../layouts/components/footer-area/theming.md | 19 - docs/layouts/components/grid/api.md | 51 - docs/layouts/components/grid/features.md | 57 - docs/layouts/components/grid/index.md | 18 - docs/layouts/components/grid/theming.md | 19 - docs/layouts/components/header-area/api.md | 52 - .../components/header-area/features.md | 54 - docs/layouts/components/header-area/index.md | 18 - .../layouts/components/header-area/theming.md | 23 - docs/layouts/components/inline/api.md | 52 - docs/layouts/components/inline/features.md | 57 - docs/layouts/components/inline/index.md | 18 - docs/layouts/components/inline/theming.md | 19 - docs/layouts/components/section/api.md | 52 - docs/layouts/components/section/features.md | 55 - docs/layouts/components/section/index.md | 18 - docs/layouts/components/section/theming.md | 19 - docs/layouts/components/setup-layout/api.md | 65 - .../components/setup-layout/features.md | 108 - docs/layouts/components/setup-layout/index.md | 17 - .../components/setup-layout/theming.md | 54 - docs/layouts/components/sidebar-area/api.md | 52 - .../components/sidebar-area/features.md | 59 - docs/layouts/components/sidebar-area/index.md | 18 - .../components/sidebar-area/theming.md | 19 - docs/layouts/components/stack/api.md | 51 - docs/layouts/components/stack/features.md | 56 - docs/layouts/components/stack/index.md | 18 - docs/layouts/components/stack/theming.md | 19 - docs/layouts/getting-started.md | 22 - docs/layouts/guides/index.md | 56 - docs/layouts/installation.md | 99 - docs/migration-to-v2.md | 193 - docs/playground/api/index.md | 112 - docs/playground/components/playground/api.md | 93 - .../components/playground/features.md | 117 - .../playground/components/playground/index.md | 18 - .../components/playground/theming.md | 68 - docs/playground/getting-started.md | 21 - docs/playground/guides/index.md | 58 - docs/playground/installation.md | 78 - docs/public-release-assets.md | 95 - docs/release-checklist.md | 2 +- .../codemonster-ui-maturity-verification.md | 49 - .../component-capability-audit.md | 123 - .../component-disposition-audit.md | 143 - docs/verification/consumer-usage-inventory.md | 169 - docs/verification/cross-platform-mvp.md | 6 +- docs/verification/maturity-backlog.md | 61 - docs/verification/npm-packed-consumers.md | 30 - docs/verification/prerelease-preparation.md | 48 - docs/verification/real-consumer-rehearsal.md | 178 - docs/vueforge-feature-baseline.md | 30 - docs/vueforge-to-codemonster-ui.md | 214 -- examples/ui-showcase/README.md | 17 +- examples/vue/README.md | 19 - examples/vue/eslint.config.mjs | 23 - examples/vue/index.html | 13 - examples/vue/package.json | 32 - examples/vue/src/App.vue | 14 - examples/vue/src/LegacyShowcase.vue | 457 --- examples/vue/src/PlaygroundShowcase.vue | 451 --- examples/vue/src/SharedShowcase.vue | 84 - examples/vue/src/app-shell.test.ts | 107 - examples/vue/src/app-shell.ts | 101 - examples/vue/src/assets/annabel-logo-icon.svg | 11 - examples/vue/src/assets/maya-chen-avatar.png | Bin 138901 -> 0 bytes .../vue/src/assets/vueforge-logo-icon.svg | 11 - .../src/components/ShowcaseThemeSwitch.vue | 128 - .../src/components/ViteLikeDemoPreview.vue | 289 -- examples/vue/src/demo-showcase.css | 91 - examples/vue/src/env.d.ts | 18 - examples/vue/src/main.ts | 29 - .../sections/codeblock/CodeBlockShowcase.vue | 310 -- .../sections/colors/ColorSystemShowcase.vue | 293 -- .../sections/colors/color-system-showcase.css | 474 --- .../core/CoreCommandPaletteRecipe.vue | 552 --- .../src/sections/core/CoreDataTableRecipe.vue | 189 - .../core/CoreDataTableStateRecipe.vue | 198 - .../sections/core/CoreDatePickerRecipe.vue | 983 ----- .../src/sections/core/CoreDialogRecipe.vue | 125 - .../src/sections/core/CoreDrawerRecipe.vue | 157 - .../core/CoreExpandableDataTableRecipe.vue | 236 -- .../sections/core/CoreFloatingFieldRecipe.vue | 355 -- .../sections/core/CoreIconSwitchRecipe.vue | 307 -- .../vue/src/sections/core/CoreInputRecipe.vue | 289 -- .../src/sections/core/CoreMenuBarRecipe.vue | 339 -- .../sections/core/CoreMenuBarRecipeNode.vue | 218 -- .../src/sections/core/CoreNavMenuRecipe.vue | 181 - .../sections/core/CoreNavMenuRecipeNode.vue | 166 - .../core/CorePaginationDataTableRecipe.vue | 228 -- .../core/CorePinnedDataTableRecipe.vue | 186 - .../core/CoreReorderableDataTableRecipe.vue | 346 -- .../core/CoreResizableDataTableRecipe.vue | 428 --- .../src/sections/core/CoreSelectRecipe.vue | 762 ---- .../core/CoreSelectableDataTableRecipe.vue | 236 -- .../vue/src/sections/core/CoreShowcase.vue | 3414 ----------------- .../core/CoreSlotsDataTableRecipe.vue | 65 - .../core/CoreSortableDataTableRecipe.vue | 458 --- .../core/CoreStickyDataTableRecipe.vue | 118 - .../sections/core/CoreStickyTableRecipe.vue | 106 - .../vue/src/sections/core/CoreTabsRecipe.vue | 536 --- .../src/sections/core/component-catalog.json | 256 -- .../core/core-command-palette-recipe.test.ts | 165 - .../core/core-data-table-recipe.test.ts | 106 - .../core/core-data-table-state-recipe.test.ts | 84 - .../core/core-date-picker-recipe.test.ts | 438 --- .../sections/core/core-date-picker-recipe.ts | 277 -- .../sections/core/core-dialog-recipe.test.ts | 144 - .../sections/core/core-drawer-recipe.test.ts | 180 - .../core-expandable-data-table-recipe.test.ts | 111 - .../core/core-floating-field-recipe.test.ts | 154 - .../core/core-icon-switch-recipe.test.ts | 138 - .../sections/core/core-input-recipe.test.ts | 156 - .../core/core-maintained-recipes.test.ts | 36 - .../sections/core/core-navigation-recipes.css | 656 ---- .../core/core-navigation-recipes.test.ts | 176 - .../core/core-navigation-recipes.types.ts | 25 - .../core-pagination-data-table-recipe.test.ts | 104 - .../core-pinned-data-table-recipe.test.ts | 99 - ...core-reorderable-data-table-recipe.test.ts | 162 - .../core-resizable-data-table-recipe.test.ts | 145 - .../sections/core/core-select-recipe.test.ts | 174 - .../core-selectable-data-table-recipe.test.ts | 116 - .../vue/src/sections/core/core-showcase.css | 1603 -------- .../core/core-slots-data-table-recipe.test.ts | 97 - .../core-sortable-data-table-recipe.test.ts | 138 - .../core-sticky-data-table-recipe.test.ts | 116 - .../core/core-sticky-table-recipe.test.ts | 97 - .../sections/core/core-tabs-recipe.test.ts | 195 - .../src/sections/core/core-typography.test.ts | 34 - .../src/sections/icons/IconSaasContexts.vue | 1254 ------ .../vue/src/sections/icons/IconsShowcase.vue | 12 - .../src/sections/layouts/LayoutsDataTable.vue | 144 - .../src/sections/layouts/LayoutsDrawer.vue | 99 - .../src/sections/layouts/LayoutsNavMenu.vue | 116 - .../sections/layouts/LayoutsNavMenuNode.vue | 102 - .../sections/layouts/LayoutsPasswordInput.vue | 119 - .../src/sections/layouts/LayoutsShowcase.vue | 2959 -------------- .../vue/src/sections/layouts/LayoutsTabs.vue | 522 --- .../sections/layouts/layouts-data-table.css | 77 - .../layouts/layouts-data-table.test.ts | 94 - .../src/sections/layouts/layouts-drawer.css | 102 - .../sections/layouts/layouts-drawer.test.ts | 110 - .../layouts-maintained-recipes.test.ts | 22 - .../src/sections/layouts/layouts-nav-menu.css | 290 -- .../sections/layouts/layouts-nav-menu.test.ts | 97 - .../layouts/layouts-password-input.test.ts | 94 - .../src/sections/layouts/layouts-showcase.css | 274 -- .../src/sections/layouts/layouts-tabs.test.ts | 102 - .../showcase-information-architecture.test.ts | 71 - examples/vue/src/showcase-theme.test.ts | 94 - examples/vue/src/showcase-theme.ts | 140 - examples/vue/src/theme-bootstrap.ts | 5 - .../vitepress-demos/custom-resolver-smoke.ts | 45 - .../src/vitepress-demos/vue-runtime-smoke.ts | 45 - examples/vue/tsconfig.json | 7 - examples/vue/vite.config.ts | 84 - migration/codemonster-ui-coverage.json | 2080 ---------- .../codemonster-ui-maturity-backlog.json | 176 - migration/vueforge-feature-baseline.json | 195 - migration/vueforge-to-codemonster-ui.json | 368 -- package.json | 42 +- packages/codeblock/CHANGELOG.md | 290 -- packages/codeblock/LICENSE | 21 - packages/codeblock/README.md | 79 - packages/codeblock/eslint.config.js | 9 - packages/codeblock/package.json | 102 - .../scripts/smoke-consumer-auto-css.mjs | 60 - .../codeblock/scripts/smoke-css-export.mjs | 113 - .../src/__tests__/mocks/vueforge-icons.ts | 20 - .../codeblock/src/__tests__/plugin.test.ts | 247 -- packages/codeblock/src/codeblock.css | 184 - .../codeblock/src/components/VfCodeBlock.vue | 313 -- .../components/__tests__/VfCodeBlock.test.ts | 788 ---- packages/codeblock/src/config.ts | 6 - packages/codeblock/src/critical.css | 27 - packages/codeblock/src/env.d.ts | 6 - packages/codeblock/src/highlight.ts | 8 - packages/codeblock/src/index.ts | 146 - .../codeblock/src/services/code-highlight.ts | 273 -- .../codeblock/src/themes/vueforge.test.ts | 146 - packages/codeblock/src/themes/vueforge.ts | 98 - packages/codeblock/src/tokens.css | 92 - packages/codeblock/src/types.ts | 85 - packages/codeblock/src/utils/plain-code.ts | 5 - packages/codeblock/src/view.ts | 20 - packages/codeblock/tsconfig.json | 20 - packages/codeblock/vite.config.ts | 77 - packages/core/CHANGELOG.md | 1205 ------ packages/core/LICENSE | 21 - packages/core/README.md | 98 - packages/core/build/css-imports.ts | 44 - packages/core/build/theme-css-artifacts.ts | 165 - packages/core/docs/foundation-api.md | 137 - packages/core/docs/overlay-api.md | 61 - packages/core/docs/release-checklist.md | 25 - packages/core/docs/theme-api.md | 343 -- packages/core/docs/visual-baseline.md | 99 - packages/core/eslint.config.js | 9 - packages/core/package.json | 496 --- packages/core/scripts/check-css-contract.mjs | 127 - packages/core/scripts/check-css-parity.mjs | 218 -- packages/core/scripts/check-form-geometry.mjs | 309 -- packages/core/scripts/smoke-cjs-ssr.mjs | 132 - .../core/scripts/smoke-consumer-auto-css.mjs | 276 -- packages/core/scripts/smoke-css-export.mjs | 255 -- packages/core/scripts/smoke-theme-types.mjs | 182 - .../src/__tests__/mocks/vueforge-icons.ts | 22 - packages/core/src/__tests__/setup.ts | 39 - packages/core/src/async.ts | 75 - .../components/accordion/VfAccordion.spec.ts | 29 - .../src/components/accordion/VfAccordion.vue | 152 - .../core/src/components/accordion/index.ts | 1 - .../core/src/components/alert/VfAlert.vue | 82 - packages/core/src/components/alert/index.ts | 1 - .../core/src/components/avatar/VfAvatar.vue | 44 - packages/core/src/components/avatar/index.ts | 1 - .../core/src/components/badge/VfBadge.vue | 27 - packages/core/src/components/badge/index.ts | 1 - .../components/breadcrumbs/VfBreadcrumbs.vue | 101 - .../core/src/components/breadcrumbs/index.ts | 1 - .../core/src/components/button/VfButton.vue | 58 - packages/core/src/components/button/index.ts | 1 - packages/core/src/components/card/VfCard.vue | 40 - packages/core/src/components/card/index.ts | 1 - .../src/components/checkbox/VfCheckbox.vue | 90 - .../core/src/components/checkbox/index.ts | 1 - .../command-palette/VfCommandPalette.spec.ts | 278 -- .../command-palette/VfCommandPalette.vue | 616 --- .../src/components/command-palette/index.ts | 1 - .../core/src/components/components.spec.ts | 2586 ------------- .../confirm-dialog/VfConfirmDialog.spec.ts | 129 - .../confirm-dialog/VfConfirmDialog.vue | 116 - .../src/components/confirm-dialog/index.ts | 1 - .../VfDataTableColumnChooser.spec.ts | 71 - .../VfDataTableColumnChooser.vue | 113 - .../data-table-column-chooser/index.ts | 1 - .../src/components/data-table/VfDataTable.vue | 1764 --------- .../core/src/components/data-table/index.ts | 1 - .../date-picker/VfDatePicker.spec.ts | 616 --- .../components/date-picker/VfDatePicker.vue | 1390 ------- .../core/src/components/date-picker/index.ts | 1 - .../src/components/dialog/VfDialog.spec.ts | 219 -- .../core/src/components/dialog/VfDialog.vue | 239 -- packages/core/src/components/dialog/index.ts | 1 - .../core/src/components/divider/VfDivider.vue | 31 - packages/core/src/components/divider/index.ts | 1 - .../src/components/drawer/VfDrawer.spec.ts | 341 -- .../core/src/components/drawer/VfDrawer.vue | 294 -- packages/core/src/components/drawer/index.ts | 1 - .../components/dropdown/VfDropdown.spec.ts | 269 -- .../src/components/dropdown/VfDropdown.vue | 280 -- .../core/src/components/dropdown/index.ts | 1 - .../core/src/components/field/VfField.vue | 112 - .../core/src/components/field/VfFieldset.vue | 57 - packages/core/src/components/field/context.ts | 12 - packages/core/src/components/field/index.ts | 2 - .../form-layout/VfFormLayout.spec.ts | 26 - .../components/form-layout/VfFormLayout.vue | 35 - .../core/src/components/form-layout/index.ts | 1 - .../components/group-box/VfGroupBox.spec.ts | 72 - .../src/components/group-box/VfGroupBox.vue | 103 - .../core/src/components/group-box/index.ts | 1 - .../components/icon-button/VfIconButton.vue | 48 - .../core/src/components/icon-button/index.ts | 1 - packages/core/src/components/index.ts | 45 - .../core/src/components/input/VfInput.vue | 264 -- packages/core/src/components/input/index.ts | 1 - .../internal/VfHorizontalScroller.vue | 243 -- packages/core/src/components/link/VfLink.vue | 86 - packages/core/src/components/link/index.ts | 1 - .../src/components/menu-bar/VfMenuBar.spec.ts | 392 -- .../src/components/menu-bar/VfMenuBar.vue | 444 --- .../components/menu-bar/VfMenuBarItemNode.vue | 315 -- .../core/src/components/menu-bar/index.ts | 1 - .../core/src/components/menu/VfMenu.spec.ts | 55 - packages/core/src/components/menu/VfMenu.vue | 15 - .../core/src/components/menu/VfMenuItem.vue | 82 - packages/core/src/components/menu/index.ts | 2 - .../src/components/nav-menu/VfNavMenu.spec.ts | 453 --- .../src/components/nav-menu/VfNavMenu.vue | 208 - .../components/nav-menu/VfNavMenuItemNode.vue | 287 -- .../core/src/components/nav-menu/index.ts | 2 - .../page-header/VfPageHeader.spec.ts | 41 - .../components/page-header/VfPageHeader.vue | 50 - .../core/src/components/page-header/index.ts | 1 - .../core/src/components/panel/VfPanel.vue | 33 - packages/core/src/components/panel/index.ts | 1 - .../src/components/popover/VfPopover.spec.ts | 157 - .../core/src/components/popover/VfPopover.vue | 224 -- packages/core/src/components/popover/index.ts | 1 - .../components/progress-bar/VfProgressBar.vue | 81 - .../core/src/components/progress-bar/index.ts | 1 - .../progress-spinner/VfProgressSpinner.vue | 47 - .../src/components/progress-spinner/index.ts | 1 - .../core/src/components/radio/VfRadio.vue | 82 - packages/core/src/components/radio/index.ts | 1 - .../core/src/components/select/VfSelect.vue | 439 --- packages/core/src/components/select/index.ts | 1 - .../skeleton-gate/VfSkeletonGate.vue | 116 - .../src/components/skeleton-gate/index.ts | 1 - .../src/components/skeleton/VfSkeleton.vue | 35 - .../core/src/components/skeleton/index.ts | 1 - .../src/components/stepper/VfStepper.spec.ts | 112 - .../core/src/components/stepper/VfStepper.vue | 207 - packages/core/src/components/stepper/index.ts | 1 - .../core/src/components/switch/VfSwitch.vue | 109 - packages/core/src/components/switch/index.ts | 1 - .../table-of-contents/VfTableOfContents.vue | 154 - .../src/components/table-of-contents/index.ts | 1 - .../core/src/components/table/VfTable.vue | 60 - packages/core/src/components/table/index.ts | 1 - .../core/src/components/tabs/VfTabs.spec.ts | 291 -- packages/core/src/components/tabs/VfTabs.vue | 351 -- packages/core/src/components/tabs/index.ts | 1 - packages/core/src/components/tag/VfTag.vue | 27 - packages/core/src/components/tag/index.ts | 1 - .../src/components/textarea/VfTextarea.vue | 80 - .../core/src/components/textarea/index.ts | 1 - .../components/theme-switch/VfThemeSwitch.vue | 137 - .../core/src/components/theme-switch/index.ts | 1 - .../src/components/tooltip/VfTooltip.spec.ts | 107 - .../core/src/components/tooltip/VfTooltip.vue | 143 - packages/core/src/components/tooltip/index.ts | 1 - .../core/src/composables/composables.spec.ts | 375 -- packages/core/src/composables/index.ts | 15 - .../core/src/composables/useClickOutside.ts | 44 - .../core/src/composables/useDisclosure.ts | 38 - packages/core/src/composables/useEscapeKey.ts | 78 - packages/core/src/composables/useFloating.ts | 168 - .../core/src/composables/useFocusTrap.spec.ts | 77 - packages/core/src/composables/useFocusTrap.ts | 150 - packages/core/src/composables/useId.ts | 12 - .../src/composables/useTableOfContents.ts | 199 - packages/core/src/composables/useTheme.ts | 17 - packages/core/src/entries/accordion.ts | 3 - packages/core/src/entries/alert.ts | 3 - packages/core/src/entries/avatar.ts | 3 - packages/core/src/entries/badge.ts | 3 - packages/core/src/entries/breadcrumbs.ts | 3 - packages/core/src/entries/button.ts | 3 - packages/core/src/entries/card.ts | 3 - packages/core/src/entries/checkbox.ts | 3 - packages/core/src/entries/command-palette.ts | 3 - packages/core/src/entries/confirm-dialog.ts | 3 - .../src/entries/data-table-column-chooser.ts | 3 - packages/core/src/entries/data-table.ts | 3 - packages/core/src/entries/date-picker.ts | 3 - packages/core/src/entries/dialog.ts | 3 - packages/core/src/entries/divider.ts | 3 - packages/core/src/entries/drawer.ts | 3 - packages/core/src/entries/dropdown.ts | 3 - packages/core/src/entries/field.ts | 3 - packages/core/src/entries/fieldset.ts | 3 - packages/core/src/entries/form-layout.ts | 3 - packages/core/src/entries/group-box.ts | 3 - packages/core/src/entries/icon-button.ts | 3 - packages/core/src/entries/input.ts | 3 - packages/core/src/entries/link.ts | 3 - packages/core/src/entries/menu-bar.ts | 3 - packages/core/src/entries/menu.ts | 3 - packages/core/src/entries/nav-menu.ts | 4 - packages/core/src/entries/page-header.ts | 3 - packages/core/src/entries/panel.ts | 3 - packages/core/src/entries/popover.ts | 3 - packages/core/src/entries/progress-bar.ts | 3 - packages/core/src/entries/progress-spinner.ts | 3 - packages/core/src/entries/radio.ts | 3 - packages/core/src/entries/select.ts | 3 - packages/core/src/entries/skeleton-gate.ts | 3 - packages/core/src/entries/skeleton.ts | 3 - packages/core/src/entries/stepper.ts | 3 - packages/core/src/entries/switch.ts | 3 - .../core/src/entries/table-of-contents.ts | 3 - packages/core/src/entries/table.ts | 3 - packages/core/src/entries/tabs.ts | 3 - packages/core/src/entries/tag.ts | 3 - packages/core/src/entries/textarea.ts | 3 - packages/core/src/entries/theme-switch.ts | 3 - packages/core/src/entries/tooltip.ts | 3 - packages/core/src/foundation/breakpoints.ts | 14 - .../foundation/foundation-contract.spec.ts | 50 - .../core/src/foundation/foundation.spec.ts | 212 - packages/core/src/foundation/index.ts | 9 - packages/core/src/foundation/useBreakpoint.ts | 62 - .../core/src/foundation/useBreakpointValue.ts | 26 - .../core/src/foundation/useBreakpoints.ts | 23 - packages/core/src/foundation/useScrollLock.ts | 110 - packages/core/src/index.ts | 152 - packages/core/src/plugin.ts | 31 - .../src/providers/VfThemeProvider.spec.ts | 430 --- .../core/src/providers/VfThemeProvider.vue | 189 - packages/core/src/providers/themeContext.ts | 3 - packages/core/src/providers/vueForgeConfig.ts | 15 - .../src/styles/component-entry-parity.spec.ts | 142 - .../component-interaction-contract.spec.ts | 305 -- .../styles/component-palette-contract.spec.ts | 463 --- packages/core/src/styles/components.css | 47 - .../components/accessibility-preferences.css | 67 - packages/core/src/styles/components/base.css | 478 --- .../styles/components/horizontal-scroller.css | 99 - .../styles/components/overlay-primitives.css | 9 - .../components/theme-transition-guard.css | 5 - .../core/src/styles/entries/accordion.css | 90 - packages/core/src/styles/entries/alert.css | 97 - packages/core/src/styles/entries/async.css | 2 - packages/core/src/styles/entries/avatar.css | 51 - packages/core/src/styles/entries/badge.css | 58 - .../core/src/styles/entries/breadcrumbs.css | 65 - packages/core/src/styles/entries/button.css | 189 - packages/core/src/styles/entries/card.css | 27 - packages/core/src/styles/entries/checkbox.css | 210 - .../src/styles/entries/command-palette.css | 388 -- .../src/styles/entries/confirm-dialog.css | 14 - .../entries/data-table-column-chooser.css | 17 - .../core/src/styles/entries/data-table.css | 357 -- .../core/src/styles/entries/date-picker.css | 466 --- packages/core/src/styles/entries/dialog.css | 148 - packages/core/src/styles/entries/divider.css | 16 - packages/core/src/styles/entries/drawer.css | 269 -- packages/core/src/styles/entries/dropdown.css | 144 - packages/core/src/styles/entries/field.css | 166 - packages/core/src/styles/entries/fieldset.css | 40 - .../core/src/styles/entries/form-layout.css | 65 - .../core/src/styles/entries/group-box.css | 66 - .../core/src/styles/entries/icon-button.css | 165 - packages/core/src/styles/entries/input.css | 384 -- packages/core/src/styles/entries/link.css | 55 - packages/core/src/styles/entries/menu-bar.css | 330 -- packages/core/src/styles/entries/menu.css | 79 - packages/core/src/styles/entries/nav-menu.css | 557 --- .../core/src/styles/entries/page-header.css | 64 - packages/core/src/styles/entries/panel.css | 23 - packages/core/src/styles/entries/popover.css | 83 - .../core/src/styles/entries/progress-bar.css | 169 - .../src/styles/entries/progress-spinner.css | 79 - packages/core/src/styles/entries/radio.css | 182 - packages/core/src/styles/entries/select.css | 483 --- .../core/src/styles/entries/skeleton-gate.css | 32 - packages/core/src/styles/entries/skeleton.css | 50 - packages/core/src/styles/entries/stepper.css | 304 -- packages/core/src/styles/entries/switch.css | 353 -- .../src/styles/entries/table-of-contents.css | 96 - packages/core/src/styles/entries/table.css | 85 - packages/core/src/styles/entries/tabs.css | 220 -- packages/core/src/styles/entries/tag.css | 50 - packages/core/src/styles/entries/textarea.css | 136 - .../core/src/styles/entries/theme-switch.css | 2 - packages/core/src/styles/entries/tooltip.css | 64 - packages/core/src/styles/foundation.css | 2 - .../core/src/styles/prose-contract.spec.ts | 46 - packages/core/src/styles/styles.css | 1 - .../core/src/theme/color-contrast.spec.ts | 355 -- .../core/src/theme/color-token-schema.spec.ts | 276 -- packages/core/src/theme/color-token-schema.ts | 335 -- .../core/src/theme/default-preset-source.ts | 886 ----- packages/core/src/theme/default-preset.ts | 4 - packages/core/src/theme/index.ts | 10 - packages/core/src/theme/motion.ts | 1 - packages/core/src/theme/public.ts | 10 - .../core/src/theme/theme-contract.spec.ts | 336 -- packages/core/src/theme/theme.spec.ts | 129 - packages/core/src/theme/utils.ts | 125 - packages/core/src/types/components.ts | 175 - packages/core/src/types/theme.ts | 758 ---- .../core/src/types/vueforge-icons-shim.d.ts | 13 - packages/core/src/utils/classes.ts | 3 - packages/core/src/utils/theme.ts | 1 - packages/core/src/vue.d.ts | 8 - packages/core/tsconfig.json | 19 - packages/core/vite.config.ts | 280 -- packages/core/vitest.config.ts | 26 - packages/playground-core/CHANGELOG.md | 77 - packages/playground-core/LICENSE | 21 - packages/playground-core/README.md | 82 - .../__tests__/browserRuntime.test.ts | 356 -- .../playground-core/__tests__/session.test.ts | 152 - .../__tests__/typescriptWorkerClient.test.ts | 72 - packages/playground-core/eslint.config.mjs | 6 - packages/playground-core/package.json | 55 - packages/playground-core/src/events.ts | 20 - packages/playground-core/src/index.ts | 205 - .../src/runtimes/browserRuntime.ts | 507 --- packages/playground-core/src/types.ts | 76 - .../playground-core/src/typescriptWorker.js | 26 - .../src/typescriptWorkerClient.ts | 83 - packages/playground-core/tsconfig.json | 7 - packages/playground-core/vitest.config.ts | 8 - packages/playground-vite-plugin/CHANGELOG.md | 41 - packages/playground-vite-plugin/LICENSE | 21 - packages/playground-vite-plugin/README.md | 75 - .../__tests__/index.test.ts | 113 - .../playground-vite-plugin/eslint.config.mjs | 6 - packages/playground-vite-plugin/package.json | 57 - packages/playground-vite-plugin/src/index.ts | 80 - packages/playground-vite-plugin/tsconfig.json | 7 - packages/playground/CHANGELOG.md | 251 -- packages/playground/LICENSE | 21 - packages/playground/README.md | 90 - packages/playground/eslint.config.mjs | 22 - packages/playground/package.json | 84 - .../scripts/smoke-consumer-auto-css.mjs | 80 - .../playground/scripts/smoke-css-export.mjs | 88 - packages/playground/src/VfPlayground.spec.ts | 1041 ----- packages/playground/src/VfPlayground.vue | 1031 ----- packages/playground/src/critical.css | 32 - packages/playground/src/index.ts | 22 - packages/playground/src/playground.css | 203 - packages/playground/src/props.ts | 44 - packages/playground/src/runtime.ts | 8 - packages/playground/src/shims-vue.d.ts | 5 - .../src/test-shims/vueforge-codeblock.ts | 12 - .../src/test-shims/vueforge-core.ts | 3 - .../test-shims/vueforge-playground-core.ts | 21 - packages/playground/src/tokens.css | 37 - packages/playground/src/types/deps-shim.d.ts | 77 - .../src/types/vueforge-core-async.d.ts | 16 - packages/playground/src/ui.ts | 20 - packages/playground/tsconfig.json | 10 - packages/playground/vite.config.ts | 72 - packages/playground/vitest.config.ts | 34 - packages/theme/CHANGELOG.md | 119 - packages/theme/LICENSE | 21 - packages/theme/README.md | 66 - .../__tests__/breakpoint-queries.spec.ts | 35 - packages/theme/__tests__/helpers.ts | 17 - packages/theme/__tests__/runtime.spec.ts | 422 -- packages/theme/eslint.config.ts | 6 - packages/theme/package.json | 62 - packages/theme/src/breakpoint-queries.ts | 59 - packages/theme/src/breakpoints.ts | 11 - packages/theme/src/color-token-contract.ts | 162 - packages/theme/src/css-vars.ts | 24 - packages/theme/src/index.ts | 33 - packages/theme/src/mode.ts | 12 - packages/theme/src/motion.ts | 14 - packages/theme/src/runtime.ts | 125 - packages/theme/src/types.ts | 179 - packages/theme/tsconfig.json | 12 - packages/theme/tsconfig.test.json | 8 - packages/vueforge-icons/.gitignore | 1 - packages/vueforge-icons/CHANGELOG.md | 236 -- packages/vueforge-icons/LICENSE | 21 - packages/vueforge-icons/README.md | 144 - .../__tests__/render-consumer.mjs | 649 ---- .../__tests__/smoke-consumer.ts | 68 - .../visual-snapshots/duotone-light-16.png | Bin 30633 -> 0 bytes .../visual-snapshots/duotone-light-20.png | Bin 34447 -> 0 bytes .../visual-snapshots/duotone-light-24.png | Bin 39456 -> 0 bytes .../visual-snapshots/duotone-light-32.png | Bin 52830 -> 0 bytes .../visual-snapshots/duotone-regular-16.png | Bin 26599 -> 0 bytes .../visual-snapshots/duotone-regular-20.png | Bin 33353 -> 0 bytes .../visual-snapshots/duotone-regular-24.png | Bin 38479 -> 0 bytes .../visual-snapshots/duotone-regular-32.png | Bin 53049 -> 0 bytes .../visual-snapshots/duotone-solid-16.png | Bin 23975 -> 0 bytes .../visual-snapshots/duotone-solid-20.png | Bin 29743 -> 0 bytes .../visual-snapshots/duotone-solid-24.png | Bin 33877 -> 0 bytes .../visual-snapshots/duotone-solid-32.png | Bin 45285 -> 0 bytes .../visual-snapshots/duotone-thin-16.png | Bin 31615 -> 0 bytes .../visual-snapshots/duotone-thin-20.png | Bin 41800 -> 0 bytes .../visual-snapshots/duotone-thin-24.png | Bin 46180 -> 0 bytes .../visual-snapshots/duotone-thin-32.png | Bin 53483 -> 0 bytes .../__tests__/visual-snapshots/light-16.png | Bin 26847 -> 0 bytes .../__tests__/visual-snapshots/light-20.png | Bin 24275 -> 0 bytes .../__tests__/visual-snapshots/light-24.png | Bin 29126 -> 0 bytes .../__tests__/visual-snapshots/light-32.png | Bin 39330 -> 0 bytes .../__tests__/visual-snapshots/manifest.json | 123 - .../__tests__/visual-snapshots/regular-16.png | Bin 20391 -> 0 bytes .../__tests__/visual-snapshots/regular-20.png | Bin 25683 -> 0 bytes .../__tests__/visual-snapshots/regular-24.png | Bin 28777 -> 0 bytes .../__tests__/visual-snapshots/regular-32.png | Bin 40432 -> 0 bytes .../__tests__/visual-snapshots/solid-16.png | Bin 20845 -> 0 bytes .../__tests__/visual-snapshots/solid-20.png | Bin 25451 -> 0 bytes .../__tests__/visual-snapshots/solid-24.png | Bin 29190 -> 0 bytes .../__tests__/visual-snapshots/solid-32.png | Bin 39725 -> 0 bytes .../__tests__/visual-snapshots/thin-16.png | Bin 26462 -> 0 bytes .../__tests__/visual-snapshots/thin-20.png | Bin 34799 -> 0 bytes .../__tests__/visual-snapshots/thin-24.png | Bin 37954 -> 0 bytes .../__tests__/visual-snapshots/thin-32.png | Bin 38416 -> 0 bytes packages/vueforge-icons/docs/icon-audit.md | 80 - .../docs/icon-design-language.md | 148 - packages/vueforge-icons/docs/icon-style.md | 26 - .../vueforge-icons/docs/migration-batch-02.md | 22 - .../vueforge-icons/docs/migration-batch-03.md | 20 - .../vueforge-icons/docs/migration-batch-04.md | 20 - .../vueforge-icons/docs/migration-batch-05.md | 19 - .../vueforge-icons/docs/migration-batch-06.md | 20 - .../vueforge-icons/docs/migration-batch-07.md | 19 - .../vueforge-icons/docs/migration-batch-08.md | 19 - .../vueforge-icons/docs/migration-batch-09.md | 17 - .../vueforge-icons/docs/migration-batch-10.md | 19 - .../vueforge-icons/docs/migration-batch-11.md | 18 - .../vueforge-icons/docs/migration-batch-12.md | 18 - .../vueforge-icons/docs/migration-batch-13.md | 18 - .../vueforge-icons/docs/migration-batch-14.md | 17 - .../vueforge-icons/docs/migration-batch-15.md | 18 - .../vueforge-icons/docs/migration-batch-16.md | 19 - .../vueforge-icons/docs/migration-batch-17.md | 19 - .../vueforge-icons/docs/migration-batch-18.md | 19 - .../vueforge-icons/docs/migration-batch-19.md | 18 - .../vueforge-icons/docs/migration-batch-20.md | 19 - .../vueforge-icons/docs/migration-batch-21.md | 19 - .../vueforge-icons/docs/migration-batch-22.md | 19 - .../vueforge-icons/docs/migration-batch-23.md | 18 - .../vueforge-icons/docs/migration-batch-24.md | 22 - .../vueforge-icons/docs/migration-batch-25.md | 23 - .../vueforge-icons/docs/migration-batch-26.md | 23 - .../vueforge-icons/docs/migration-batch-27.md | 23 - .../vueforge-icons/docs/migration-batch-28.md | 23 - .../vueforge-icons/docs/migration-batch-29.md | 30 - .../docs/redesign-reference-set.md | 81 - packages/vueforge-icons/docs/visual-audit.md | 445 --- packages/vueforge-icons/eslint.config.mjs | 21 - packages/vueforge-icons/index.html | 12 - packages/vueforge-icons/package.json | 132 - .../vueforge-icons/scripts/audit-bundle.mjs | 63 - .../scripts/audit-icon-centering.mjs | 45 - .../vueforge-icons/scripts/audit-icons.mjs | 825 ---- .../scripts/audit-solid-icons.mjs | 65 - .../vueforge-icons/scripts/create-icon.mjs | 102 - .../vueforge-icons/scripts/generate-icons.mjs | 246 -- .../scripts/snapshot-reference-icons.mjs | 47 - .../scripts/visual-snapshots.mjs | 165 - packages/vueforge-icons/src/App.vue | 388 -- .../src/lib/components/_shared.ts | 23 - .../src/lib/components/activity.vue | 4 - .../src/lib/components/alertCircle.vue | 5 - .../src/lib/components/archive.vue | 4 - .../src/lib/components/arrowDown.vue | 4 - .../src/lib/components/arrowDownLong.vue | 4 - .../src/lib/components/arrowLeft.vue | 4 - .../src/lib/components/arrowLeftLong.vue | 4 - .../src/lib/components/arrowRight.vue | 4 - .../src/lib/components/arrowRightLong.vue | 4 - .../src/lib/components/arrowTurnLeftDown.vue | 4 - .../src/lib/components/arrowTurnRightUp.vue | 4 - .../src/lib/components/arrowTurnUpLeft.vue | 4 - .../src/lib/components/arrowTurnUpRight.vue | 4 - .../src/lib/components/arrowUp.vue | 4 - .../src/lib/components/arrowUpLong.vue | 4 - .../vueforge-icons/src/lib/components/ban.vue | 5 - .../src/lib/components/bars.vue | 4 - .../src/lib/components/bell.vue | 4 - .../src/lib/components/bookmark.vue | 4 - .../src/lib/components/briefcase.vue | 4 - .../src/lib/components/building.vue | 4 - .../src/lib/components/calendar.vue | 4 - .../src/lib/components/caretDown.vue | 4 - .../src/lib/components/caretLeft.vue | 4 - .../src/lib/components/caretRight.vue | 4 - .../src/lib/components/caretUp.vue | 4 - .../src/lib/components/chartBar.vue | 4 - .../src/lib/components/check.vue | 4 - .../src/lib/components/checkCircle.vue | 5 - .../src/lib/components/chevronDown.vue | 4 - .../src/lib/components/chevronLeft.vue | 4 - .../src/lib/components/chevronRight.vue | 4 - .../src/lib/components/chevronUp.vue | 4 - .../src/lib/components/circleHalf.vue | 5 - .../src/lib/components/circleNotch.vue | 5 - .../src/lib/components/clipboard.vue | 5 - .../src/lib/components/clock.vue | 5 - .../src/lib/components/cloud.vue | 4 - .../src/lib/components/code.vue | 4 - .../src/lib/components/collapse.vue | 4 - .../src/lib/components/columns.vue | 4 - .../src/lib/components/copy.vue | 5 - .../vueforge-icons/src/lib/components/cpu.vue | 4 - .../src/lib/components/creditCard.vue | 4 - .../src/lib/components/database.vue | 4 - .../src/lib/components/download.vue | 4 - .../src/lib/components/ellipsis.vue | 4 - .../src/lib/components/expand.vue | 4 - .../src/lib/components/externalLink.vue | 4 - .../vueforge-icons/src/lib/components/eye.vue | 5 - .../src/lib/components/eyeSlash.vue | 5 - .../src/lib/components/facebook.vue | 14 - .../src/lib/components/file.vue | 4 - .../src/lib/components/fileText.vue | 4 - .../src/lib/components/filter.vue | 4 - .../src/lib/components/folder.vue | 4 - .../src/lib/components/folderOpen.vue | 4 - .../src/lib/components/funnelX.vue | 4 - .../src/lib/components/gear.vue | 4 - .../src/lib/components/github.vue | 14 - .../src/lib/components/globe.vue | 4 - .../src/lib/components/grid.vue | 4 - .../src/lib/components/hardDrive.vue | 4 - .../src/lib/components/heart.vue | 4 - .../src/lib/components/history.vue | 5 - .../src/lib/components/house.vue | 4 - .../src/lib/components/icon.vue | 180 - .../src/lib/components/inbox.vue | 4 - .../src/lib/components/info.vue | 5 - .../src/lib/components/infoCircle.vue | 4 - .../src/lib/components/instagram.vue | 14 - .../vueforge-icons/src/lib/components/key.vue | 4 - .../src/lib/components/layers.vue | 4 - .../src/lib/components/link.vue | 4 - .../src/lib/components/lock.vue | 4 - .../src/lib/components/logIn.vue | 4 - .../src/lib/components/logOut.vue | 4 - .../src/lib/components/magnifyingGlass.vue | 4 - .../src/lib/components/mail.vue | 4 - .../src/lib/components/message.vue | 4 - .../src/lib/components/minus.vue | 4 - .../src/lib/components/moon.vue | 5 - .../src/lib/components/pencil.vue | 4 - .../src/lib/components/phone.vue | 4 - .../src/lib/components/plug.vue | 4 - .../src/lib/components/plus.vue | 4 - .../src/lib/components/question.vue | 5 - .../src/lib/components/questionCircle.vue | 5 - .../src/lib/components/receipt.vue | 4 - .../src/lib/components/refresh.vue | 5 - .../src/lib/components/rotateRight.vue | 5 - .../src/lib/components/send.vue | 4 - .../src/lib/components/server.vue | 4 - .../src/lib/components/share.vue | 4 - .../src/lib/components/shield.vue | 4 - .../src/lib/components/sliders.vue | 4 - .../src/lib/components/sort.vue | 4 - .../src/lib/components/sparkles.vue | 4 - .../src/lib/components/star.vue | 4 - .../vueforge-icons/src/lib/components/sun.vue | 5 - .../src/lib/components/telegram.vue | 14 - .../src/lib/components/terminal.vue | 4 - .../src/lib/components/trash.vue | 4 - .../src/lib/components/unlock.vue | 4 - .../src/lib/components/upload.vue | 4 - .../src/lib/components/user.vue | 4 - .../src/lib/components/userCheck.vue | 4 - .../src/lib/components/userMinus.vue | 4 - .../src/lib/components/userPlus.vue | 4 - .../src/lib/components/users.vue | 4 - .../vueforge-icons/src/lib/components/vk.vue | 14 - .../src/lib/components/wallet.vue | 4 - .../src/lib/components/warning.vue | 4 - .../vueforge-icons/src/lib/components/x.vue | 14 - .../src/lib/components/xCircle.vue | 5 - .../src/lib/components/xmark.vue | 4 - .../src/lib/components/youtube.vue | 14 - .../vueforge-icons/src/lib/iconAudit.json | 2519 ------------ .../vueforge-icons/src/lib/iconCatalog.json | 739 ---- packages/vueforge-icons/src/lib/iconCore.json | 56 - .../vueforge-icons/src/lib/iconFamilies.ts | 3 - packages/vueforge-icons/src/lib/iconMeta.json | 150 - packages/vueforge-icons/src/lib/iconMeta.ts | 51 - .../src/lib/iconMigrationBatch02.json | 1 - .../src/lib/iconMigrationBatch02Before.json | 10 - .../src/lib/iconMigrationBatch03.json | 1 - .../src/lib/iconMigrationBatch03Before.json | 9 - .../src/lib/iconMigrationBatch04.json | 1 - .../src/lib/iconMigrationBatch04Before.json | 9 - .../src/lib/iconMigrationBatch05.json | 1 - .../src/lib/iconMigrationBatch05Before.json | 4 - .../src/lib/iconMigrationBatch06.json | 1 - .../src/lib/iconMigrationBatch06Before.json | 5 - .../src/lib/iconMigrationBatch07.json | 1 - .../src/lib/iconMigrationBatch07Before.json | 4 - .../src/lib/iconMigrationBatch08.json | 1 - .../src/lib/iconMigrationBatch08Before.json | 5 - .../src/lib/iconMigrationBatch09.json | 1 - .../src/lib/iconMigrationBatch09Before.json | 4 - .../src/lib/iconMigrationBatch10.json | 1 - .../src/lib/iconMigrationBatch10Before.json | 4 - .../src/lib/iconMigrationBatch11.json | 1 - .../src/lib/iconMigrationBatch11Before.json | 6 - .../src/lib/iconMigrationBatch12.json | 1 - .../src/lib/iconMigrationBatch12Before.json | 6 - .../src/lib/iconMigrationBatch13.json | 1 - .../src/lib/iconMigrationBatch13Before.json | 4 - .../src/lib/iconMigrationBatch14.json | 1 - .../src/lib/iconMigrationBatch14Before.json | 4 - .../src/lib/iconMigrationBatch15.json | 1 - .../src/lib/iconMigrationBatch15Before.json | 4 - .../src/lib/iconMigrationBatch16.json | 1 - .../src/lib/iconMigrationBatch16Before.json | 4 - .../src/lib/iconMigrationBatch17.json | 1 - .../src/lib/iconMigrationBatch17Before.json | 5 - .../src/lib/iconMigrationBatch18.json | 1 - .../src/lib/iconMigrationBatch18Before.json | 4 - .../src/lib/iconMigrationBatch19.json | 1 - .../src/lib/iconMigrationBatch19Before.json | 4 - .../src/lib/iconMigrationBatch20.json | 1 - .../src/lib/iconMigrationBatch20Before.json | 4 - .../src/lib/iconMigrationBatch21.json | 1 - .../src/lib/iconMigrationBatch21Before.json | 4 - .../src/lib/iconMigrationBatch22.json | 1 - .../src/lib/iconMigrationBatch22Before.json | 4 - .../src/lib/iconMigrationBatch23.json | 1 - .../src/lib/iconMigrationBatch23Before.json | 5 - .../src/lib/iconMigrationBatch24.json | 1 - .../src/lib/iconMigrationBatch24Before.json | 4 - .../src/lib/iconMigrationBatch25.json | 1 - .../src/lib/iconMigrationBatch25Before.json | 5 - .../src/lib/iconMigrationBatch26.json | 1 - .../src/lib/iconMigrationBatch26Before.json | 4 - .../src/lib/iconMigrationBatch27.json | 1 - .../src/lib/iconMigrationBatch27Before.json | 4 - .../src/lib/iconMigrationBatch28.json | 1 - .../src/lib/iconMigrationBatch28Before.json | 4 - .../src/lib/iconMigrationBatch29.json | 1 - .../src/lib/iconMigrationBatch29Before.json | 9 - .../src/lib/iconOpticalOffsets.json | 15 - .../src/lib/iconReferenceBefore.json | 32 - .../src/lib/iconReferenceSet.json | 32 - .../vueforge-icons/src/lib/iconShowcase.json | 582 --- .../vueforge-icons/src/lib/iconVariants.ts | 13 - packages/vueforge-icons/src/lib/icons.json | 120 - packages/vueforge-icons/src/lib/index.ts | 8 - .../src/lib/internal/outlineIcon.ts | 2135 ----------- .../src/lib/internal/solidIconData.json | 438 --- packages/vueforge-icons/src/main.ts | 10 - packages/vueforge-icons/tsconfig.json | 18 - packages/vueforge-icons/tsconfig.smoke.json | 9 - packages/vueforge-icons/vite.config.mts | 105 - .../vueforge-icons/vite.showcase.config.mts | 20 - packages/vueforge-layouts/CHANGELOG.md | 448 --- packages/vueforge-layouts/LICENSE | 21 - packages/vueforge-layouts/README.md | 85 - .../__tests__/layouts.spec.ts | 1545 -------- packages/vueforge-layouts/__tests__/setup.ts | 3 - .../build/layout-css-artifacts.ts | 108 - packages/vueforge-layouts/env.d.ts | 8 - packages/vueforge-layouts/eslint.config.js | 22 - packages/vueforge-layouts/package.json | 242 -- .../scripts/check-css-contract.mjs | 113 - .../scripts/smoke-cjs-ssr.mjs | 143 - .../scripts/smoke-css-export.mjs | 282 -- .../src/composables/useCssVarBreakpoints.ts | 119 - .../composables/useObservedElementHeight.ts | 43 - packages/vueforge-layouts/src/index.ts | 59 - packages/vueforge-layouts/src/plugin.ts | 300 -- .../src/primitives/VfContainer.vue | 38 - .../src/primitives/VfGrid.vue | 19 - .../src/primitives/VfInline.vue | 28 - .../src/primitives/VfSection.vue | 28 - .../src/primitives/VfStack.vue | 19 - .../src/shell/VfAdminLayout.vue | 278 -- .../src/shell/VfAdminShell.vue | 69 - .../vueforge-layouts/src/shell/VfAppShell.vue | 236 -- .../src/shell/VfAsideArea.vue | 30 - .../src/shell/VfAuthLayout.vue | 73 - .../src/shell/VfContentArea.vue | 28 - .../src/shell/VfDocumentLayout.vue | 151 - .../src/shell/VfErrorLayout.vue | 69 - .../src/shell/VfFooterArea.vue | 19 - .../src/shell/VfHeaderArea.vue | 28 - .../src/shell/VfSetupLayout.vue | 222 -- .../src/shell/VfSidebarArea.vue | 30 - .../src/shell/admin-layout.types.ts | 39 - .../src/style-entries/admin-layout.css | 286 -- .../src/style-entries/admin-shell.css | 162 - .../src/style-entries/app-shell.css | 362 -- .../src/style-entries/aside-area.css | 16 - .../src/style-entries/auth-layout.css | 95 - .../src/style-entries/container.css | 27 - .../src/style-entries/content-area.css | 46 - .../src/style-entries/document-layout.css | 286 -- .../src/style-entries/error-layout.css | 74 - .../src/style-entries/footer-area.css | 7 - .../src/style-entries/grid.css | 5 - .../src/style-entries/header-area.css | 18 - .../src/style-entries/inline.css | 11 - .../src/style-entries/section.css | 10 - .../src/style-entries/setup-layout.css | 293 -- .../src/style-entries/sidebar-area.css | 17 - .../src/style-entries/stack.css | 7 - .../vueforge-layouts/src/style-parts/base.css | 5 - .../src/style-parts/primitives.css | 64 - .../src/style-parts/shell.css | 1104 ------ .../src/style-parts/utilities.css | 6 - packages/vueforge-layouts/src/styles.css | 9 - .../src/theme/breakpoint-registry.ts | 20 - .../src/theme/default-preset.ts | 138 - packages/vueforge-layouts/src/theme/public.ts | 21 - packages/vueforge-layouts/src/theme/types.ts | 186 - packages/vueforge-layouts/src/theme/utils.ts | 109 - .../vueforge-layouts/src/types/deps-shim.d.ts | 60 - .../vueforge-layouts/src/utils/classes.ts | 3 - packages/vueforge-layouts/tsconfig.json | 19 - packages/vueforge-layouts/vite.config.ts | 285 -- scripts/check-vueforge-migration.mjs | 135 - scripts/check-vueforge-migration.test.mjs | 80 - .../check-code-monster-ui-visual-fixtures.mjs | 10 +- scripts/ci/check-consumer-tree-shaking.mjs | 45 +- scripts/ci/check-documentation-contracts.mjs | 410 +- scripts/ci/check-frozen-showcase.mjs | 56 - scripts/ci/check-package-contracts.mjs | 507 +-- scripts/ci/check-packed-consumer.mjs | 935 ----- scripts/ci/check-verify-coverage.mjs | 3 - scripts/ci/frozen-showcase.mjs | 48 - scripts/ci/frozen-showcase.test.mjs | 43 - scripts/ci/run-packed-consumer-managers.mjs | 1 - scripts/ci/validate-docs-import-ownership.mjs | 125 - scripts/migrate-to-codemonster-ui.mjs | 169 - scripts/migrate-to-codemonster-ui.test.mjs | 123 - scripts/migrate-to-v2.mjs | 362 -- scripts/migrate-to-v2.test.mjs | 98 - scripts/migration/codemonster-ui-coverage.mjs | 498 --- .../codemonster-ui-coverage.test.mjs | 431 --- .../playground-design-system-exit.test.mjs | 259 -- scripts/migration/vueforge-baseline.mjs | 95 - scripts/migration/vueforge-baseline.test.mjs | 45 - scripts/migration/vueforge-mapping.mjs | 106 - scripts/migration/vueforge-mapping.test.mjs | 36 - scripts/visual/baseline-manifest.mjs | 57 - scripts/visual/baseline-manifest.test.mjs | 51 - .../visual/capture-cross-platform-cases.mjs | 43 +- scripts/visual/capture-showcase.mjs | 343 -- scripts/visual/check-baseline-manifests.mjs | 27 - scripts/visual/code-monster-ui-fixtures.mjs | 23 +- .../visual/code-monster-ui-fixtures.test.mjs | 8 +- .../visual/cross-platform-browser.test.mjs | 6 +- .../fixture.css | 24 - .../index.html | 12 - .../cross-platform-reference-fixture/main.ts | 75 - scripts/visual/phase-2-color-smoke.mjs | 739 ---- scripts/visual/reference-baseline.test.mjs | 81 - .../visual/serve-cross-platform-reference.mjs | 70 - scripts/visual/showcase-state-cases.mjs | 89 - scripts/visual/showcase-state-cases.test.mjs | 76 - visual-baselines/README.md | 55 +- .../vueforge-showcase-states/manifest.json | 749 ---- .../state--active--dark--desktop.png | Bin 2465 -> 0 bytes .../state--active--dark--mobile.png | Bin 2445 -> 0 bytes .../state--active--light--desktop.png | Bin 2427 -> 0 bytes .../state--active--light--mobile.png | Bin 2398 -> 0 bytes .../state--closed--dark--desktop.png | Bin 18274 -> 0 bytes .../state--closed--dark--mobile.png | Bin 15270 -> 0 bytes .../state--closed--light--desktop.png | Bin 18214 -> 0 bytes .../state--closed--light--mobile.png | Bin 15189 -> 0 bytes .../state--disabled--dark--desktop.png | Bin 2113 -> 0 bytes .../state--disabled--dark--mobile.png | Bin 2258 -> 0 bytes .../state--disabled--light--desktop.png | Bin 2106 -> 0 bytes .../state--disabled--light--mobile.png | Bin 2242 -> 0 bytes .../state--focus-visible--dark--desktop.png | Bin 3006 -> 0 bytes .../state--focus-visible--dark--mobile.png | Bin 3012 -> 0 bytes .../state--focus-visible--light--desktop.png | Bin 2722 -> 0 bytes .../state--focus-visible--light--mobile.png | Bin 2718 -> 0 bytes .../state--hover--dark--desktop.png | Bin 2453 -> 0 bytes .../state--hover--dark--mobile.png | Bin 2429 -> 0 bytes .../state--hover--light--desktop.png | Bin 2425 -> 0 bytes .../state--hover--light--mobile.png | Bin 2399 -> 0 bytes .../state--indeterminate--dark--desktop.png | Bin 1599 -> 0 bytes .../state--indeterminate--dark--mobile.png | Bin 2422 -> 0 bytes .../state--indeterminate--light--desktop.png | Bin 1618 -> 0 bytes .../state--indeterminate--light--mobile.png | Bin 2448 -> 0 bytes .../state--invalid--dark--desktop.png | Bin 4249 -> 0 bytes .../state--invalid--dark--mobile.png | Bin 3872 -> 0 bytes .../state--invalid--light--desktop.png | Bin 4210 -> 0 bytes .../state--invalid--light--mobile.png | Bin 3817 -> 0 bytes .../state--loading--dark--desktop.png | Bin 2338 -> 0 bytes .../state--loading--dark--mobile.png | Bin 2308 -> 0 bytes .../state--loading--light--desktop.png | Bin 2393 -> 0 bytes .../state--loading--light--mobile.png | Bin 2355 -> 0 bytes .../state--open--dark--desktop.png | Bin 28346 -> 0 bytes .../state--open--dark--mobile.png | Bin 23612 -> 0 bytes .../state--open--light--desktop.png | Bin 28250 -> 0 bytes .../state--open--light--mobile.png | Bin 23494 -> 0 bytes .../state--reduced-motion--dark--desktop.png | Bin 2715 -> 0 bytes .../state--reduced-motion--dark--mobile.png | Bin 1819 -> 0 bytes .../state--reduced-motion--light--desktop.png | Bin 2701 -> 0 bytes .../state--reduced-motion--light--mobile.png | Bin 1819 -> 0 bytes .../state--selected--dark--desktop.png | Bin 2644 -> 0 bytes .../state--selected--dark--mobile.png | Bin 2552 -> 0 bytes .../state--selected--light--desktop.png | Bin 2616 -> 0 bytes .../state--selected--light--mobile.png | Bin 2537 -> 0 bytes .../codeblock--dark--desktop--01.png | Bin 168311 -> 0 bytes .../codeblock--dark--desktop--02.png | Bin 75878 -> 0 bytes .../codeblock--dark--desktop--03.png | Bin 78282 -> 0 bytes .../codeblock--dark--desktop--04.png | Bin 57861 -> 0 bytes .../codeblock--dark--mobile--01.png | Bin 56463 -> 0 bytes .../codeblock--dark--mobile--02.png | Bin 54023 -> 0 bytes .../codeblock--dark--mobile--03.png | Bin 51868 -> 0 bytes .../codeblock--dark--mobile--04.png | Bin 50075 -> 0 bytes .../codeblock--dark--mobile--05.png | Bin 46236 -> 0 bytes .../codeblock--dark--mobile--06.png | Bin 40019 -> 0 bytes .../codeblock--light--desktop--01.png | Bin 169373 -> 0 bytes .../codeblock--light--desktop--02.png | Bin 76182 -> 0 bytes .../codeblock--light--desktop--03.png | Bin 79052 -> 0 bytes .../codeblock--light--desktop--04.png | Bin 58403 -> 0 bytes .../codeblock--light--mobile--01.png | Bin 57769 -> 0 bytes .../codeblock--light--mobile--02.png | Bin 54497 -> 0 bytes .../codeblock--light--mobile--03.png | Bin 51949 -> 0 bytes .../codeblock--light--mobile--04.png | Bin 50265 -> 0 bytes .../codeblock--light--mobile--05.png | Bin 46677 -> 0 bytes .../codeblock--light--mobile--06.png | Bin 40152 -> 0 bytes .../core--dark--desktop--01.png | Bin 132379 -> 0 bytes .../core--dark--desktop--02.png | Bin 101062 -> 0 bytes .../core--dark--desktop--03.png | Bin 90983 -> 0 bytes .../core--dark--desktop--04.png | Bin 86018 -> 0 bytes .../core--dark--desktop--05.png | Bin 86589 -> 0 bytes .../core--dark--desktop--06.png | Bin 107257 -> 0 bytes .../core--dark--desktop--07.png | Bin 103298 -> 0 bytes .../core--dark--desktop--08.png | Bin 94780 -> 0 bytes .../core--dark--desktop--09.png | Bin 95528 -> 0 bytes .../core--dark--desktop--10.png | Bin 95842 -> 0 bytes .../core--dark--desktop--11.png | Bin 88401 -> 0 bytes .../core--dark--desktop--12.png | Bin 99178 -> 0 bytes .../core--dark--desktop--13.png | Bin 94784 -> 0 bytes .../core--dark--desktop--14.png | Bin 80234 -> 0 bytes .../core--dark--desktop--15.png | Bin 120266 -> 0 bytes .../core--dark--desktop--16.png | Bin 64986 -> 0 bytes .../core--dark--desktop--17.png | Bin 71268 -> 0 bytes .../core--dark--desktop--18.png | Bin 90587 -> 0 bytes .../core--dark--desktop--19.png | Bin 113290 -> 0 bytes .../core--dark--desktop--20.png | Bin 80032 -> 0 bytes .../core--dark--desktop--21.png | Bin 83124 -> 0 bytes .../core--dark--desktop--22.png | Bin 94885 -> 0 bytes .../core--dark--desktop--23.png | Bin 192735 -> 0 bytes .../core--dark--desktop--24.png | Bin 123867 -> 0 bytes .../core--dark--desktop--25.png | Bin 110369 -> 0 bytes .../core--dark--desktop--26.png | Bin 84089 -> 0 bytes .../core--dark--desktop--27.png | Bin 90248 -> 0 bytes .../core--dark--mobile--01.png | Bin 69560 -> 0 bytes .../core--dark--mobile--02.png | Bin 51566 -> 0 bytes .../core--dark--mobile--03.png | Bin 72555 -> 0 bytes .../core--dark--mobile--04.png | Bin 81254 -> 0 bytes .../core--dark--mobile--05.png | Bin 83823 -> 0 bytes .../core--dark--mobile--06.png | Bin 74947 -> 0 bytes .../core--dark--mobile--07.png | Bin 76467 -> 0 bytes .../core--dark--mobile--08.png | Bin 66036 -> 0 bytes .../core--dark--mobile--09.png | Bin 53999 -> 0 bytes .../core--dark--mobile--10.png | Bin 58496 -> 0 bytes .../core--dark--mobile--11.png | Bin 57324 -> 0 bytes .../core--dark--mobile--12.png | Bin 63125 -> 0 bytes .../core--dark--mobile--13.png | Bin 37852 -> 0 bytes .../core--dark--mobile--14.png | Bin 47159 -> 0 bytes .../core--dark--mobile--15.png | Bin 56129 -> 0 bytes .../core--dark--mobile--16.png | Bin 56651 -> 0 bytes .../core--dark--mobile--17.png | Bin 57145 -> 0 bytes .../core--dark--mobile--18.png | Bin 52394 -> 0 bytes .../core--dark--mobile--19.png | Bin 52090 -> 0 bytes .../core--dark--mobile--20.png | Bin 42016 -> 0 bytes .../core--dark--mobile--21.png | Bin 51541 -> 0 bytes .../core--dark--mobile--22.png | Bin 60190 -> 0 bytes .../core--dark--mobile--23.png | Bin 66315 -> 0 bytes .../core--dark--mobile--24.png | Bin 57472 -> 0 bytes .../core--dark--mobile--25.png | Bin 50819 -> 0 bytes .../core--dark--mobile--26.png | Bin 55668 -> 0 bytes .../core--dark--mobile--27.png | Bin 62649 -> 0 bytes .../core--dark--mobile--28.png | Bin 50126 -> 0 bytes .../core--dark--mobile--29.png | Bin 52833 -> 0 bytes .../core--dark--mobile--30.png | Bin 40761 -> 0 bytes .../core--dark--mobile--31.png | Bin 39392 -> 0 bytes .../core--dark--mobile--32.png | Bin 40721 -> 0 bytes .../core--dark--mobile--33.png | Bin 42149 -> 0 bytes .../core--dark--mobile--34.png | Bin 49382 -> 0 bytes .../core--dark--mobile--35.png | Bin 43410 -> 0 bytes .../core--dark--mobile--36.png | Bin 40569 -> 0 bytes .../core--dark--mobile--37.png | Bin 50552 -> 0 bytes .../core--dark--mobile--38.png | Bin 58697 -> 0 bytes .../core--dark--mobile--39.png | Bin 75582 -> 0 bytes .../core--dark--mobile--40.png | Bin 77596 -> 0 bytes .../core--dark--mobile--41.png | Bin 78356 -> 0 bytes .../core--dark--mobile--42.png | Bin 78842 -> 0 bytes .../core--dark--mobile--43.png | Bin 60454 -> 0 bytes .../core--dark--mobile--44.png | Bin 48651 -> 0 bytes .../core--dark--mobile--45.png | Bin 64507 -> 0 bytes .../core--dark--mobile--46.png | Bin 63278 -> 0 bytes .../core--light--desktop--01.png | Bin 131675 -> 0 bytes .../core--light--desktop--02.png | Bin 100610 -> 0 bytes .../core--light--desktop--03.png | Bin 90386 -> 0 bytes .../core--light--desktop--04.png | Bin 85596 -> 0 bytes .../core--light--desktop--05.png | Bin 85893 -> 0 bytes .../core--light--desktop--06.png | Bin 107077 -> 0 bytes .../core--light--desktop--07.png | Bin 104153 -> 0 bytes .../core--light--desktop--08.png | Bin 93907 -> 0 bytes .../core--light--desktop--09.png | Bin 94384 -> 0 bytes .../core--light--desktop--10.png | Bin 94956 -> 0 bytes .../core--light--desktop--11.png | Bin 88041 -> 0 bytes .../core--light--desktop--12.png | Bin 97568 -> 0 bytes .../core--light--desktop--13.png | Bin 94840 -> 0 bytes .../core--light--desktop--14.png | Bin 79805 -> 0 bytes .../core--light--desktop--15.png | Bin 121284 -> 0 bytes .../core--light--desktop--16.png | Bin 65342 -> 0 bytes .../core--light--desktop--17.png | Bin 71399 -> 0 bytes .../core--light--desktop--18.png | Bin 91014 -> 0 bytes .../core--light--desktop--19.png | Bin 112781 -> 0 bytes .../core--light--desktop--20.png | Bin 80275 -> 0 bytes .../core--light--desktop--21.png | Bin 83472 -> 0 bytes .../core--light--desktop--22.png | Bin 94321 -> 0 bytes .../core--light--desktop--23.png | Bin 190204 -> 0 bytes .../core--light--desktop--24.png | Bin 123522 -> 0 bytes .../core--light--desktop--25.png | Bin 110107 -> 0 bytes .../core--light--desktop--26.png | Bin 83942 -> 0 bytes .../core--light--desktop--27.png | Bin 90133 -> 0 bytes .../core--light--mobile--01.png | Bin 69181 -> 0 bytes .../core--light--mobile--02.png | Bin 50673 -> 0 bytes .../core--light--mobile--03.png | Bin 70943 -> 0 bytes .../core--light--mobile--04.png | Bin 80542 -> 0 bytes .../core--light--mobile--05.png | Bin 82384 -> 0 bytes .../core--light--mobile--06.png | Bin 73759 -> 0 bytes .../core--light--mobile--07.png | Bin 75336 -> 0 bytes .../core--light--mobile--08.png | Bin 65786 -> 0 bytes .../core--light--mobile--09.png | Bin 54501 -> 0 bytes .../core--light--mobile--10.png | Bin 58517 -> 0 bytes .../core--light--mobile--11.png | Bin 57002 -> 0 bytes .../core--light--mobile--12.png | Bin 62117 -> 0 bytes .../core--light--mobile--13.png | Bin 37620 -> 0 bytes .../core--light--mobile--14.png | Bin 46617 -> 0 bytes .../core--light--mobile--15.png | Bin 55714 -> 0 bytes .../core--light--mobile--16.png | Bin 56271 -> 0 bytes .../core--light--mobile--17.png | Bin 57175 -> 0 bytes .../core--light--mobile--18.png | Bin 52254 -> 0 bytes .../core--light--mobile--19.png | Bin 51636 -> 0 bytes .../core--light--mobile--20.png | Bin 41854 -> 0 bytes .../core--light--mobile--21.png | Bin 50971 -> 0 bytes .../core--light--mobile--22.png | Bin 60545 -> 0 bytes .../core--light--mobile--23.png | Bin 66666 -> 0 bytes .../core--light--mobile--24.png | Bin 57465 -> 0 bytes .../core--light--mobile--25.png | Bin 50168 -> 0 bytes .../core--light--mobile--26.png | Bin 55491 -> 0 bytes .../core--light--mobile--27.png | Bin 62308 -> 0 bytes .../core--light--mobile--28.png | Bin 50459 -> 0 bytes .../core--light--mobile--29.png | Bin 52590 -> 0 bytes .../core--light--mobile--30.png | Bin 40759 -> 0 bytes .../core--light--mobile--31.png | Bin 39226 -> 0 bytes .../core--light--mobile--32.png | Bin 40610 -> 0 bytes .../core--light--mobile--33.png | Bin 42244 -> 0 bytes .../core--light--mobile--34.png | Bin 48858 -> 0 bytes .../core--light--mobile--35.png | Bin 43554 -> 0 bytes .../core--light--mobile--36.png | Bin 40801 -> 0 bytes .../core--light--mobile--37.png | Bin 49946 -> 0 bytes .../core--light--mobile--38.png | Bin 58173 -> 0 bytes .../core--light--mobile--39.png | Bin 74075 -> 0 bytes .../core--light--mobile--40.png | Bin 76133 -> 0 bytes .../core--light--mobile--41.png | Bin 77633 -> 0 bytes .../core--light--mobile--42.png | Bin 77373 -> 0 bytes .../core--light--mobile--43.png | Bin 59914 -> 0 bytes .../core--light--mobile--44.png | Bin 48307 -> 0 bytes .../core--light--mobile--45.png | Bin 63872 -> 0 bytes .../core--light--mobile--46.png | Bin 62975 -> 0 bytes .../icons--dark--desktop--01.png | Bin 78031 -> 0 bytes .../icons--dark--desktop--02.png | Bin 66433 -> 0 bytes .../icons--dark--desktop--03.png | Bin 65320 -> 0 bytes .../icons--dark--desktop--04.png | Bin 70999 -> 0 bytes .../icons--dark--desktop--05.png | Bin 67802 -> 0 bytes .../icons--dark--desktop--06.png | Bin 79601 -> 0 bytes .../icons--dark--desktop--07.png | Bin 73985 -> 0 bytes .../icons--dark--desktop--08.png | Bin 85519 -> 0 bytes .../icons--dark--desktop--09.png | Bin 83222 -> 0 bytes .../icons--dark--desktop--10.png | Bin 89579 -> 0 bytes .../icons--dark--mobile--01.png | Bin 61870 -> 0 bytes .../icons--dark--mobile--02.png | Bin 56273 -> 0 bytes .../icons--dark--mobile--03.png | Bin 54551 -> 0 bytes .../icons--dark--mobile--04.png | Bin 53394 -> 0 bytes .../icons--dark--mobile--05.png | Bin 55244 -> 0 bytes .../icons--dark--mobile--06.png | Bin 59262 -> 0 bytes .../icons--dark--mobile--07.png | Bin 56813 -> 0 bytes .../icons--dark--mobile--08.png | Bin 62712 -> 0 bytes .../icons--dark--mobile--09.png | Bin 58918 -> 0 bytes .../icons--dark--mobile--10.png | Bin 41100 -> 0 bytes .../icons--light--desktop--01.png | Bin 77970 -> 0 bytes .../icons--light--desktop--02.png | Bin 65983 -> 0 bytes .../icons--light--desktop--03.png | Bin 65246 -> 0 bytes .../icons--light--desktop--04.png | Bin 71146 -> 0 bytes .../icons--light--desktop--05.png | Bin 67514 -> 0 bytes .../icons--light--desktop--06.png | Bin 78906 -> 0 bytes .../icons--light--desktop--07.png | Bin 73372 -> 0 bytes .../icons--light--desktop--08.png | Bin 84642 -> 0 bytes .../icons--light--desktop--09.png | Bin 81869 -> 0 bytes .../icons--light--desktop--10.png | Bin 88405 -> 0 bytes .../icons--light--mobile--01.png | Bin 61533 -> 0 bytes .../icons--light--mobile--02.png | Bin 55481 -> 0 bytes .../icons--light--mobile--03.png | Bin 53902 -> 0 bytes .../icons--light--mobile--04.png | Bin 53106 -> 0 bytes .../icons--light--mobile--05.png | Bin 54657 -> 0 bytes .../icons--light--mobile--06.png | Bin 58452 -> 0 bytes .../icons--light--mobile--07.png | Bin 56226 -> 0 bytes .../icons--light--mobile--08.png | Bin 61637 -> 0 bytes .../icons--light--mobile--09.png | Bin 57711 -> 0 bytes .../icons--light--mobile--10.png | Bin 40779 -> 0 bytes .../layouts--dark--desktop--01.png | Bin 78356 -> 0 bytes .../layouts--dark--desktop--02.png | Bin 68568 -> 0 bytes .../layouts--dark--desktop--03.png | Bin 56032 -> 0 bytes .../layouts--dark--desktop--04.png | Bin 58899 -> 0 bytes .../layouts--dark--desktop--05.png | Bin 79310 -> 0 bytes .../layouts--dark--desktop--06.png | Bin 199801 -> 0 bytes .../layouts--dark--desktop--07.png | Bin 116645 -> 0 bytes .../layouts--dark--desktop--08.png | Bin 74118 -> 0 bytes .../layouts--dark--desktop--09.png | Bin 100836 -> 0 bytes .../layouts--dark--desktop--10.png | Bin 203823 -> 0 bytes .../layouts--dark--desktop--11.png | Bin 180052 -> 0 bytes .../layouts--dark--mobile--01.png | Bin 52148 -> 0 bytes .../layouts--dark--mobile--02.png | Bin 55747 -> 0 bytes .../layouts--dark--mobile--03.png | Bin 45584 -> 0 bytes .../layouts--dark--mobile--04.png | Bin 45197 -> 0 bytes .../layouts--dark--mobile--05.png | Bin 53705 -> 0 bytes .../layouts--dark--mobile--06.png | Bin 50868 -> 0 bytes .../layouts--dark--mobile--07.png | Bin 81566 -> 0 bytes .../layouts--dark--mobile--08.png | Bin 78159 -> 0 bytes .../layouts--light--desktop--01.png | Bin 78211 -> 0 bytes .../layouts--light--desktop--02.png | Bin 68180 -> 0 bytes .../layouts--light--desktop--03.png | Bin 56756 -> 0 bytes .../layouts--light--desktop--04.png | Bin 59426 -> 0 bytes .../layouts--light--desktop--05.png | Bin 79437 -> 0 bytes .../layouts--light--desktop--06.png | Bin 201988 -> 0 bytes .../layouts--light--desktop--07.png | Bin 116807 -> 0 bytes .../layouts--light--desktop--08.png | Bin 74092 -> 0 bytes .../layouts--light--desktop--09.png | Bin 100245 -> 0 bytes .../layouts--light--desktop--10.png | Bin 205407 -> 0 bytes .../layouts--light--desktop--11.png | Bin 181321 -> 0 bytes .../layouts--light--mobile--01.png | Bin 51476 -> 0 bytes .../layouts--light--mobile--02.png | Bin 55961 -> 0 bytes .../layouts--light--mobile--03.png | Bin 45095 -> 0 bytes .../layouts--light--mobile--04.png | Bin 45286 -> 0 bytes .../layouts--light--mobile--05.png | Bin 53949 -> 0 bytes .../layouts--light--mobile--06.png | Bin 50936 -> 0 bytes .../layouts--light--mobile--07.png | Bin 81571 -> 0 bytes .../layouts--light--mobile--08.png | Bin 78103 -> 0 bytes .../vueforge-showcase/manifest.json | 2132 ---------- .../playground--dark--desktop--01.png | Bin 98024 -> 0 bytes .../playground--dark--desktop--02.png | Bin 84528 -> 0 bytes .../playground--dark--desktop--03.png | Bin 71671 -> 0 bytes .../playground--dark--desktop--04.png | Bin 63840 -> 0 bytes .../playground--dark--desktop--05.png | Bin 55147 -> 0 bytes .../playground--dark--mobile--01.png | Bin 78406 -> 0 bytes .../playground--dark--mobile--02.png | Bin 80363 -> 0 bytes .../playground--dark--mobile--03.png | Bin 54718 -> 0 bytes .../playground--dark--mobile--04.png | Bin 53827 -> 0 bytes .../playground--dark--mobile--05.png | Bin 52161 -> 0 bytes .../playground--light--desktop--01.png | Bin 97589 -> 0 bytes .../playground--light--desktop--02.png | Bin 84580 -> 0 bytes .../playground--light--desktop--03.png | Bin 71651 -> 0 bytes .../playground--light--desktop--04.png | Bin 63703 -> 0 bytes .../playground--light--desktop--05.png | Bin 55079 -> 0 bytes .../playground--light--mobile--01.png | Bin 77582 -> 0 bytes .../playground--light--mobile--02.png | Bin 80182 -> 0 bytes .../playground--light--mobile--03.png | Bin 54742 -> 0 bytes .../playground--light--mobile--04.png | Bin 53496 -> 0 bytes .../playground--light--mobile--05.png | Bin 51460 -> 0 bytes 1503 files changed, 129 insertions(+), 127454 deletions(-) delete mode 100644 .github/workflows/refresh-visual-baselines.yml delete mode 100644 contracts/visual.states.json delete mode 100644 docs/codeblock/api/index.md delete mode 100644 docs/codeblock/components/code-block/api.md delete mode 100644 docs/codeblock/components/code-block/features.md delete mode 100644 docs/codeblock/components/code-block/index.md delete mode 100644 docs/codeblock/components/code-block/theming.md delete mode 100644 docs/codeblock/getting-started.md delete mode 100644 docs/codeblock/guides/index.md delete mode 100644 docs/codeblock/installation.md delete mode 100644 docs/core/api/index.md delete mode 100644 docs/core/components/accordion/api.md delete mode 100644 docs/core/components/accordion/features.md delete mode 100644 docs/core/components/accordion/index.md delete mode 100644 docs/core/components/accordion/theming.md delete mode 100644 docs/core/components/alert/api.md delete mode 100644 docs/core/components/alert/features.md delete mode 100644 docs/core/components/alert/index.md delete mode 100644 docs/core/components/alert/theming.md delete mode 100644 docs/core/components/avatar/api.md delete mode 100644 docs/core/components/avatar/features.md delete mode 100644 docs/core/components/avatar/index.md delete mode 100644 docs/core/components/avatar/theming.md delete mode 100644 docs/core/components/badge/api.md delete mode 100644 docs/core/components/badge/features.md delete mode 100644 docs/core/components/badge/index.md delete mode 100644 docs/core/components/badge/theming.md delete mode 100644 docs/core/components/breadcrumbs/api.md delete mode 100644 docs/core/components/breadcrumbs/features.md delete mode 100644 docs/core/components/breadcrumbs/index.md delete mode 100644 docs/core/components/breadcrumbs/theming.md delete mode 100644 docs/core/components/button/api.md delete mode 100644 docs/core/components/button/features.md delete mode 100644 docs/core/components/button/index.md delete mode 100644 docs/core/components/button/theming.md delete mode 100644 docs/core/components/card/api.md delete mode 100644 docs/core/components/card/features.md delete mode 100644 docs/core/components/card/index.md delete mode 100644 docs/core/components/card/theming.md delete mode 100644 docs/core/components/checkbox/api.md delete mode 100644 docs/core/components/checkbox/features.md delete mode 100644 docs/core/components/checkbox/index.md delete mode 100644 docs/core/components/checkbox/theming.md delete mode 100644 docs/core/components/command-palette/api.md delete mode 100644 docs/core/components/command-palette/features.md delete mode 100644 docs/core/components/command-palette/index.md delete mode 100644 docs/core/components/command-palette/theming.md delete mode 100644 docs/core/components/confirm-dialog/api.md delete mode 100644 docs/core/components/confirm-dialog/features.md delete mode 100644 docs/core/components/confirm-dialog/index.md delete mode 100644 docs/core/components/confirm-dialog/theming.md delete mode 100644 docs/core/components/data-table-column-chooser/api.md delete mode 100644 docs/core/components/data-table-column-chooser/features.md delete mode 100644 docs/core/components/data-table-column-chooser/index.md delete mode 100644 docs/core/components/data-table-column-chooser/theming.md delete mode 100644 docs/core/components/data-table/api.md delete mode 100644 docs/core/components/data-table/features.md delete mode 100644 docs/core/components/data-table/index.md delete mode 100644 docs/core/components/data-table/theming.md delete mode 100644 docs/core/components/date-picker/api.md delete mode 100644 docs/core/components/date-picker/features.md delete mode 100644 docs/core/components/date-picker/index.md delete mode 100644 docs/core/components/date-picker/theming.md delete mode 100644 docs/core/components/dialog/api.md delete mode 100644 docs/core/components/dialog/features.md delete mode 100644 docs/core/components/dialog/index.md delete mode 100644 docs/core/components/dialog/theming.md delete mode 100644 docs/core/components/divider/api.md delete mode 100644 docs/core/components/divider/features.md delete mode 100644 docs/core/components/divider/index.md delete mode 100644 docs/core/components/divider/theming.md delete mode 100644 docs/core/components/drawer/api.md delete mode 100644 docs/core/components/drawer/features.md delete mode 100644 docs/core/components/drawer/index.md delete mode 100644 docs/core/components/drawer/theming.md delete mode 100644 docs/core/components/dropdown/api.md delete mode 100644 docs/core/components/dropdown/features.md delete mode 100644 docs/core/components/dropdown/index.md delete mode 100644 docs/core/components/dropdown/theming.md delete mode 100644 docs/core/components/field/api.md delete mode 100644 docs/core/components/field/features.md delete mode 100644 docs/core/components/field/index.md delete mode 100644 docs/core/components/field/theming.md delete mode 100644 docs/core/components/fieldset/api.md delete mode 100644 docs/core/components/fieldset/features.md delete mode 100644 docs/core/components/fieldset/index.md delete mode 100644 docs/core/components/fieldset/theming.md delete mode 100644 docs/core/components/form-layout/api.md delete mode 100644 docs/core/components/form-layout/features.md delete mode 100644 docs/core/components/form-layout/index.md delete mode 100644 docs/core/components/form-layout/theming.md delete mode 100644 docs/core/components/group-box/api.md delete mode 100644 docs/core/components/group-box/features.md delete mode 100644 docs/core/components/group-box/index.md delete mode 100644 docs/core/components/group-box/theming.md delete mode 100644 docs/core/components/icon-button/api.md delete mode 100644 docs/core/components/icon-button/features.md delete mode 100644 docs/core/components/icon-button/index.md delete mode 100644 docs/core/components/icon-button/theming.md delete mode 100644 docs/core/components/input/api.md delete mode 100644 docs/core/components/input/features.md delete mode 100644 docs/core/components/input/index.md delete mode 100644 docs/core/components/input/theming.md delete mode 100644 docs/core/components/link/api.md delete mode 100644 docs/core/components/link/features.md delete mode 100644 docs/core/components/link/index.md delete mode 100644 docs/core/components/link/theming.md delete mode 100644 docs/core/components/menu-bar/api.md delete mode 100644 docs/core/components/menu-bar/features.md delete mode 100644 docs/core/components/menu-bar/index.md delete mode 100644 docs/core/components/menu-bar/theming.md delete mode 100644 docs/core/components/menu/api.md delete mode 100644 docs/core/components/menu/features.md delete mode 100644 docs/core/components/menu/index.md delete mode 100644 docs/core/components/menu/theming.md delete mode 100644 docs/core/components/nav-menu/api.md delete mode 100644 docs/core/components/nav-menu/features.md delete mode 100644 docs/core/components/nav-menu/index.md delete mode 100644 docs/core/components/nav-menu/theming.md delete mode 100644 docs/core/components/page-header/api.md delete mode 100644 docs/core/components/page-header/features.md delete mode 100644 docs/core/components/page-header/index.md delete mode 100644 docs/core/components/page-header/theming.md delete mode 100644 docs/core/components/panel/api.md delete mode 100644 docs/core/components/panel/features.md delete mode 100644 docs/core/components/panel/index.md delete mode 100644 docs/core/components/panel/theming.md delete mode 100644 docs/core/components/popover/api.md delete mode 100644 docs/core/components/popover/features.md delete mode 100644 docs/core/components/popover/index.md delete mode 100644 docs/core/components/popover/theming.md delete mode 100644 docs/core/components/progress-bar/api.md delete mode 100644 docs/core/components/progress-bar/features.md delete mode 100644 docs/core/components/progress-bar/index.md delete mode 100644 docs/core/components/progress-bar/theming.md delete mode 100644 docs/core/components/progress-spinner/api.md delete mode 100644 docs/core/components/progress-spinner/features.md delete mode 100644 docs/core/components/progress-spinner/index.md delete mode 100644 docs/core/components/progress-spinner/theming.md delete mode 100644 docs/core/components/radio/api.md delete mode 100644 docs/core/components/radio/features.md delete mode 100644 docs/core/components/radio/index.md delete mode 100644 docs/core/components/radio/theming.md delete mode 100644 docs/core/components/select/api.md delete mode 100644 docs/core/components/select/features.md delete mode 100644 docs/core/components/select/index.md delete mode 100644 docs/core/components/select/theming.md delete mode 100644 docs/core/components/skeleton-gate/api.md delete mode 100644 docs/core/components/skeleton-gate/features.md delete mode 100644 docs/core/components/skeleton-gate/index.md delete mode 100644 docs/core/components/skeleton-gate/theming.md delete mode 100644 docs/core/components/skeleton/api.md delete mode 100644 docs/core/components/skeleton/features.md delete mode 100644 docs/core/components/skeleton/index.md delete mode 100644 docs/core/components/skeleton/theming.md delete mode 100644 docs/core/components/stepper/api.md delete mode 100644 docs/core/components/stepper/features.md delete mode 100644 docs/core/components/stepper/index.md delete mode 100644 docs/core/components/stepper/theming.md delete mode 100644 docs/core/components/switch/api.md delete mode 100644 docs/core/components/switch/features.md delete mode 100644 docs/core/components/switch/index.md delete mode 100644 docs/core/components/switch/theming.md delete mode 100644 docs/core/components/table-of-contents/api.md delete mode 100644 docs/core/components/table-of-contents/features.md delete mode 100644 docs/core/components/table-of-contents/index.md delete mode 100644 docs/core/components/table-of-contents/theming.md delete mode 100644 docs/core/components/table/api.md delete mode 100644 docs/core/components/table/features.md delete mode 100644 docs/core/components/table/index.md delete mode 100644 docs/core/components/table/theming.md delete mode 100644 docs/core/components/tabs/api.md delete mode 100644 docs/core/components/tabs/features.md delete mode 100644 docs/core/components/tabs/index.md delete mode 100644 docs/core/components/tabs/theming.md delete mode 100644 docs/core/components/tag/api.md delete mode 100644 docs/core/components/tag/features.md delete mode 100644 docs/core/components/tag/index.md delete mode 100644 docs/core/components/tag/theming.md delete mode 100644 docs/core/components/textarea/api.md delete mode 100644 docs/core/components/textarea/features.md delete mode 100644 docs/core/components/textarea/index.md delete mode 100644 docs/core/components/textarea/theming.md delete mode 100644 docs/core/components/theme-switch/api.md delete mode 100644 docs/core/components/theme-switch/features.md delete mode 100644 docs/core/components/theme-switch/index.md delete mode 100644 docs/core/components/theme-switch/theming.md delete mode 100644 docs/core/components/tooltip/api.md delete mode 100644 docs/core/components/tooltip/features.md delete mode 100644 docs/core/components/tooltip/index.md delete mode 100644 docs/core/components/tooltip/theming.md delete mode 100644 docs/core/getting-started.md delete mode 100644 docs/core/guides/accessibility.md delete mode 100644 docs/core/guides/color-tokens.md delete mode 100644 docs/core/guides/index.md delete mode 100644 docs/core/guides/skeleton-gate-async-recipe.md delete mode 100644 docs/core/guides/ssr.md delete mode 100644 docs/core/guides/theme-configuration.md delete mode 100644 docs/core/installation.md delete mode 100644 docs/design-audit/accessibility-colors.md delete mode 100644 docs/design-audit/color-audit-report.md delete mode 100644 docs/design-audit/color-inventory.md delete mode 100644 docs/design-audit/phase-0-report.md delete mode 100644 docs/design-audit/phase-1-report.md delete mode 100644 docs/design-audit/phase-2-report.md delete mode 100644 docs/design-audit/phase-3-report.md delete mode 100644 docs/design-audit/phase-4-report.md delete mode 100644 docs/design-audit/phase-5-report.md delete mode 100644 docs/design-audit/repository-hygiene-report.md delete mode 100644 docs/design-audit/ui-consistency-report.md delete mode 100644 docs/design-audit/vueforge-2-cleanup-report.md delete mode 100644 docs/icons/api/index.md delete mode 100644 docs/icons/components/vue-iconify/api.md delete mode 100644 docs/icons/components/vue-iconify/features.md delete mode 100644 docs/icons/components/vue-iconify/index.md delete mode 100644 docs/icons/components/vue-iconify/theming.md delete mode 100644 docs/icons/getting-started.md delete mode 100644 docs/icons/guides/index.md delete mode 100644 docs/icons/icons.md delete mode 100644 docs/icons/installation.md delete mode 100644 docs/layouts/api/index.md delete mode 100644 docs/layouts/components/admin-layout/api.md delete mode 100644 docs/layouts/components/admin-layout/features.md delete mode 100644 docs/layouts/components/admin-layout/index.md delete mode 100644 docs/layouts/components/admin-layout/theming.md delete mode 100644 docs/layouts/components/admin-shell/api.md delete mode 100644 docs/layouts/components/admin-shell/features.md delete mode 100644 docs/layouts/components/admin-shell/index.md delete mode 100644 docs/layouts/components/admin-shell/theming.md delete mode 100644 docs/layouts/components/app-shell/api.md delete mode 100644 docs/layouts/components/app-shell/features.md delete mode 100644 docs/layouts/components/app-shell/index.md delete mode 100644 docs/layouts/components/app-shell/theming.md delete mode 100644 docs/layouts/components/aside-area/api.md delete mode 100644 docs/layouts/components/aside-area/features.md delete mode 100644 docs/layouts/components/aside-area/index.md delete mode 100644 docs/layouts/components/aside-area/theming.md delete mode 100644 docs/layouts/components/auth-layout/api.md delete mode 100644 docs/layouts/components/auth-layout/features.md delete mode 100644 docs/layouts/components/auth-layout/index.md delete mode 100644 docs/layouts/components/auth-layout/theming.md delete mode 100644 docs/layouts/components/container/api.md delete mode 100644 docs/layouts/components/container/features.md delete mode 100644 docs/layouts/components/container/index.md delete mode 100644 docs/layouts/components/container/theming.md delete mode 100644 docs/layouts/components/content-area/api.md delete mode 100644 docs/layouts/components/content-area/features.md delete mode 100644 docs/layouts/components/content-area/index.md delete mode 100644 docs/layouts/components/content-area/theming.md delete mode 100644 docs/layouts/components/document-layout/api.md delete mode 100644 docs/layouts/components/document-layout/features.md delete mode 100644 docs/layouts/components/document-layout/index.md delete mode 100644 docs/layouts/components/document-layout/theming.md delete mode 100644 docs/layouts/components/error-layout/api.md delete mode 100644 docs/layouts/components/error-layout/features.md delete mode 100644 docs/layouts/components/error-layout/index.md delete mode 100644 docs/layouts/components/error-layout/theming.md delete mode 100644 docs/layouts/components/footer-area/api.md delete mode 100644 docs/layouts/components/footer-area/features.md delete mode 100644 docs/layouts/components/footer-area/index.md delete mode 100644 docs/layouts/components/footer-area/theming.md delete mode 100644 docs/layouts/components/grid/api.md delete mode 100644 docs/layouts/components/grid/features.md delete mode 100644 docs/layouts/components/grid/index.md delete mode 100644 docs/layouts/components/grid/theming.md delete mode 100644 docs/layouts/components/header-area/api.md delete mode 100644 docs/layouts/components/header-area/features.md delete mode 100644 docs/layouts/components/header-area/index.md delete mode 100644 docs/layouts/components/header-area/theming.md delete mode 100644 docs/layouts/components/inline/api.md delete mode 100644 docs/layouts/components/inline/features.md delete mode 100644 docs/layouts/components/inline/index.md delete mode 100644 docs/layouts/components/inline/theming.md delete mode 100644 docs/layouts/components/section/api.md delete mode 100644 docs/layouts/components/section/features.md delete mode 100644 docs/layouts/components/section/index.md delete mode 100644 docs/layouts/components/section/theming.md delete mode 100644 docs/layouts/components/setup-layout/api.md delete mode 100644 docs/layouts/components/setup-layout/features.md delete mode 100644 docs/layouts/components/setup-layout/index.md delete mode 100644 docs/layouts/components/setup-layout/theming.md delete mode 100644 docs/layouts/components/sidebar-area/api.md delete mode 100644 docs/layouts/components/sidebar-area/features.md delete mode 100644 docs/layouts/components/sidebar-area/index.md delete mode 100644 docs/layouts/components/sidebar-area/theming.md delete mode 100644 docs/layouts/components/stack/api.md delete mode 100644 docs/layouts/components/stack/features.md delete mode 100644 docs/layouts/components/stack/index.md delete mode 100644 docs/layouts/components/stack/theming.md delete mode 100644 docs/layouts/getting-started.md delete mode 100644 docs/layouts/guides/index.md delete mode 100644 docs/layouts/installation.md delete mode 100644 docs/migration-to-v2.md delete mode 100644 docs/playground/api/index.md delete mode 100644 docs/playground/components/playground/api.md delete mode 100644 docs/playground/components/playground/features.md delete mode 100644 docs/playground/components/playground/index.md delete mode 100644 docs/playground/components/playground/theming.md delete mode 100644 docs/playground/getting-started.md delete mode 100644 docs/playground/guides/index.md delete mode 100644 docs/playground/installation.md delete mode 100644 docs/public-release-assets.md delete mode 100644 docs/verification/codemonster-ui-maturity-verification.md delete mode 100644 docs/verification/component-capability-audit.md delete mode 100644 docs/verification/component-disposition-audit.md delete mode 100644 docs/verification/consumer-usage-inventory.md delete mode 100644 docs/verification/maturity-backlog.md delete mode 100644 docs/verification/npm-packed-consumers.md delete mode 100644 docs/verification/prerelease-preparation.md delete mode 100644 docs/verification/real-consumer-rehearsal.md delete mode 100644 docs/vueforge-feature-baseline.md delete mode 100644 docs/vueforge-to-codemonster-ui.md delete mode 100644 examples/vue/README.md delete mode 100644 examples/vue/eslint.config.mjs delete mode 100644 examples/vue/index.html delete mode 100644 examples/vue/package.json delete mode 100644 examples/vue/src/App.vue delete mode 100644 examples/vue/src/LegacyShowcase.vue delete mode 100644 examples/vue/src/PlaygroundShowcase.vue delete mode 100644 examples/vue/src/SharedShowcase.vue delete mode 100644 examples/vue/src/app-shell.test.ts delete mode 100644 examples/vue/src/app-shell.ts delete mode 100644 examples/vue/src/assets/annabel-logo-icon.svg delete mode 100644 examples/vue/src/assets/maya-chen-avatar.png delete mode 100644 examples/vue/src/assets/vueforge-logo-icon.svg delete mode 100644 examples/vue/src/components/ShowcaseThemeSwitch.vue delete mode 100644 examples/vue/src/components/ViteLikeDemoPreview.vue delete mode 100644 examples/vue/src/demo-showcase.css delete mode 100644 examples/vue/src/env.d.ts delete mode 100644 examples/vue/src/main.ts delete mode 100644 examples/vue/src/sections/codeblock/CodeBlockShowcase.vue delete mode 100644 examples/vue/src/sections/colors/ColorSystemShowcase.vue delete mode 100644 examples/vue/src/sections/colors/color-system-showcase.css delete mode 100644 examples/vue/src/sections/core/CoreCommandPaletteRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreDataTableStateRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreDatePickerRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreDialogRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreDrawerRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreExpandableDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreFloatingFieldRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreIconSwitchRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreInputRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreMenuBarRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreMenuBarRecipeNode.vue delete mode 100644 examples/vue/src/sections/core/CoreNavMenuRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreNavMenuRecipeNode.vue delete mode 100644 examples/vue/src/sections/core/CorePaginationDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CorePinnedDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreReorderableDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreResizableDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreSelectRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreSelectableDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreShowcase.vue delete mode 100644 examples/vue/src/sections/core/CoreSlotsDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreSortableDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreStickyDataTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreStickyTableRecipe.vue delete mode 100644 examples/vue/src/sections/core/CoreTabsRecipe.vue delete mode 100644 examples/vue/src/sections/core/component-catalog.json delete mode 100644 examples/vue/src/sections/core/core-command-palette-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-data-table-state-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-date-picker-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-date-picker-recipe.ts delete mode 100644 examples/vue/src/sections/core/core-dialog-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-drawer-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-expandable-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-floating-field-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-icon-switch-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-input-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-maintained-recipes.test.ts delete mode 100644 examples/vue/src/sections/core/core-navigation-recipes.css delete mode 100644 examples/vue/src/sections/core/core-navigation-recipes.test.ts delete mode 100644 examples/vue/src/sections/core/core-navigation-recipes.types.ts delete mode 100644 examples/vue/src/sections/core/core-pagination-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-pinned-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-reorderable-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-resizable-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-select-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-selectable-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-showcase.css delete mode 100644 examples/vue/src/sections/core/core-slots-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-sortable-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-sticky-data-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-sticky-table-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-tabs-recipe.test.ts delete mode 100644 examples/vue/src/sections/core/core-typography.test.ts delete mode 100644 examples/vue/src/sections/icons/IconSaasContexts.vue delete mode 100644 examples/vue/src/sections/icons/IconsShowcase.vue delete mode 100644 examples/vue/src/sections/layouts/LayoutsDataTable.vue delete mode 100644 examples/vue/src/sections/layouts/LayoutsDrawer.vue delete mode 100644 examples/vue/src/sections/layouts/LayoutsNavMenu.vue delete mode 100644 examples/vue/src/sections/layouts/LayoutsNavMenuNode.vue delete mode 100644 examples/vue/src/sections/layouts/LayoutsPasswordInput.vue delete mode 100644 examples/vue/src/sections/layouts/LayoutsShowcase.vue delete mode 100644 examples/vue/src/sections/layouts/LayoutsTabs.vue delete mode 100644 examples/vue/src/sections/layouts/layouts-data-table.css delete mode 100644 examples/vue/src/sections/layouts/layouts-data-table.test.ts delete mode 100644 examples/vue/src/sections/layouts/layouts-drawer.css delete mode 100644 examples/vue/src/sections/layouts/layouts-drawer.test.ts delete mode 100644 examples/vue/src/sections/layouts/layouts-maintained-recipes.test.ts delete mode 100644 examples/vue/src/sections/layouts/layouts-nav-menu.css delete mode 100644 examples/vue/src/sections/layouts/layouts-nav-menu.test.ts delete mode 100644 examples/vue/src/sections/layouts/layouts-password-input.test.ts delete mode 100644 examples/vue/src/sections/layouts/layouts-showcase.css delete mode 100644 examples/vue/src/sections/layouts/layouts-tabs.test.ts delete mode 100644 examples/vue/src/showcase-information-architecture.test.ts delete mode 100644 examples/vue/src/showcase-theme.test.ts delete mode 100644 examples/vue/src/showcase-theme.ts delete mode 100644 examples/vue/src/theme-bootstrap.ts delete mode 100644 examples/vue/src/vitepress-demos/custom-resolver-smoke.ts delete mode 100644 examples/vue/src/vitepress-demos/vue-runtime-smoke.ts delete mode 100644 examples/vue/tsconfig.json delete mode 100644 examples/vue/vite.config.ts delete mode 100644 migration/codemonster-ui-coverage.json delete mode 100644 migration/codemonster-ui-maturity-backlog.json delete mode 100644 migration/vueforge-feature-baseline.json delete mode 100644 migration/vueforge-to-codemonster-ui.json delete mode 100644 packages/codeblock/CHANGELOG.md delete mode 100644 packages/codeblock/LICENSE delete mode 100644 packages/codeblock/README.md delete mode 100644 packages/codeblock/eslint.config.js delete mode 100644 packages/codeblock/package.json delete mode 100644 packages/codeblock/scripts/smoke-consumer-auto-css.mjs delete mode 100644 packages/codeblock/scripts/smoke-css-export.mjs delete mode 100644 packages/codeblock/src/__tests__/mocks/vueforge-icons.ts delete mode 100644 packages/codeblock/src/__tests__/plugin.test.ts delete mode 100644 packages/codeblock/src/codeblock.css delete mode 100644 packages/codeblock/src/components/VfCodeBlock.vue delete mode 100644 packages/codeblock/src/components/__tests__/VfCodeBlock.test.ts delete mode 100644 packages/codeblock/src/config.ts delete mode 100644 packages/codeblock/src/critical.css delete mode 100644 packages/codeblock/src/env.d.ts delete mode 100644 packages/codeblock/src/highlight.ts delete mode 100644 packages/codeblock/src/index.ts delete mode 100644 packages/codeblock/src/services/code-highlight.ts delete mode 100644 packages/codeblock/src/themes/vueforge.test.ts delete mode 100644 packages/codeblock/src/themes/vueforge.ts delete mode 100644 packages/codeblock/src/tokens.css delete mode 100644 packages/codeblock/src/types.ts delete mode 100644 packages/codeblock/src/utils/plain-code.ts delete mode 100644 packages/codeblock/src/view.ts delete mode 100644 packages/codeblock/tsconfig.json delete mode 100644 packages/codeblock/vite.config.ts delete mode 100644 packages/core/CHANGELOG.md delete mode 100644 packages/core/LICENSE delete mode 100644 packages/core/README.md delete mode 100644 packages/core/build/css-imports.ts delete mode 100644 packages/core/build/theme-css-artifacts.ts delete mode 100644 packages/core/docs/foundation-api.md delete mode 100644 packages/core/docs/overlay-api.md delete mode 100644 packages/core/docs/release-checklist.md delete mode 100644 packages/core/docs/theme-api.md delete mode 100644 packages/core/docs/visual-baseline.md delete mode 100644 packages/core/eslint.config.js delete mode 100644 packages/core/package.json delete mode 100644 packages/core/scripts/check-css-contract.mjs delete mode 100644 packages/core/scripts/check-css-parity.mjs delete mode 100644 packages/core/scripts/check-form-geometry.mjs delete mode 100644 packages/core/scripts/smoke-cjs-ssr.mjs delete mode 100644 packages/core/scripts/smoke-consumer-auto-css.mjs delete mode 100644 packages/core/scripts/smoke-css-export.mjs delete mode 100644 packages/core/scripts/smoke-theme-types.mjs delete mode 100644 packages/core/src/__tests__/mocks/vueforge-icons.ts delete mode 100644 packages/core/src/__tests__/setup.ts delete mode 100644 packages/core/src/async.ts delete mode 100644 packages/core/src/components/accordion/VfAccordion.spec.ts delete mode 100644 packages/core/src/components/accordion/VfAccordion.vue delete mode 100644 packages/core/src/components/accordion/index.ts delete mode 100644 packages/core/src/components/alert/VfAlert.vue delete mode 100644 packages/core/src/components/alert/index.ts delete mode 100644 packages/core/src/components/avatar/VfAvatar.vue delete mode 100644 packages/core/src/components/avatar/index.ts delete mode 100644 packages/core/src/components/badge/VfBadge.vue delete mode 100644 packages/core/src/components/badge/index.ts delete mode 100644 packages/core/src/components/breadcrumbs/VfBreadcrumbs.vue delete mode 100644 packages/core/src/components/breadcrumbs/index.ts delete mode 100644 packages/core/src/components/button/VfButton.vue delete mode 100644 packages/core/src/components/button/index.ts delete mode 100644 packages/core/src/components/card/VfCard.vue delete mode 100644 packages/core/src/components/card/index.ts delete mode 100644 packages/core/src/components/checkbox/VfCheckbox.vue delete mode 100644 packages/core/src/components/checkbox/index.ts delete mode 100644 packages/core/src/components/command-palette/VfCommandPalette.spec.ts delete mode 100644 packages/core/src/components/command-palette/VfCommandPalette.vue delete mode 100644 packages/core/src/components/command-palette/index.ts delete mode 100644 packages/core/src/components/components.spec.ts delete mode 100644 packages/core/src/components/confirm-dialog/VfConfirmDialog.spec.ts delete mode 100644 packages/core/src/components/confirm-dialog/VfConfirmDialog.vue delete mode 100644 packages/core/src/components/confirm-dialog/index.ts delete mode 100644 packages/core/src/components/data-table-column-chooser/VfDataTableColumnChooser.spec.ts delete mode 100644 packages/core/src/components/data-table-column-chooser/VfDataTableColumnChooser.vue delete mode 100644 packages/core/src/components/data-table-column-chooser/index.ts delete mode 100644 packages/core/src/components/data-table/VfDataTable.vue delete mode 100644 packages/core/src/components/data-table/index.ts delete mode 100644 packages/core/src/components/date-picker/VfDatePicker.spec.ts delete mode 100644 packages/core/src/components/date-picker/VfDatePicker.vue delete mode 100644 packages/core/src/components/date-picker/index.ts delete mode 100644 packages/core/src/components/dialog/VfDialog.spec.ts delete mode 100644 packages/core/src/components/dialog/VfDialog.vue delete mode 100644 packages/core/src/components/dialog/index.ts delete mode 100644 packages/core/src/components/divider/VfDivider.vue delete mode 100644 packages/core/src/components/divider/index.ts delete mode 100644 packages/core/src/components/drawer/VfDrawer.spec.ts delete mode 100644 packages/core/src/components/drawer/VfDrawer.vue delete mode 100644 packages/core/src/components/drawer/index.ts delete mode 100644 packages/core/src/components/dropdown/VfDropdown.spec.ts delete mode 100644 packages/core/src/components/dropdown/VfDropdown.vue delete mode 100644 packages/core/src/components/dropdown/index.ts delete mode 100644 packages/core/src/components/field/VfField.vue delete mode 100644 packages/core/src/components/field/VfFieldset.vue delete mode 100644 packages/core/src/components/field/context.ts delete mode 100644 packages/core/src/components/field/index.ts delete mode 100644 packages/core/src/components/form-layout/VfFormLayout.spec.ts delete mode 100644 packages/core/src/components/form-layout/VfFormLayout.vue delete mode 100644 packages/core/src/components/form-layout/index.ts delete mode 100644 packages/core/src/components/group-box/VfGroupBox.spec.ts delete mode 100644 packages/core/src/components/group-box/VfGroupBox.vue delete mode 100644 packages/core/src/components/group-box/index.ts delete mode 100644 packages/core/src/components/icon-button/VfIconButton.vue delete mode 100644 packages/core/src/components/icon-button/index.ts delete mode 100644 packages/core/src/components/index.ts delete mode 100644 packages/core/src/components/input/VfInput.vue delete mode 100644 packages/core/src/components/input/index.ts delete mode 100644 packages/core/src/components/internal/VfHorizontalScroller.vue delete mode 100644 packages/core/src/components/link/VfLink.vue delete mode 100644 packages/core/src/components/link/index.ts delete mode 100644 packages/core/src/components/menu-bar/VfMenuBar.spec.ts delete mode 100644 packages/core/src/components/menu-bar/VfMenuBar.vue delete mode 100644 packages/core/src/components/menu-bar/VfMenuBarItemNode.vue delete mode 100644 packages/core/src/components/menu-bar/index.ts delete mode 100644 packages/core/src/components/menu/VfMenu.spec.ts delete mode 100644 packages/core/src/components/menu/VfMenu.vue delete mode 100644 packages/core/src/components/menu/VfMenuItem.vue delete mode 100644 packages/core/src/components/menu/index.ts delete mode 100644 packages/core/src/components/nav-menu/VfNavMenu.spec.ts delete mode 100644 packages/core/src/components/nav-menu/VfNavMenu.vue delete mode 100644 packages/core/src/components/nav-menu/VfNavMenuItemNode.vue delete mode 100644 packages/core/src/components/nav-menu/index.ts delete mode 100644 packages/core/src/components/page-header/VfPageHeader.spec.ts delete mode 100644 packages/core/src/components/page-header/VfPageHeader.vue delete mode 100644 packages/core/src/components/page-header/index.ts delete mode 100644 packages/core/src/components/panel/VfPanel.vue delete mode 100644 packages/core/src/components/panel/index.ts delete mode 100644 packages/core/src/components/popover/VfPopover.spec.ts delete mode 100644 packages/core/src/components/popover/VfPopover.vue delete mode 100644 packages/core/src/components/popover/index.ts delete mode 100644 packages/core/src/components/progress-bar/VfProgressBar.vue delete mode 100644 packages/core/src/components/progress-bar/index.ts delete mode 100644 packages/core/src/components/progress-spinner/VfProgressSpinner.vue delete mode 100644 packages/core/src/components/progress-spinner/index.ts delete mode 100644 packages/core/src/components/radio/VfRadio.vue delete mode 100644 packages/core/src/components/radio/index.ts delete mode 100644 packages/core/src/components/select/VfSelect.vue delete mode 100644 packages/core/src/components/select/index.ts delete mode 100644 packages/core/src/components/skeleton-gate/VfSkeletonGate.vue delete mode 100644 packages/core/src/components/skeleton-gate/index.ts delete mode 100644 packages/core/src/components/skeleton/VfSkeleton.vue delete mode 100644 packages/core/src/components/skeleton/index.ts delete mode 100644 packages/core/src/components/stepper/VfStepper.spec.ts delete mode 100644 packages/core/src/components/stepper/VfStepper.vue delete mode 100644 packages/core/src/components/stepper/index.ts delete mode 100644 packages/core/src/components/switch/VfSwitch.vue delete mode 100644 packages/core/src/components/switch/index.ts delete mode 100644 packages/core/src/components/table-of-contents/VfTableOfContents.vue delete mode 100644 packages/core/src/components/table-of-contents/index.ts delete mode 100644 packages/core/src/components/table/VfTable.vue delete mode 100644 packages/core/src/components/table/index.ts delete mode 100644 packages/core/src/components/tabs/VfTabs.spec.ts delete mode 100644 packages/core/src/components/tabs/VfTabs.vue delete mode 100644 packages/core/src/components/tabs/index.ts delete mode 100644 packages/core/src/components/tag/VfTag.vue delete mode 100644 packages/core/src/components/tag/index.ts delete mode 100644 packages/core/src/components/textarea/VfTextarea.vue delete mode 100644 packages/core/src/components/textarea/index.ts delete mode 100644 packages/core/src/components/theme-switch/VfThemeSwitch.vue delete mode 100644 packages/core/src/components/theme-switch/index.ts delete mode 100644 packages/core/src/components/tooltip/VfTooltip.spec.ts delete mode 100644 packages/core/src/components/tooltip/VfTooltip.vue delete mode 100644 packages/core/src/components/tooltip/index.ts delete mode 100644 packages/core/src/composables/composables.spec.ts delete mode 100644 packages/core/src/composables/index.ts delete mode 100644 packages/core/src/composables/useClickOutside.ts delete mode 100644 packages/core/src/composables/useDisclosure.ts delete mode 100644 packages/core/src/composables/useEscapeKey.ts delete mode 100644 packages/core/src/composables/useFloating.ts delete mode 100644 packages/core/src/composables/useFocusTrap.spec.ts delete mode 100644 packages/core/src/composables/useFocusTrap.ts delete mode 100644 packages/core/src/composables/useId.ts delete mode 100644 packages/core/src/composables/useTableOfContents.ts delete mode 100644 packages/core/src/composables/useTheme.ts delete mode 100644 packages/core/src/entries/accordion.ts delete mode 100644 packages/core/src/entries/alert.ts delete mode 100644 packages/core/src/entries/avatar.ts delete mode 100644 packages/core/src/entries/badge.ts delete mode 100644 packages/core/src/entries/breadcrumbs.ts delete mode 100644 packages/core/src/entries/button.ts delete mode 100644 packages/core/src/entries/card.ts delete mode 100644 packages/core/src/entries/checkbox.ts delete mode 100644 packages/core/src/entries/command-palette.ts delete mode 100644 packages/core/src/entries/confirm-dialog.ts delete mode 100644 packages/core/src/entries/data-table-column-chooser.ts delete mode 100644 packages/core/src/entries/data-table.ts delete mode 100644 packages/core/src/entries/date-picker.ts delete mode 100644 packages/core/src/entries/dialog.ts delete mode 100644 packages/core/src/entries/divider.ts delete mode 100644 packages/core/src/entries/drawer.ts delete mode 100644 packages/core/src/entries/dropdown.ts delete mode 100644 packages/core/src/entries/field.ts delete mode 100644 packages/core/src/entries/fieldset.ts delete mode 100644 packages/core/src/entries/form-layout.ts delete mode 100644 packages/core/src/entries/group-box.ts delete mode 100644 packages/core/src/entries/icon-button.ts delete mode 100644 packages/core/src/entries/input.ts delete mode 100644 packages/core/src/entries/link.ts delete mode 100644 packages/core/src/entries/menu-bar.ts delete mode 100644 packages/core/src/entries/menu.ts delete mode 100644 packages/core/src/entries/nav-menu.ts delete mode 100644 packages/core/src/entries/page-header.ts delete mode 100644 packages/core/src/entries/panel.ts delete mode 100644 packages/core/src/entries/popover.ts delete mode 100644 packages/core/src/entries/progress-bar.ts delete mode 100644 packages/core/src/entries/progress-spinner.ts delete mode 100644 packages/core/src/entries/radio.ts delete mode 100644 packages/core/src/entries/select.ts delete mode 100644 packages/core/src/entries/skeleton-gate.ts delete mode 100644 packages/core/src/entries/skeleton.ts delete mode 100644 packages/core/src/entries/stepper.ts delete mode 100644 packages/core/src/entries/switch.ts delete mode 100644 packages/core/src/entries/table-of-contents.ts delete mode 100644 packages/core/src/entries/table.ts delete mode 100644 packages/core/src/entries/tabs.ts delete mode 100644 packages/core/src/entries/tag.ts delete mode 100644 packages/core/src/entries/textarea.ts delete mode 100644 packages/core/src/entries/theme-switch.ts delete mode 100644 packages/core/src/entries/tooltip.ts delete mode 100644 packages/core/src/foundation/breakpoints.ts delete mode 100644 packages/core/src/foundation/foundation-contract.spec.ts delete mode 100644 packages/core/src/foundation/foundation.spec.ts delete mode 100644 packages/core/src/foundation/index.ts delete mode 100644 packages/core/src/foundation/useBreakpoint.ts delete mode 100644 packages/core/src/foundation/useBreakpointValue.ts delete mode 100644 packages/core/src/foundation/useBreakpoints.ts delete mode 100644 packages/core/src/foundation/useScrollLock.ts delete mode 100644 packages/core/src/index.ts delete mode 100644 packages/core/src/plugin.ts delete mode 100644 packages/core/src/providers/VfThemeProvider.spec.ts delete mode 100644 packages/core/src/providers/VfThemeProvider.vue delete mode 100644 packages/core/src/providers/themeContext.ts delete mode 100644 packages/core/src/providers/vueForgeConfig.ts delete mode 100644 packages/core/src/styles/component-entry-parity.spec.ts delete mode 100644 packages/core/src/styles/component-interaction-contract.spec.ts delete mode 100644 packages/core/src/styles/component-palette-contract.spec.ts delete mode 100644 packages/core/src/styles/components.css delete mode 100644 packages/core/src/styles/components/accessibility-preferences.css delete mode 100644 packages/core/src/styles/components/base.css delete mode 100644 packages/core/src/styles/components/horizontal-scroller.css delete mode 100644 packages/core/src/styles/components/overlay-primitives.css delete mode 100644 packages/core/src/styles/components/theme-transition-guard.css delete mode 100644 packages/core/src/styles/entries/accordion.css delete mode 100644 packages/core/src/styles/entries/alert.css delete mode 100644 packages/core/src/styles/entries/async.css delete mode 100644 packages/core/src/styles/entries/avatar.css delete mode 100644 packages/core/src/styles/entries/badge.css delete mode 100644 packages/core/src/styles/entries/breadcrumbs.css delete mode 100644 packages/core/src/styles/entries/button.css delete mode 100644 packages/core/src/styles/entries/card.css delete mode 100644 packages/core/src/styles/entries/checkbox.css delete mode 100644 packages/core/src/styles/entries/command-palette.css delete mode 100644 packages/core/src/styles/entries/confirm-dialog.css delete mode 100644 packages/core/src/styles/entries/data-table-column-chooser.css delete mode 100644 packages/core/src/styles/entries/data-table.css delete mode 100644 packages/core/src/styles/entries/date-picker.css delete mode 100644 packages/core/src/styles/entries/dialog.css delete mode 100644 packages/core/src/styles/entries/divider.css delete mode 100644 packages/core/src/styles/entries/drawer.css delete mode 100644 packages/core/src/styles/entries/dropdown.css delete mode 100644 packages/core/src/styles/entries/field.css delete mode 100644 packages/core/src/styles/entries/fieldset.css delete mode 100644 packages/core/src/styles/entries/form-layout.css delete mode 100644 packages/core/src/styles/entries/group-box.css delete mode 100644 packages/core/src/styles/entries/icon-button.css delete mode 100644 packages/core/src/styles/entries/input.css delete mode 100644 packages/core/src/styles/entries/link.css delete mode 100644 packages/core/src/styles/entries/menu-bar.css delete mode 100644 packages/core/src/styles/entries/menu.css delete mode 100644 packages/core/src/styles/entries/nav-menu.css delete mode 100644 packages/core/src/styles/entries/page-header.css delete mode 100644 packages/core/src/styles/entries/panel.css delete mode 100644 packages/core/src/styles/entries/popover.css delete mode 100644 packages/core/src/styles/entries/progress-bar.css delete mode 100644 packages/core/src/styles/entries/progress-spinner.css delete mode 100644 packages/core/src/styles/entries/radio.css delete mode 100644 packages/core/src/styles/entries/select.css delete mode 100644 packages/core/src/styles/entries/skeleton-gate.css delete mode 100644 packages/core/src/styles/entries/skeleton.css delete mode 100644 packages/core/src/styles/entries/stepper.css delete mode 100644 packages/core/src/styles/entries/switch.css delete mode 100644 packages/core/src/styles/entries/table-of-contents.css delete mode 100644 packages/core/src/styles/entries/table.css delete mode 100644 packages/core/src/styles/entries/tabs.css delete mode 100644 packages/core/src/styles/entries/tag.css delete mode 100644 packages/core/src/styles/entries/textarea.css delete mode 100644 packages/core/src/styles/entries/theme-switch.css delete mode 100644 packages/core/src/styles/entries/tooltip.css delete mode 100644 packages/core/src/styles/foundation.css delete mode 100644 packages/core/src/styles/prose-contract.spec.ts delete mode 100644 packages/core/src/styles/styles.css delete mode 100644 packages/core/src/theme/color-contrast.spec.ts delete mode 100644 packages/core/src/theme/color-token-schema.spec.ts delete mode 100644 packages/core/src/theme/color-token-schema.ts delete mode 100644 packages/core/src/theme/default-preset-source.ts delete mode 100644 packages/core/src/theme/default-preset.ts delete mode 100644 packages/core/src/theme/index.ts delete mode 100644 packages/core/src/theme/motion.ts delete mode 100644 packages/core/src/theme/public.ts delete mode 100644 packages/core/src/theme/theme-contract.spec.ts delete mode 100644 packages/core/src/theme/theme.spec.ts delete mode 100644 packages/core/src/theme/utils.ts delete mode 100644 packages/core/src/types/components.ts delete mode 100644 packages/core/src/types/theme.ts delete mode 100644 packages/core/src/types/vueforge-icons-shim.d.ts delete mode 100644 packages/core/src/utils/classes.ts delete mode 100644 packages/core/src/utils/theme.ts delete mode 100644 packages/core/src/vue.d.ts delete mode 100644 packages/core/tsconfig.json delete mode 100644 packages/core/vite.config.ts delete mode 100644 packages/core/vitest.config.ts delete mode 100644 packages/playground-core/CHANGELOG.md delete mode 100644 packages/playground-core/LICENSE delete mode 100644 packages/playground-core/README.md delete mode 100644 packages/playground-core/__tests__/browserRuntime.test.ts delete mode 100644 packages/playground-core/__tests__/session.test.ts delete mode 100644 packages/playground-core/__tests__/typescriptWorkerClient.test.ts delete mode 100644 packages/playground-core/eslint.config.mjs delete mode 100644 packages/playground-core/package.json delete mode 100644 packages/playground-core/src/events.ts delete mode 100644 packages/playground-core/src/index.ts delete mode 100644 packages/playground-core/src/runtimes/browserRuntime.ts delete mode 100644 packages/playground-core/src/types.ts delete mode 100644 packages/playground-core/src/typescriptWorker.js delete mode 100644 packages/playground-core/src/typescriptWorkerClient.ts delete mode 100644 packages/playground-core/tsconfig.json delete mode 100644 packages/playground-core/vitest.config.ts delete mode 100644 packages/playground-vite-plugin/CHANGELOG.md delete mode 100644 packages/playground-vite-plugin/LICENSE delete mode 100644 packages/playground-vite-plugin/README.md delete mode 100644 packages/playground-vite-plugin/__tests__/index.test.ts delete mode 100644 packages/playground-vite-plugin/eslint.config.mjs delete mode 100644 packages/playground-vite-plugin/package.json delete mode 100644 packages/playground-vite-plugin/src/index.ts delete mode 100644 packages/playground-vite-plugin/tsconfig.json delete mode 100644 packages/playground/CHANGELOG.md delete mode 100644 packages/playground/LICENSE delete mode 100644 packages/playground/README.md delete mode 100644 packages/playground/eslint.config.mjs delete mode 100644 packages/playground/package.json delete mode 100644 packages/playground/scripts/smoke-consumer-auto-css.mjs delete mode 100644 packages/playground/scripts/smoke-css-export.mjs delete mode 100644 packages/playground/src/VfPlayground.spec.ts delete mode 100644 packages/playground/src/VfPlayground.vue delete mode 100644 packages/playground/src/critical.css delete mode 100644 packages/playground/src/index.ts delete mode 100644 packages/playground/src/playground.css delete mode 100644 packages/playground/src/props.ts delete mode 100644 packages/playground/src/runtime.ts delete mode 100644 packages/playground/src/shims-vue.d.ts delete mode 100644 packages/playground/src/test-shims/vueforge-codeblock.ts delete mode 100644 packages/playground/src/test-shims/vueforge-core.ts delete mode 100644 packages/playground/src/test-shims/vueforge-playground-core.ts delete mode 100644 packages/playground/src/tokens.css delete mode 100644 packages/playground/src/types/deps-shim.d.ts delete mode 100644 packages/playground/src/types/vueforge-core-async.d.ts delete mode 100644 packages/playground/src/ui.ts delete mode 100644 packages/playground/tsconfig.json delete mode 100644 packages/playground/vite.config.ts delete mode 100644 packages/playground/vitest.config.ts delete mode 100644 packages/theme/CHANGELOG.md delete mode 100644 packages/theme/LICENSE delete mode 100644 packages/theme/README.md delete mode 100644 packages/theme/__tests__/breakpoint-queries.spec.ts delete mode 100644 packages/theme/__tests__/helpers.ts delete mode 100644 packages/theme/__tests__/runtime.spec.ts delete mode 100644 packages/theme/eslint.config.ts delete mode 100644 packages/theme/package.json delete mode 100644 packages/theme/src/breakpoint-queries.ts delete mode 100644 packages/theme/src/breakpoints.ts delete mode 100644 packages/theme/src/color-token-contract.ts delete mode 100644 packages/theme/src/css-vars.ts delete mode 100644 packages/theme/src/index.ts delete mode 100644 packages/theme/src/mode.ts delete mode 100644 packages/theme/src/motion.ts delete mode 100644 packages/theme/src/runtime.ts delete mode 100644 packages/theme/src/types.ts delete mode 100644 packages/theme/tsconfig.json delete mode 100644 packages/theme/tsconfig.test.json delete mode 100644 packages/vueforge-icons/.gitignore delete mode 100644 packages/vueforge-icons/CHANGELOG.md delete mode 100644 packages/vueforge-icons/LICENSE delete mode 100644 packages/vueforge-icons/README.md delete mode 100644 packages/vueforge-icons/__tests__/render-consumer.mjs delete mode 100644 packages/vueforge-icons/__tests__/smoke-consumer.ts delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-light-16.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-light-20.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-light-24.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-light-32.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-regular-16.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-regular-20.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-regular-24.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-regular-32.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-solid-16.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-solid-20.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-solid-24.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-solid-32.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-thin-16.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-thin-20.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-thin-24.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/duotone-thin-32.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/light-16.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/light-20.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/light-24.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/light-32.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/manifest.json delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/regular-16.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/regular-20.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/regular-24.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/regular-32.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/solid-16.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/solid-20.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/solid-24.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/solid-32.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/thin-16.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/thin-20.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/thin-24.png delete mode 100644 packages/vueforge-icons/__tests__/visual-snapshots/thin-32.png delete mode 100644 packages/vueforge-icons/docs/icon-audit.md delete mode 100644 packages/vueforge-icons/docs/icon-design-language.md delete mode 100644 packages/vueforge-icons/docs/icon-style.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-02.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-03.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-04.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-05.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-06.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-07.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-08.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-09.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-10.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-11.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-12.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-13.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-14.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-15.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-16.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-17.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-18.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-19.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-20.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-21.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-22.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-23.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-24.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-25.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-26.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-27.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-28.md delete mode 100644 packages/vueforge-icons/docs/migration-batch-29.md delete mode 100644 packages/vueforge-icons/docs/redesign-reference-set.md delete mode 100644 packages/vueforge-icons/docs/visual-audit.md delete mode 100644 packages/vueforge-icons/eslint.config.mjs delete mode 100644 packages/vueforge-icons/index.html delete mode 100644 packages/vueforge-icons/package.json delete mode 100644 packages/vueforge-icons/scripts/audit-bundle.mjs delete mode 100644 packages/vueforge-icons/scripts/audit-icon-centering.mjs delete mode 100644 packages/vueforge-icons/scripts/audit-icons.mjs delete mode 100644 packages/vueforge-icons/scripts/audit-solid-icons.mjs delete mode 100644 packages/vueforge-icons/scripts/create-icon.mjs delete mode 100644 packages/vueforge-icons/scripts/generate-icons.mjs delete mode 100644 packages/vueforge-icons/scripts/snapshot-reference-icons.mjs delete mode 100644 packages/vueforge-icons/scripts/visual-snapshots.mjs delete mode 100644 packages/vueforge-icons/src/App.vue delete mode 100644 packages/vueforge-icons/src/lib/components/_shared.ts delete mode 100644 packages/vueforge-icons/src/lib/components/activity.vue delete mode 100644 packages/vueforge-icons/src/lib/components/alertCircle.vue delete mode 100644 packages/vueforge-icons/src/lib/components/archive.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowDown.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowDownLong.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowLeft.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowLeftLong.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowRight.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowRightLong.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowTurnLeftDown.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowTurnRightUp.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowTurnUpLeft.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowTurnUpRight.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowUp.vue delete mode 100644 packages/vueforge-icons/src/lib/components/arrowUpLong.vue delete mode 100644 packages/vueforge-icons/src/lib/components/ban.vue delete mode 100644 packages/vueforge-icons/src/lib/components/bars.vue delete mode 100644 packages/vueforge-icons/src/lib/components/bell.vue delete mode 100644 packages/vueforge-icons/src/lib/components/bookmark.vue delete mode 100644 packages/vueforge-icons/src/lib/components/briefcase.vue delete mode 100644 packages/vueforge-icons/src/lib/components/building.vue delete mode 100644 packages/vueforge-icons/src/lib/components/calendar.vue delete mode 100644 packages/vueforge-icons/src/lib/components/caretDown.vue delete mode 100644 packages/vueforge-icons/src/lib/components/caretLeft.vue delete mode 100644 packages/vueforge-icons/src/lib/components/caretRight.vue delete mode 100644 packages/vueforge-icons/src/lib/components/caretUp.vue delete mode 100644 packages/vueforge-icons/src/lib/components/chartBar.vue delete mode 100644 packages/vueforge-icons/src/lib/components/check.vue delete mode 100644 packages/vueforge-icons/src/lib/components/checkCircle.vue delete mode 100644 packages/vueforge-icons/src/lib/components/chevronDown.vue delete mode 100644 packages/vueforge-icons/src/lib/components/chevronLeft.vue delete mode 100644 packages/vueforge-icons/src/lib/components/chevronRight.vue delete mode 100644 packages/vueforge-icons/src/lib/components/chevronUp.vue delete mode 100644 packages/vueforge-icons/src/lib/components/circleHalf.vue delete mode 100644 packages/vueforge-icons/src/lib/components/circleNotch.vue delete mode 100644 packages/vueforge-icons/src/lib/components/clipboard.vue delete mode 100644 packages/vueforge-icons/src/lib/components/clock.vue delete mode 100644 packages/vueforge-icons/src/lib/components/cloud.vue delete mode 100644 packages/vueforge-icons/src/lib/components/code.vue delete mode 100644 packages/vueforge-icons/src/lib/components/collapse.vue delete mode 100644 packages/vueforge-icons/src/lib/components/columns.vue delete mode 100644 packages/vueforge-icons/src/lib/components/copy.vue delete mode 100644 packages/vueforge-icons/src/lib/components/cpu.vue delete mode 100644 packages/vueforge-icons/src/lib/components/creditCard.vue delete mode 100644 packages/vueforge-icons/src/lib/components/database.vue delete mode 100644 packages/vueforge-icons/src/lib/components/download.vue delete mode 100644 packages/vueforge-icons/src/lib/components/ellipsis.vue delete mode 100644 packages/vueforge-icons/src/lib/components/expand.vue delete mode 100644 packages/vueforge-icons/src/lib/components/externalLink.vue delete mode 100644 packages/vueforge-icons/src/lib/components/eye.vue delete mode 100644 packages/vueforge-icons/src/lib/components/eyeSlash.vue delete mode 100644 packages/vueforge-icons/src/lib/components/facebook.vue delete mode 100644 packages/vueforge-icons/src/lib/components/file.vue delete mode 100644 packages/vueforge-icons/src/lib/components/fileText.vue delete mode 100644 packages/vueforge-icons/src/lib/components/filter.vue delete mode 100644 packages/vueforge-icons/src/lib/components/folder.vue delete mode 100644 packages/vueforge-icons/src/lib/components/folderOpen.vue delete mode 100644 packages/vueforge-icons/src/lib/components/funnelX.vue delete mode 100644 packages/vueforge-icons/src/lib/components/gear.vue delete mode 100644 packages/vueforge-icons/src/lib/components/github.vue delete mode 100644 packages/vueforge-icons/src/lib/components/globe.vue delete mode 100644 packages/vueforge-icons/src/lib/components/grid.vue delete mode 100644 packages/vueforge-icons/src/lib/components/hardDrive.vue delete mode 100644 packages/vueforge-icons/src/lib/components/heart.vue delete mode 100644 packages/vueforge-icons/src/lib/components/history.vue delete mode 100644 packages/vueforge-icons/src/lib/components/house.vue delete mode 100644 packages/vueforge-icons/src/lib/components/icon.vue delete mode 100644 packages/vueforge-icons/src/lib/components/inbox.vue delete mode 100644 packages/vueforge-icons/src/lib/components/info.vue delete mode 100644 packages/vueforge-icons/src/lib/components/infoCircle.vue delete mode 100644 packages/vueforge-icons/src/lib/components/instagram.vue delete mode 100644 packages/vueforge-icons/src/lib/components/key.vue delete mode 100644 packages/vueforge-icons/src/lib/components/layers.vue delete mode 100644 packages/vueforge-icons/src/lib/components/link.vue delete mode 100644 packages/vueforge-icons/src/lib/components/lock.vue delete mode 100644 packages/vueforge-icons/src/lib/components/logIn.vue delete mode 100644 packages/vueforge-icons/src/lib/components/logOut.vue delete mode 100644 packages/vueforge-icons/src/lib/components/magnifyingGlass.vue delete mode 100644 packages/vueforge-icons/src/lib/components/mail.vue delete mode 100644 packages/vueforge-icons/src/lib/components/message.vue delete mode 100644 packages/vueforge-icons/src/lib/components/minus.vue delete mode 100644 packages/vueforge-icons/src/lib/components/moon.vue delete mode 100644 packages/vueforge-icons/src/lib/components/pencil.vue delete mode 100644 packages/vueforge-icons/src/lib/components/phone.vue delete mode 100644 packages/vueforge-icons/src/lib/components/plug.vue delete mode 100644 packages/vueforge-icons/src/lib/components/plus.vue delete mode 100644 packages/vueforge-icons/src/lib/components/question.vue delete mode 100644 packages/vueforge-icons/src/lib/components/questionCircle.vue delete mode 100644 packages/vueforge-icons/src/lib/components/receipt.vue delete mode 100644 packages/vueforge-icons/src/lib/components/refresh.vue delete mode 100644 packages/vueforge-icons/src/lib/components/rotateRight.vue delete mode 100644 packages/vueforge-icons/src/lib/components/send.vue delete mode 100644 packages/vueforge-icons/src/lib/components/server.vue delete mode 100644 packages/vueforge-icons/src/lib/components/share.vue delete mode 100644 packages/vueforge-icons/src/lib/components/shield.vue delete mode 100644 packages/vueforge-icons/src/lib/components/sliders.vue delete mode 100644 packages/vueforge-icons/src/lib/components/sort.vue delete mode 100644 packages/vueforge-icons/src/lib/components/sparkles.vue delete mode 100644 packages/vueforge-icons/src/lib/components/star.vue delete mode 100644 packages/vueforge-icons/src/lib/components/sun.vue delete mode 100644 packages/vueforge-icons/src/lib/components/telegram.vue delete mode 100644 packages/vueforge-icons/src/lib/components/terminal.vue delete mode 100644 packages/vueforge-icons/src/lib/components/trash.vue delete mode 100644 packages/vueforge-icons/src/lib/components/unlock.vue delete mode 100644 packages/vueforge-icons/src/lib/components/upload.vue delete mode 100644 packages/vueforge-icons/src/lib/components/user.vue delete mode 100644 packages/vueforge-icons/src/lib/components/userCheck.vue delete mode 100644 packages/vueforge-icons/src/lib/components/userMinus.vue delete mode 100644 packages/vueforge-icons/src/lib/components/userPlus.vue delete mode 100644 packages/vueforge-icons/src/lib/components/users.vue delete mode 100644 packages/vueforge-icons/src/lib/components/vk.vue delete mode 100644 packages/vueforge-icons/src/lib/components/wallet.vue delete mode 100644 packages/vueforge-icons/src/lib/components/warning.vue delete mode 100644 packages/vueforge-icons/src/lib/components/x.vue delete mode 100644 packages/vueforge-icons/src/lib/components/xCircle.vue delete mode 100644 packages/vueforge-icons/src/lib/components/xmark.vue delete mode 100644 packages/vueforge-icons/src/lib/components/youtube.vue delete mode 100644 packages/vueforge-icons/src/lib/iconAudit.json delete mode 100644 packages/vueforge-icons/src/lib/iconCatalog.json delete mode 100644 packages/vueforge-icons/src/lib/iconCore.json delete mode 100644 packages/vueforge-icons/src/lib/iconFamilies.ts delete mode 100644 packages/vueforge-icons/src/lib/iconMeta.json delete mode 100644 packages/vueforge-icons/src/lib/iconMeta.ts delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch02.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch02Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch03.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch03Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch04.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch04Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch05.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch05Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch06.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch06Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch07.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch07Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch08.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch08Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch09.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch09Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch10.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch10Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch11.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch11Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch12.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch12Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch13.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch13Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch14.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch14Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch15.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch15Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch16.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch16Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch17.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch17Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch18.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch18Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch19.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch19Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch20.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch20Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch21.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch21Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch22.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch22Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch23.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch23Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch24.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch24Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch25.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch25Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch26.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch26Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch27.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch27Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch28.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch28Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch29.json delete mode 100644 packages/vueforge-icons/src/lib/iconMigrationBatch29Before.json delete mode 100644 packages/vueforge-icons/src/lib/iconOpticalOffsets.json delete mode 100644 packages/vueforge-icons/src/lib/iconReferenceBefore.json delete mode 100644 packages/vueforge-icons/src/lib/iconReferenceSet.json delete mode 100644 packages/vueforge-icons/src/lib/iconShowcase.json delete mode 100644 packages/vueforge-icons/src/lib/iconVariants.ts delete mode 100644 packages/vueforge-icons/src/lib/icons.json delete mode 100644 packages/vueforge-icons/src/lib/index.ts delete mode 100644 packages/vueforge-icons/src/lib/internal/outlineIcon.ts delete mode 100644 packages/vueforge-icons/src/lib/internal/solidIconData.json delete mode 100644 packages/vueforge-icons/src/main.ts delete mode 100644 packages/vueforge-icons/tsconfig.json delete mode 100644 packages/vueforge-icons/tsconfig.smoke.json delete mode 100644 packages/vueforge-icons/vite.config.mts delete mode 100644 packages/vueforge-icons/vite.showcase.config.mts delete mode 100644 packages/vueforge-layouts/CHANGELOG.md delete mode 100644 packages/vueforge-layouts/LICENSE delete mode 100644 packages/vueforge-layouts/README.md delete mode 100644 packages/vueforge-layouts/__tests__/layouts.spec.ts delete mode 100644 packages/vueforge-layouts/__tests__/setup.ts delete mode 100644 packages/vueforge-layouts/build/layout-css-artifacts.ts delete mode 100644 packages/vueforge-layouts/env.d.ts delete mode 100644 packages/vueforge-layouts/eslint.config.js delete mode 100644 packages/vueforge-layouts/package.json delete mode 100644 packages/vueforge-layouts/scripts/check-css-contract.mjs delete mode 100644 packages/vueforge-layouts/scripts/smoke-cjs-ssr.mjs delete mode 100644 packages/vueforge-layouts/scripts/smoke-css-export.mjs delete mode 100644 packages/vueforge-layouts/src/composables/useCssVarBreakpoints.ts delete mode 100644 packages/vueforge-layouts/src/composables/useObservedElementHeight.ts delete mode 100644 packages/vueforge-layouts/src/index.ts delete mode 100644 packages/vueforge-layouts/src/plugin.ts delete mode 100644 packages/vueforge-layouts/src/primitives/VfContainer.vue delete mode 100644 packages/vueforge-layouts/src/primitives/VfGrid.vue delete mode 100644 packages/vueforge-layouts/src/primitives/VfInline.vue delete mode 100644 packages/vueforge-layouts/src/primitives/VfSection.vue delete mode 100644 packages/vueforge-layouts/src/primitives/VfStack.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfAdminLayout.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfAdminShell.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfAppShell.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfAsideArea.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfAuthLayout.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfContentArea.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfDocumentLayout.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfErrorLayout.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfFooterArea.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfHeaderArea.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfSetupLayout.vue delete mode 100644 packages/vueforge-layouts/src/shell/VfSidebarArea.vue delete mode 100644 packages/vueforge-layouts/src/shell/admin-layout.types.ts delete mode 100644 packages/vueforge-layouts/src/style-entries/admin-layout.css delete mode 100644 packages/vueforge-layouts/src/style-entries/admin-shell.css delete mode 100644 packages/vueforge-layouts/src/style-entries/app-shell.css delete mode 100644 packages/vueforge-layouts/src/style-entries/aside-area.css delete mode 100644 packages/vueforge-layouts/src/style-entries/auth-layout.css delete mode 100644 packages/vueforge-layouts/src/style-entries/container.css delete mode 100644 packages/vueforge-layouts/src/style-entries/content-area.css delete mode 100644 packages/vueforge-layouts/src/style-entries/document-layout.css delete mode 100644 packages/vueforge-layouts/src/style-entries/error-layout.css delete mode 100644 packages/vueforge-layouts/src/style-entries/footer-area.css delete mode 100644 packages/vueforge-layouts/src/style-entries/grid.css delete mode 100644 packages/vueforge-layouts/src/style-entries/header-area.css delete mode 100644 packages/vueforge-layouts/src/style-entries/inline.css delete mode 100644 packages/vueforge-layouts/src/style-entries/section.css delete mode 100644 packages/vueforge-layouts/src/style-entries/setup-layout.css delete mode 100644 packages/vueforge-layouts/src/style-entries/sidebar-area.css delete mode 100644 packages/vueforge-layouts/src/style-entries/stack.css delete mode 100644 packages/vueforge-layouts/src/style-parts/base.css delete mode 100644 packages/vueforge-layouts/src/style-parts/primitives.css delete mode 100644 packages/vueforge-layouts/src/style-parts/shell.css delete mode 100644 packages/vueforge-layouts/src/style-parts/utilities.css delete mode 100644 packages/vueforge-layouts/src/styles.css delete mode 100644 packages/vueforge-layouts/src/theme/breakpoint-registry.ts delete mode 100644 packages/vueforge-layouts/src/theme/default-preset.ts delete mode 100644 packages/vueforge-layouts/src/theme/public.ts delete mode 100644 packages/vueforge-layouts/src/theme/types.ts delete mode 100644 packages/vueforge-layouts/src/theme/utils.ts delete mode 100644 packages/vueforge-layouts/src/types/deps-shim.d.ts delete mode 100644 packages/vueforge-layouts/src/utils/classes.ts delete mode 100644 packages/vueforge-layouts/tsconfig.json delete mode 100644 packages/vueforge-layouts/vite.config.ts delete mode 100644 scripts/check-vueforge-migration.mjs delete mode 100644 scripts/check-vueforge-migration.test.mjs delete mode 100644 scripts/ci/check-frozen-showcase.mjs delete mode 100644 scripts/ci/check-packed-consumer.mjs delete mode 100644 scripts/ci/frozen-showcase.mjs delete mode 100644 scripts/ci/frozen-showcase.test.mjs delete mode 100644 scripts/ci/validate-docs-import-ownership.mjs delete mode 100644 scripts/migrate-to-codemonster-ui.mjs delete mode 100644 scripts/migrate-to-codemonster-ui.test.mjs delete mode 100644 scripts/migrate-to-v2.mjs delete mode 100644 scripts/migrate-to-v2.test.mjs delete mode 100644 scripts/migration/codemonster-ui-coverage.mjs delete mode 100644 scripts/migration/codemonster-ui-coverage.test.mjs delete mode 100644 scripts/migration/playground-design-system-exit.test.mjs delete mode 100644 scripts/migration/vueforge-baseline.mjs delete mode 100644 scripts/migration/vueforge-baseline.test.mjs delete mode 100644 scripts/migration/vueforge-mapping.mjs delete mode 100644 scripts/migration/vueforge-mapping.test.mjs delete mode 100644 scripts/visual/baseline-manifest.mjs delete mode 100644 scripts/visual/baseline-manifest.test.mjs delete mode 100644 scripts/visual/capture-showcase.mjs delete mode 100644 scripts/visual/check-baseline-manifests.mjs delete mode 100644 scripts/visual/cross-platform-reference-fixture/fixture.css delete mode 100644 scripts/visual/cross-platform-reference-fixture/index.html delete mode 100644 scripts/visual/cross-platform-reference-fixture/main.ts delete mode 100644 scripts/visual/phase-2-color-smoke.mjs delete mode 100644 scripts/visual/reference-baseline.test.mjs delete mode 100644 scripts/visual/serve-cross-platform-reference.mjs delete mode 100644 scripts/visual/showcase-state-cases.mjs delete mode 100644 scripts/visual/showcase-state-cases.test.mjs delete mode 100644 visual-baselines/vueforge-showcase-states/manifest.json delete mode 100644 visual-baselines/vueforge-showcase-states/state--active--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--active--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--active--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--active--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--closed--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--closed--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--closed--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--closed--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--disabled--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--disabled--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--disabled--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--disabled--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--focus-visible--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--focus-visible--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--focus-visible--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--focus-visible--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--hover--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--hover--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--hover--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--hover--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--indeterminate--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--indeterminate--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--indeterminate--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--indeterminate--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--invalid--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--invalid--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--invalid--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--invalid--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--loading--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--loading--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--loading--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--loading--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--open--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--open--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--open--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--open--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--reduced-motion--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--reduced-motion--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--reduced-motion--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--reduced-motion--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--selected--dark--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--selected--dark--mobile.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--selected--light--desktop.png delete mode 100644 visual-baselines/vueforge-showcase-states/state--selected--light--mobile.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--dark--mobile--06.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/codeblock--light--mobile--06.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--05.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--06.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--07.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--08.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--09.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--10.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--11.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--12.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--13.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--14.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--15.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--16.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--17.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--18.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--19.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--20.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--21.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--22.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--23.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--24.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--25.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--26.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--desktop--27.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--06.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--07.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--08.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--09.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--10.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--11.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--12.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--13.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--14.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--15.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--16.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--17.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--18.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--19.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--20.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--21.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--22.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--23.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--24.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--25.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--26.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--27.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--28.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--29.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--30.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--31.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--32.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--33.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--34.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--35.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--36.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--37.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--38.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--39.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--40.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--41.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--42.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--43.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--44.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--45.png delete mode 100644 visual-baselines/vueforge-showcase/core--dark--mobile--46.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--05.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--06.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--07.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--08.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--09.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--10.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--11.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--12.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--13.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--14.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--15.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--16.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--17.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--18.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--19.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--20.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--21.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--22.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--23.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--24.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--25.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--26.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--desktop--27.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--06.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--07.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--08.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--09.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--10.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--11.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--12.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--13.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--14.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--15.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--16.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--17.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--18.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--19.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--20.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--21.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--22.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--23.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--24.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--25.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--26.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--27.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--28.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--29.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--30.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--31.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--32.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--33.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--34.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--35.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--36.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--37.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--38.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--39.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--40.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--41.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--42.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--43.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--44.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--45.png delete mode 100644 visual-baselines/vueforge-showcase/core--light--mobile--46.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--05.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--06.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--07.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--08.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--09.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--desktop--10.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--06.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--07.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--08.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--09.png delete mode 100644 visual-baselines/vueforge-showcase/icons--dark--mobile--10.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--05.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--06.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--07.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--08.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--09.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--desktop--10.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--06.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--07.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--08.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--09.png delete mode 100644 visual-baselines/vueforge-showcase/icons--light--mobile--10.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--05.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--06.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--07.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--08.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--09.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--10.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--desktop--11.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--mobile--06.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--mobile--07.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--dark--mobile--08.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--05.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--06.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--07.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--08.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--09.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--10.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--desktop--11.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--mobile--06.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--mobile--07.png delete mode 100644 visual-baselines/vueforge-showcase/layouts--light--mobile--08.png delete mode 100644 visual-baselines/vueforge-showcase/manifest.json delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--desktop--05.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/playground--dark--mobile--05.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--desktop--01.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--desktop--02.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--desktop--03.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--desktop--04.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--desktop--05.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--mobile--01.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--mobile--02.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--mobile--03.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--mobile--04.png delete mode 100644 visual-baselines/vueforge-showcase/playground--light--mobile--05.png diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6e8e35e..d70b2b0c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,8 +64,6 @@ jobs: - name: Typecheck workspaces run: npm run typecheck - - name: Guard the frozen showcase - run: npm run check:frozen-showcase - name: Typecheck documented examples run: npm run check:docs:examples @@ -94,9 +92,6 @@ jobs: - name: Check CodeMonster UI contracts, accessibility, and visual fixtures run: npm run test:ui - - name: Run migration tests - run: npm run test:migration - - name: Run release preparation tests run: npm run test:release-prep @@ -119,8 +114,8 @@ jobs: - name: Install dependencies run: npm ci - # The suite hides dist itself; the build is still needed for its other output, such as the - # generated theme CSS that vueforge-core's parity check reads. + # The suite hides dist itself; the build is still needed for its other output, such as + # generated CSS that some workspaces' own tests read back. - name: Build packages run: npm run build @@ -155,9 +150,6 @@ jobs: - name: Check consumer tree shaking run: npm run check:consumer-tree-shaking - - name: Check deferred runtime budgets - run: npm run check:deferred-budgets - - name: Dry-run publish artifacts run: npm run pack:all:dry-run @@ -260,12 +252,8 @@ jobs: unzip -q "${RUNNER_TEMP}/chrome-for-testing.zip" -d "${RUNNER_TEMP}" "${chrome_for_testing_path}" --version - - name: Verify frozen showcase visuals + - name: Verify cross-platform adapter visuals env: - SHOWCASE_CAPTURE: ${{ runner.temp }}/codemonster-showcase-current - SHOWCASE_DIFF: ${{ runner.temp }}/codemonster-showcase-diff - SHOWCASE_STATE_CAPTURE: ${{ runner.temp }}/codemonster-showcase-state-current - SHOWCASE_STATE_DIFF: ${{ runner.temp }}/codemonster-showcase-state-diff CROSS_PLATFORM_CAPTURE: ${{ runner.temp }}/codemonster-cross-platform-current CROSS_PLATFORM_RAZOR_DIFF: ${{ runner.temp }}/codemonster-cross-platform-razor-diff CROSS_PLATFORM_RAZOR_FIXTURES: ${{ runner.temp }}/codemonster-cross-platform-razor.json @@ -274,8 +262,6 @@ jobs: set -euo pipefail chrome_for_testing_path="${RUNNER_TEMP}/chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing" - npm run dev -w @codemonster-ru/vueforge-playground-example -- --host 127.0.0.1 --port 5175 > "${RUNNER_TEMP}/codemonster-showcase-vite.log" 2>&1 & - vite_pid=$! npm run visual:cross-platform:razor-render -- --output="${CROSS_PLATFORM_RAZOR_FIXTURES}" npm run visual:cross-platform:serve -- --razor-fixtures="${CROSS_PLATFORM_RAZOR_FIXTURES}" --port=5176 > "${RUNNER_TEMP}/codemonster-cross-platform-vite.log" 2>&1 & adapter_pid=$! @@ -283,16 +269,15 @@ jobs: chrome_pid=$! cleanup() { - kill "${vite_pid}" "${adapter_pid}" "${chrome_pid}" 2>/dev/null || true + kill "${adapter_pid}" "${chrome_pid}" 2>/dev/null || true } trap cleanup EXIT for attempt in {1..60}; do - if curl --fail --silent http://127.0.0.1:5175/ >/dev/null && curl --fail --silent 'http://127.0.0.1:5176/?case=button-default&platform=vue&theme=light' >/dev/null && curl --fail --silent http://127.0.0.1:9226/json/version >/dev/null; then + if curl --fail --silent 'http://127.0.0.1:5176/?case=button-default&platform=vue&theme=light' >/dev/null && curl --fail --silent http://127.0.0.1:9226/json/version >/dev/null; then break fi if [ "${attempt}" -eq 60 ]; then - cat "${RUNNER_TEMP}/codemonster-showcase-vite.log" cat "${RUNNER_TEMP}/codemonster-cross-platform-vite.log" cat "${RUNNER_TEMP}/codemonster-showcase-chrome.log" exit 1 @@ -300,28 +285,19 @@ jobs: sleep 1 done - node scripts/visual/capture-showcase.mjs --origin=http://127.0.0.1:5175 --output="${SHOWCASE_CAPTURE}" --label=ci-current - node scripts/visual/compare-showcase.mjs --baseline=visual-baselines/vueforge-showcase --current="${SHOWCASE_CAPTURE}" --diff="${SHOWCASE_DIFF}" - npm run visual:showcase:states:capture -- --origin=http://127.0.0.1:5175 --output="${SHOWCASE_STATE_CAPTURE}" --label=ci-state-current - npm run visual:showcase:states:compare -- --current="${SHOWCASE_STATE_CAPTURE}" --diff="${SHOWCASE_STATE_DIFF}" npm run visual:cross-platform:capture -- --origin=http://127.0.0.1:5176 --output="${CROSS_PLATFORM_CAPTURE}" --label=ci-actual-adapters node scripts/visual/compare-showcase.mjs --baseline=visual-baselines/vueforge-cross-platform --current="${CROSS_PLATFORM_CAPTURE}/vue" --diff="${CROSS_PLATFORM_VUE_DIFF}" --threshold=4 node scripts/visual/compare-showcase.mjs --baseline=visual-baselines/vueforge-cross-platform --current="${CROSS_PLATFORM_CAPTURE}/razor" --diff="${CROSS_PLATFORM_RAZOR_DIFF}" --threshold=4 - - name: Upload showcase visual differences + - name: Upload cross-platform visual differences if: failure() uses: actions/upload-artifact@v7 with: - name: codemonster-showcase-visual-diff + name: codemonster-cross-platform-visual-diff path: | - ${{ runner.temp }}/codemonster-showcase-current - ${{ runner.temp }}/codemonster-showcase-diff - ${{ runner.temp }}/codemonster-showcase-state-current - ${{ runner.temp }}/codemonster-showcase-state-diff ${{ runner.temp }}/codemonster-cross-platform-current ${{ runner.temp }}/codemonster-cross-platform-vue-diff ${{ runner.temp }}/codemonster-cross-platform-razor-diff ${{ runner.temp }}/codemonster-cross-platform-vite.log - ${{ runner.temp }}/codemonster-showcase-vite.log ${{ runner.temp }}/codemonster-showcase-chrome.log if-no-files-found: ignore diff --git a/.github/workflows/refresh-visual-baselines.yml b/.github/workflows/refresh-visual-baselines.yml deleted file mode 100644 index f1e3e0a6..00000000 --- a/.github/workflows/refresh-visual-baselines.yml +++ /dev/null @@ -1,118 +0,0 @@ -name: Refresh Visual Baselines - -on: - workflow_dispatch: - -permissions: - contents: write - -jobs: - refresh: - runs-on: macos-26 - env: - CHROME_FOR_TESTING_VERSION: 151.0.7922.138 - - steps: - - name: Checkout - uses: actions/checkout@v7 - with: - ref: main - fetch-depth: 0 - - - name: Setup Node.js - uses: actions/setup-node@v6 - with: - node-version: 24 - cache: npm - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.4' - tools: composer - - - name: Install dependencies - run: npm ci - - - name: Build packages - run: npm run build - - - name: Install Razor visual runtime - run: composer --working-dir=packages/razor update --no-dev --no-interaction --prefer-dist - - - name: Build the frozen reference showcase - run: | - set -euo pipefail - reference_commit="$(node -p "require('./contracts/visual.config.json').reference.commit")" - git worktree add --detach "${RUNNER_TEMP}/vueforge-reference" "${reference_commit}" - cd "${RUNNER_TEMP}/vueforge-reference" - npm ci - npm run build - - - name: Install pinned Chrome for visual checks - run: | - chrome_for_testing_path="${RUNNER_TEMP}/chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing" - curl --fail --location --retry 3 --silent --show-error \ - "https://storage.googleapis.com/chrome-for-testing-public/${CHROME_FOR_TESTING_VERSION}/mac-arm64/chrome-mac-arm64.zip" \ - --output "${RUNNER_TEMP}/chrome-for-testing.zip" - unzip -q "${RUNNER_TEMP}/chrome-for-testing.zip" -d "${RUNNER_TEMP}" - "${chrome_for_testing_path}" --version - - - name: Capture and commit baselines - run: | - set -euo pipefail - chrome_for_testing_path="${RUNNER_TEMP}/chrome-mac-arm64/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing" - showcase_capture="${RUNNER_TEMP}/codemonster-showcase-reference" - state_capture="${RUNNER_TEMP}/codemonster-showcase-state-reference" - cross_platform_capture="${RUNNER_TEMP}/codemonster-cross-platform-current" - cross_platform_reference="${RUNNER_TEMP}/codemonster-cross-platform-reference" - razor_fixtures="${RUNNER_TEMP}/codemonster-cross-platform-razor.json" - - (cd "${RUNNER_TEMP}/vueforge-reference" && npm run dev -w @codemonster-ru/vueforge-playground-example -- --host 127.0.0.1 --port 5175) > "${RUNNER_TEMP}/codemonster-showcase-vite.log" 2>&1 & - vite_pid=$! - npm run visual:cross-platform:razor-render -- --output="${razor_fixtures}" - npm run visual:cross-platform:serve -- --razor-fixtures="${razor_fixtures}" --port=5176 > "${RUNNER_TEMP}/codemonster-cross-platform-vite.log" 2>&1 & - adapter_pid=$! - "${chrome_for_testing_path}" --headless=new --remote-debugging-port=9226 --user-data-dir="${RUNNER_TEMP}/codemonster-showcase-chrome" --disable-gpu --no-first-run --no-default-browser-check about:blank > "${RUNNER_TEMP}/codemonster-showcase-chrome.log" 2>&1 & - chrome_pid=$! - cleanup() { kill "${vite_pid}" "${adapter_pid}" "${chrome_pid}" 2>/dev/null || true; } - trap cleanup EXIT - - for attempt in {1..60}; do - if curl --fail --silent http://127.0.0.1:5175/ >/dev/null && curl --fail --silent 'http://127.0.0.1:5176/?case=button-default&platform=vue&theme=light' >/dev/null && curl --fail --silent http://127.0.0.1:9226/json/version >/dev/null; then - break - fi - if [ "${attempt}" -eq 60 ]; then exit 1; fi - sleep 1 - done - - # Ports 5175 serves the frozen reference commit; 5176 serves the current adapters. The - # reference names Inter in its tokens but never shipped it, so its captures are given the - # faces the product now ships; without that a baseline records a system fallback. - node scripts/visual/capture-showcase.mjs --origin=http://127.0.0.1:5175 --output="${showcase_capture}" --label=vueforge-reference --font=inject - npm run visual:showcase:states:capture -- --origin=http://127.0.0.1:5175 --output="${state_capture}" --label=vueforge-state-reference --font=inject - # The adapter capture checks Vue against Razor; it must never become the cross-platform - # baseline, because a baseline taken from the product cannot prove anything about the - # reference. The baseline itself is captured from the reference checkout below. - npm run visual:cross-platform:capture -- --origin=http://127.0.0.1:5176 --output="${cross_platform_capture}" --label=vueforge-cross-platform-current - node scripts/visual/compare-showcase.mjs --baseline="${cross_platform_capture}/vue" --current="${cross_platform_capture}/razor" - - npm run visual:cross-platform:reference:serve -- --reference="${RUNNER_TEMP}/vueforge-reference" --port=5178 > "${RUNNER_TEMP}/codemonster-cross-platform-reference.log" 2>&1 & - reference_fixture_pid=$! - for attempt in {1..60}; do - if curl --fail --silent 'http://127.0.0.1:5178/?case=button-default&theme=light' >/dev/null; then break; fi - if [ "${attempt}" -eq 60 ]; then cat "${RUNNER_TEMP}/codemonster-cross-platform-reference.log"; exit 1; fi - sleep 1 - done - npm run visual:cross-platform:reference:capture -- --origin=http://127.0.0.1:5178 --output="${cross_platform_reference}" --label=vueforge-cross-platform-reference-vue --font=inject - kill "${reference_fixture_pid}" 2>/dev/null || true - - cp -R "${showcase_capture}/." visual-baselines/vueforge-showcase/ - cp -R "${state_capture}/." visual-baselines/vueforge-showcase-states/ - cp -R "${cross_platform_reference}/." visual-baselines/vueforge-cross-platform/ - npm exec -- prettier --write visual-baselines/*/manifest.json - git config user.name 'github-actions[bot]' - git config user.email '41898282+github-actions[bot]@users.noreply.github.com' - git add visual-baselines - git diff --cached --quiet || git commit -m 'Refresh visual baselines' - git push origin main diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 177edc76..e2795d8d 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1,16 +1,17 @@ # CodeMonster UI Monorepo Architecture -This repository contains the CodeMonster UI package line, the retained VueForge products, shared -contracts, cross-platform examples, and the tooling used to validate and publish them. +This repository contains the CodeMonster UI package line, shared contracts, cross-platform +examples, and the tooling used to validate and publish them. CodeMonster UI succeeds VueForge, the +Vue-only design system this project migrated from; VueForge is sunset, and its own packages and +documentation now live in [`codemonster-ru/vueforge`](https://github.com/codemonster-ru/vueforge). ## Repository layout - `packages/*` — publishable npm packages and the Annabel Razor adapter - `examples/*` — local runnable examples for Vue and Annabel Razor - `contracts/*` — component manifests, behavior contracts, schemas, and visual-fixture metadata -- `docs/*` — product, package, architecture, migration, and release documentation -- `migration/*` — machine-readable VueForge-to-CodeMonster UI migration data and checks -- `scripts/*` — build, CI, contract, migration, release, and visual-validation tooling +- `docs/*` — product, package, architecture, and release documentation +- `scripts/*` — build, CI, contract, release, and visual-validation tooling - `visual-baselines/*` — reviewed visual-regression reference images used by CI - `.github/*` — repository workflows; `.githooks/*` — local Git hooks @@ -32,27 +33,13 @@ Each publishable npm package should keep a consistent shape: - `test/*` The `razor` package follows Composer conventions and keeps its PHP metadata and tests alongside -the adapter source. Shared CodeMonster UI packages use the `ui-*` naming line; retained VueForge -products keep their published `vueforge-*` names while they are in maintenance. +the adapter source. Every publishable npm package uses the `ui-*` naming line. ## Naming conventions -### Vue components - -- Component file names: `Vf*.vue` -- Public component names and plugin registrations: `Vf*` -- No `Vue*`/legacy aliases in public API - -### CSS classes and tokens - -- Base namespace: `vf-` -- Package namespaces: - - `core`: `vf-*` - - `layouts`: `vf-layout-*` (plus component-specific `vf-*` blocks) - - `codeblock`: `vf-codeblock*` / `--vf-codeblock-*` - - `playground`: `vf-playground*` / `--vf-playground-*` - - `icons`: `vf-icon*` / `--vf-icon-*` -- Legacy prefixes (`vif*`, `vcb*`, `cm-*`) are not used for new code. +Component names, CSS classes, custom properties, and runtime hooks all use the `Cm`/`cm-` prefix. +See [naming and prefixes](./docs/architecture/naming-and-prefixes.md) for the full, authoritative +table; it is not duplicated here so there is one place to keep it correct. ## Shared behavior layer @@ -105,9 +92,9 @@ Each publishable npm package should expose, where applicable: root `format:check`, which runs with `--if-present`, so its formatting goes unverified. - `prepack` (usually calls `build`) -The root scripts compose package checks with repository-level documentation, contract, migration, -consumer, and visual checks. New repository checks should be added to the root workflow only when -they validate a cross-package invariant. +The root scripts compose package checks with repository-level documentation, contract, consumer, +and visual checks. New repository checks should be added to the root workflow only when they +validate a cross-package invariant. ## Release hygiene diff --git a/README.md b/README.md index 5f97c0ad..228c6de5 100644 --- a/README.md +++ b/README.md @@ -18,23 +18,18 @@ composer require codemonster-ru/ui-razor:^1.1.0 ``` See the [CodeMonster UI 1.1 release notes](./docs/codemonster-ui-1.1-release-notes.md), -[component documentation](./docs/components/button.md), -[CSS-only guide](./docs/css/getting-started.md), and -[VueForge migration guide](./docs/vueforge-to-codemonster-ui.md). +[component documentation](./docs/components/button.md), and +[CSS-only guide](./docs/css/getting-started.md). -Local runnable examples are available in [`examples/vue`](./examples/vue) for Vue +Local runnable examples are available in [`examples/ui-showcase`](./examples/ui-showcase) for Vue and [`examples/razor`](./examples/razor) for Annabel Razor/PHP. -## VueForge maintenance +## VueForge -VueForge design-system foundations are in maintenance. They receive critical security and -correctness fixes, but no new component families or design-system foundations. Use -[CodeMonster UI 1.1](./docs/codemonster-ui-1.1-release-notes.md) for new shared Vue and Annabel Razor UI -work. - -Existing VueForge releases remain installable and are not being unpublished. Icons remain -supported until a verified replacement exists. CodeBlock and the Playground packages remain -separately maintained products and can be used alongside CodeMonster UI. +CodeMonster UI succeeds VueForge, the Vue-only design system this project migrated from. VueForge +is sunset: no new components, no new fixes. Its packages and documentation now live in +[`codemonster-ru/vueforge`](https://github.com/codemonster-ru/vueforge), where existing consumers +can continue to install them; nothing in this repository builds or publishes them anymore. ### Requirements @@ -44,93 +39,11 @@ separately maintained products and can be used alongside CodeMonster UI. - Published packages may declare narrower runtime requirements in their own manifests; consult the package documentation when consuming them outside this repository. -### Existing VueForge applications - -Use the package manager that owns your application lockfile: - -```bash -npm install vue@^3.5.0 @codemonster-ru/vueforge-core@^2.4.0 -``` - -```bash -pnpm add vue@^3.5.0 @codemonster-ru/vueforge-core@^2.4.0 -``` - -```bash -yarn add vue@^3.5.0 @codemonster-ru/vueforge-core@^2.4.0 -``` - -### Quick start - -Install the Core plugin once and import its complete stylesheet in the browser entry: - -```ts -// src/main.ts -import { createApp } from 'vue'; -import VueForgeCore from '@codemonster-ru/vueforge-core'; -import '@codemonster-ru/vueforge-core/styles.css'; -import App from './App.vue'; - -createApp(App).use(VueForgeCore).mount('#app'); -``` - -Wrap themed UI in `VfThemeProvider`. Components are not registered globally, so import the -components used by each application: - -```vue - - - - -``` - -`VfThemeSwitch` persists the selected light or dark mode through the provider. Build the -application with its normal production command—for a standard Vite project: - -```bash -npm run build -``` - -### Packages - -| Package | Release | Purpose | -| ------------------------------------------------------------- | ------- | ------------------------------------------ | -| [`@codemonster-ru/vueforge-core`][npm-core] | `2.4.0` | Components, composables, theme integration | -| [`@codemonster-ru/vueforge-theme`][npm-theme] | `2.0.1` | Framework-agnostic theme engine | -| [`@codemonster-ru/vueforge-layouts`][npm-layouts] | `2.1.2` | Layout primitives and application shells | -| [`@codemonster-ru/vueforge-icons`][npm-icons] | `3.2.0` | Vue icon renderer and catalog | -| [`@codemonster-ru/vueforge-codeblock`][npm-codeblock] | `4.0.1` | Highlighted, themed code blocks | -| [`@codemonster-ru/vueforge-playground`][npm-playground] | `3.0.1` | Vue playground UI adapter | -| [`@codemonster-ru/vueforge-playground-core`][npm-pg-core] | `2.1.0` | Framework-agnostic playground runtime | -| [`@codemonster-ru/vueforge-playground-vite-plugin`][npm-vite] | `1.0.0` | Vite playground virtual-module integration | - ### Documentation -For full documentation, visit [docs.codemonster.net/vueforge](https://docs.codemonster.net/vueforge/). -Use the [VueForge 2 migration guide](./docs/migration-to-v2.md) for breaking changes and the -[release notes](./docs/release-notes.md) for the coordinated package changes. New applications can -adopt CodeMonster UI for shared Vue and Annabel Razor components. Existing applications should use -the [VueForge to CodeMonster UI migration guide](./docs/vueforge-to-codemonster-ui.md) for package -and component replacements, retained products, manual migrations, and the deterministic codemod. +Start at [the documentation index](./docs/index.md) and see the +[release notes](./docs/release-notes.md) for coordinated package changes. ## License -VueForge packages are available under the [MIT License](./LICENSE). - -[npm-codeblock]: https://www.npmjs.com/package/@codemonster-ru/vueforge-codeblock -[npm-core]: https://www.npmjs.com/package/@codemonster-ru/vueforge-core -[npm-icons]: https://www.npmjs.com/package/@codemonster-ru/vueforge-icons -[npm-layouts]: https://www.npmjs.com/package/@codemonster-ru/vueforge-layouts -[npm-pg-core]: https://www.npmjs.com/package/@codemonster-ru/vueforge-playground-core -[npm-playground]: https://www.npmjs.com/package/@codemonster-ru/vueforge-playground -[npm-theme]: https://www.npmjs.com/package/@codemonster-ru/vueforge-theme -[npm-vite]: https://www.npmjs.com/package/@codemonster-ru/vueforge-playground-vite-plugin +CodeMonster UI packages are available under the [MIT License](./LICENSE). diff --git a/contracts/visual.config.json b/contracts/visual.config.json index 92cfc31d..37c47217 100644 --- a/contracts/visual.config.json +++ b/contracts/visual.config.json @@ -1,8 +1,7 @@ { "schemaVersion": 2, "reference": { - "commit": "fd793696f50d3be0fcd3788f0f8f751c63869963", - "routes": ["core", "layouts", "icons", "codeblock", "playground"] + "commit": "fd793696f50d3be0fcd3788f0f8f751c63869963" }, "themes": [ { diff --git a/contracts/visual.states.json b/contracts/visual.states.json deleted file mode 100644 index 4dc52630..00000000 --- a/contracts/visual.states.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "schemaVersion": 1, - "states": [ - { - "id": "hover", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] :is(.vf-button, .cm-button):not(:disabled)", - "pseudoClasses": ["hover"] - }, - { - "id": "active", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] :is(.vf-button, .cm-button):not(:disabled)", - "pseudoClasses": ["active"] - }, - { - "id": "focus-visible", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] :is(.vf-button, .cm-button):not(:disabled)", - "pseudoClasses": ["focus", "focus-visible"] - }, - { - "id": "disabled", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] :is(.vf-button, .cm-button):disabled" - }, - { - "id": "invalid", - "route": "core", - "selector": "[data-test=\"form-geometry-matrix\"] [aria-invalid=\"true\"]" - }, - { - "id": "selected", - "route": "core", - "selector": "[role=\"tab\"][aria-selected=\"true\"]" - }, - { - "id": "open", - "route": "core", - "selector": "[data-test=\"navigation-geometry-matrix\"] :is(.vf-accordion__trigger, .cm-accordion__trigger)[aria-expanded=\"true\"]", - "padding": 160 - }, - { - "id": "closed", - "route": "core", - "selector": "[data-test=\"navigation-geometry-matrix\"] :is(.vf-accordion__trigger, .cm-accordion__trigger)[aria-expanded=\"false\"]", - "padding": 80 - }, - { - "id": "loading", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] [aria-busy=\"true\"]" - }, - { - "id": "indeterminate", - "route": "core", - "selector": "[role=\"progressbar\"][aria-label=\"Background sync progress\"]" - }, - { - "id": "reduced-motion", - "route": "core", - "selector": ":is(.vf-progress-bar--animated, .cm-progress-bar--animated)", - "media": "reduce", - "assertReducedMotion": true - } - ] -} diff --git a/docs/architecture/application-shell-ownership.md b/docs/architecture/application-shell-ownership.md index 0e59a6c7..979537a1 100644 --- a/docs/architecture/application-shell-ownership.md +++ b/docs/architecture/application-shell-ownership.md @@ -78,9 +78,8 @@ canonical. ## CMUI-188 verification -The boundary was re-verified on 2026-08-15 against the -[representative consumer inventory](../verification/consumer-usage-inventory.md) after the portable -components and maintained recipes were delivered. +The boundary was re-verified on 2026-08-15 against the representative consumer inventory after the +portable components and maintained recipes were delivered. | Reconsideration criterion | Consumer evidence | Result | | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | diff --git a/docs/codeblock/api/index.md b/docs/codeblock/api/index.md deleted file mode 100644 index 40a32a10..00000000 --- a/docs/codeblock/api/index.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: 'API' -description: 'Public API reference for the codeblock package' -order: 3 ---- - -# API - -Reference for package-level exports and runtime helpers available in `@codemonster-ru/vueforge-codeblock`. - -## Overview - -Public API surface of `@codemonster-ru/vueforge-codeblock`. - -This page documents the package-level API (plugin entry, exports, helpers, and types), not only the `VfCodeBlock` component tab API. - -Subpath exports: - -- `@codemonster-ru/vueforge-codeblock/view` (component/plugin-oriented entry) -- `@codemonster-ru/vueforge-codeblock/highlight` (highlight helpers) -- `@codemonster-ru/vueforge-codeblock/style.css` -- `@codemonster-ru/vueforge-codeblock/tokens.css` -- `@codemonster-ru/vueforge-codeblock/codeblock.css` -- `@codemonster-ru/vueforge-codeblock/critical.css` - -Migration note: - -- Root entrypoint `@codemonster-ru/vueforge-codeblock` removed. -- Use `@codemonster-ru/vueforge-codeblock/view` for plugin/component API. -- Use `@codemonster-ru/vueforge-codeblock/highlight` for highlight helpers. - -## Plugin and Component - -The following items are listed in this section: - -- `default` (`Plugin`): registers `VfCodeBlock`. -- `VfCodeBlock`: standalone component. - -```ts -import VueForgeCodeBlock from '@codemonster-ru/vueforge-codeblock/view'; -app.use(VueForgeCodeBlock, { - themeScope: '#docs-root', - allowedLanguages: ['ts', 'vue', 'json'], - preloadLanguages: ['ts', 'vue'], -}); -``` - -Plugin options: - -- `themeVars?: { base?, light?, dark? }`: runtime CSS variable groups. -- `themeScope?: string`: selector used for runtime theme variables (`:root` by default). -- `styleNonce?: string`: CSP nonce applied to the generated runtime style element. -- `allowedLanguages?: string[]`: global runtime allowlist. -- `preloadLanguages?: string[]`: preloads selected languages on plugin install (non-blocking, respects allowlist). - -## Highlight Helpers - -The following items are listed in this section: - -- `escapeCodeHtml(code: string): string` -- `renderPlainCodeLines(code: string): string[]` -- `highlightCodeLine(language: string, line: string, theme?: 'light' | 'dark', highlight?: boolean, options?: CodeBlockHighlightOptions): Promise` -- `highlightCodeLines(language: string, code: string, theme: 'light' | 'dark', highlight?: boolean, options?: CodeBlockHighlightOptions): Promise` -- `highlightCodeBlock(language: string, code: string, theme?: 'light' | 'dark', highlight?: boolean, options?: CodeBlockHighlightOptions): Promise` -- `preloadCodeBlockLanguages(languages: string[], allowedLanguages?: string[]): Promise` - -`CodeBlockHighlightOptions` accepts `allowedLanguages?: string[]` and -`fallbackLanguage?: 'plaintext' | 'text'`. - -## Runtime Theme Helper - -The code snippet below illustrates this section. - -```ts -import { setCodeBlockThemeVars } from '@codemonster-ru/vueforge-codeblock/view'; - -setCodeBlockThemeVars( - { - base: { - '--vf-codeblock-border-color': 'var(--vf-color-border-default)', - }, - }, - { themeScope: '#docs-root' }, -); -``` - -Injects CSS variables into a runtime ` -``` -```` - -Enable `multiSort` to let users add criteria with regular clicks. The `sort` array stores criteria -in priority order and the headers display that priority. Clicking a sorted column cycles through -ascending, descending, and removal without clearing the other criteria. - -When an API provides already-paged rows, use manual pagination. Manual pagination always leaves row -ordering to the consumer, preventing the component from sorting only the current page: - -```vue - -``` - -Changing the sort resets pagination to page 1. Map column keys to the API's field names in the -consumer; the table does not prescribe a server query format. - -## Pagination - -Client pagination slices local rows. The paginator shows page numbers in a compact range. The first -and last pages remain available, pages around the current position are shown directly, and omitted -ranges are represented by non-interactive ellipses. - -```vue - -``` - -The current page uses `aria-current="page"`. Number buttons use `labels.goToPage`, while the current -button uses `labels.pageSummary`. Previous and next controls retain their localized labels. -Below the VueForge `xs` container threshold, the paginator keeps only the previous, current, and -next page controls visible so it does not overflow narrow table regions. - -Use `paginationMode="manual"` with `totalRows` when rows are already paged by an API. The same page -range is calculated from `totalRows` and `pageSize`; fetching remains consumer-owned. diff --git a/docs/core/components/data-table/index.md b/docs/core/components/data-table/index.md deleted file mode 100644 index ea06d2af..00000000 --- a/docs/core/components/data-table/index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: 'Data Table' -description: 'Data-driven table component' -order: 38 ---- - -# Data Table - -Data-driven table component for rendering rows from column definitions. - -Use `VfDataTable` when the table is backed by structured records. Use `VfTable` when you need direct semantic table markup. - -## Tabs - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/data-table/theming.md b/docs/core/components/data-table/theming.md deleted file mode 100644 index ab927437..00000000 --- a/docs/core/components/data-table/theming.md +++ /dev/null @@ -1,26 +0,0 @@ -# Theming - -`VfDataTable` reuses the table token namespace. - -Skeleton loading rows reuse the `VfSkeleton` token namespace. Spinner loading reuses the `VfProgressSpinner` token namespace. - -Selection controls reuse the `VfCheckbox` token namespace. - -Pinned columns reuse table background, stripe, header, and border tokens. - -| Token | Purpose | -| ------------------------------ | ---------------------------------------------- | -| `tableBorderColor` | Outer, row, and optional column divider color. | -| `tableBackground` | Base table background. | -| `tableColor` | Body cell text color. | -| `tableCaptionColor` | Caption text color. | -| `tableHeadBackground` | Header row background. | -| `tableHeadColor` | Header cell text color. | -| `tableFootBackground` | Footer row background. | -| `tableFootColor` | Footer text color. | -| `tableStripeBackground` | Alternating row background. | -| `dataTableStateColor` | Empty and loading state text color. | -| `dataTableErrorColor` | Error state text color. | -| `dataTablePaginationColor` | Pagination metadata color. | -| `dataTablePaginationPageColor` | Current page color. | -| `dataTableColumnResizerColor` | Resize and reorder interaction color. | diff --git a/docs/core/components/date-picker/api.md b/docs/core/components/date-picker/api.md deleted file mode 100644 index 08794979..00000000 --- a/docs/core/components/date-picker/api.md +++ /dev/null @@ -1,75 +0,0 @@ -# API - -Public component contract: props, events, model formats, and related types. - -## Props - -| Name | Type | Default | Description | -| ------------------ | ---------------------------------------- | ---------------- | ---------------------------------------------------------------------------------------- | -| `modelValue?` | `string \| string[]` | `''` | Controlled value. Array values are used by `multiple` and `range`. | -| `min?` | `string` | — | Inclusive lower boundary in the active model format. | -| `max?` | `string` | — | Inclusive upper boundary in the active model format. | -| `multiple?` | `boolean` | `false` | Allows toggling multiple values without closing the picker. | -| `range?` | `boolean` | `false` | Selects a sorted start/end pair. Range mode takes precedence over `multiple`. | -| `monthPicker?` | `boolean` | `false` | Selects months and uses `YYYY-MM` values. | -| `yearPicker?` | `boolean` | `false` | Selects years and uses `YYYY` values. Year mode takes precedence over month mode. | -| `showTime?` | `boolean` | `false` | Adds hour/minute controls and emits `YYYY-MM-DDTHH:mm`; ignored in month and year modes. | -| `minuteStep?` | `number` | `1` | Minute interval, normalized to an integer from 1 through 60. | -| `locale?` | `string \| string[]` | runtime locale | Locale preference passed to `Intl.DateTimeFormat`. | -| `displayFormat?` | `string` | localized | Display pattern using `yyyy`, `yy`, `MM`, `M`, `dd`, `d`, `HH`, `H`, `mm`, and `m`. | -| `firstDayOfWeek?` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6` | `1` | First weekday, where `0` is Sunday and `1` is Monday. | -| `size?` | `'sm' \| 'md' \| 'lg'` | `'md'` | Trigger size. | -| `invalid?` | `boolean` | `false` | Applies invalid styling and `aria-invalid`. | -| `disabled?` | `boolean` | `false` | Disables the trigger and generated hidden form controls. | -| `readonly?` | `boolean` | `false` | Prevents opening, clearing, and value changes while preserving the value. | -| `clearable?` | `boolean` | `false` | Shows a clear action when a value is present. | -| `placeholder?` | `string` | — | Text shown while the value is empty outside a floating-label field. | -| `placement?` | `'bottom-start' \| 'bottom-end'` | `'bottom-start'` | Preferred floating placement; the calendar may flip above the trigger. | -| `teleportTo?` | `string \| HTMLElement \| null \| false` | `document.body` | Calendar teleport target. Use `null` or `false` to render beside the trigger. | -| `disableTeleport?` | `boolean` | `false` | Disables teleporting regardless of `teleportTo`. | -| `labels?` | `Partial` | `{}` | Overrides visible and accessible calendar labels. | - -Standard `id`, `name`, `class`, `style`, `title`, `tabindex`, `aria-*`, and `data-*` attributes -are supported. A string `name` creates hidden form inputs containing the unchanged model values. - -## Emits - -| Name | Parameters | ReturnType | Description | -| ------------------- | ----------------------------- | ---------- | ---------------------------------------------- | -| `update:modelValue` | `[value: string \| string[]]` | `void` | Emitted whenever the controlled value changes. | - -## Slots - -`VfDatePicker` has no public slots. - -## Model formats - -| Mode | Value format | Empty value | -| -------------------------- | ---------------------- | ----------- | -| Default day picker | `YYYY-MM-DD` | `''` | -| Day picker with `showTime` | `YYYY-MM-DDTHH:mm` | `''` | -| `monthPicker` | `YYYY-MM` | `''` | -| `yearPicker` | `YYYY` | `''` | -| `multiple` or `range` | Array of active format | `[]` | - -Display localization and `displayFormat` never change these model or form-submission values. - -## Types - -### `VfDatePickerLabels` - -The `labels` prop accepts a partial object. Omitted values retain the built-in English labels. - -| Name | Type | Default | -| ----------------- | -------- | ------------------- | -| `calendar` | `string` | `'Choose date'` | -| `clear` | `string` | `'Clear date'` | -| `previousMonth` | `string` | `'Previous month'` | -| `nextMonth` | `string` | `'Next month'` | -| `previousYear?` | `string` | `'Previous year'` | -| `nextYear?` | `string` | `'Next year'` | -| `previousDecade?` | `string` | `'Previous decade'` | -| `nextDecade?` | `string` | `'Next decade'` | -| `time` | `string` | `'Time'` | -| `hour` | `string` | `'Hour'` | -| `minute` | `string` | `'Minute'` | diff --git a/docs/core/components/date-picker/features.md b/docs/core/components/date-picker/features.md deleted file mode 100644 index c2c93fd0..00000000 --- a/docs/core/components/date-picker/features.md +++ /dev/null @@ -1,136 +0,0 @@ -# Features - -## Import - -The package root is CSS-free. Browser component subpaths automatically load the Date Picker CSS. - -```ts -import { VfDatePicker } from '@codemonster-ru/vueforge-core/date-picker'; -``` - -For a manual CSS setup, import `VfDatePicker` from the package root and add -`@codemonster-ru/vueforge-core/date-picker.css` with the shared foundation styles. - -## Basic date selection - -The visible value follows the requested locale, while `v-model` remains `YYYY-MM-DD`. - -````playground-src -mode: component -framework: vue -height: 420 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Range and multiple selection - -Set `range` for a sorted start/end pair or `multiple` for independent values. Both modes use an -array and clear to `[]`. - -```vue - - - - -``` - -## Month, year, and time modes - -Month and year modes change both the selection grid and model format. Time controls apply only to -the default day picker. - -```vue - - - - - -``` - -## Display formatting and localization - -Use `locale` for normal localized output. Use `displayFormat` only when a product requires a fixed -pattern; supported tokens are documented in the [API](./api.md). Neither option changes the model. - -```vue - - -``` - -## Floating labels and forms - -Inside a floating `VfField`, Date Picker participates in the field's filled/open state and hides its -empty placeholder. Passing a string `name` produces one hidden input per model value, so native -form submission receives the same ISO-like values as `v-model`. - -```vue - - - -``` - -## Accessibility and keyboard support - -The trigger exposes dialog relationships through `aria-haspopup`, `aria-expanded`, and -`aria-controls`. Calendar, month, and year choices use grid semantics with roving focus; current, -selected, disabled, and range states are announced through ARIA. - -| Key | Function | -| ----------------------------- | ------------------------------------------------------------------------ | -| `Enter`, `Space`, `ArrowDown` | Opens the picker from the trigger. | -| Arrow keys | Moves by day/week, month/grid row, or year/grid row for the active mode. | -| `Home`, `End` | Moves to the start or end of the current week, year, or year range. | -| `PageUp`, `PageDown` | Moves by month, year, or 12-year range for the active mode. | -| `Escape` | Closes the picker and restores focus to the trigger. | - -Provide a visible label through `VfField` or an accessible name through `aria-label` when the -component is used independently. diff --git a/docs/core/components/date-picker/index.md b/docs/core/components/date-picker/index.md deleted file mode 100644 index b09b328b..00000000 --- a/docs/core/components/date-picker/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: 'Date Picker' -description: 'Accessible date, month, year, range, and time selection' -order: 4 ---- - -# Date Picker - -`VfDatePicker` is a controlled date input with localized display text and stable ISO-like model -values. It supports day, month, year, time, multiple-selection, and range workflows. - -## Tabs - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/date-picker/theming.md b/docs/core/components/date-picker/theming.md deleted file mode 100644 index 8f834f25..00000000 --- a/docs/core/components/date-picker/theming.md +++ /dev/null @@ -1,20 +0,0 @@ -# Theming - -`VfDatePicker` uses the existing VueForge control, field, selectable, surface, and overlay token -contracts. It intentionally introduces no Date Picker-specific public theme fields. - -## Shared token groups - -| Token group | Representative CSS variables | Purpose | -| ----------------- | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------- | -| Select surface | `--vf-select-background`, `--vf-select-border-color`, `--vf-select-color` | Trigger surface, border, and text. | -| Select states | `--vf-select-hover-border-color`, `--vf-select-focus-border-color`, `--vf-select-invalid-border-color` | Hover, focus, and invalid trigger states. | -| Selectable states | `--vf-selectable-color`, `--vf-selectable-hover-background`, `--vf-selectable-active-background` | Day, month, and year interaction states. | -| Field geometry | `--vf-field-*` | Sizes, icon placement, clearing, and floating labels. | -| Control geometry | `--vf-control-height-*`, `--vf-control-font-size-*`, `--vf-radius-control` | Shared control sizing and radius. | -| Floating surfaces | `--vf-surface-padding-compact`, `--vf-surface-gap-compact`, `--vf-overlay-viewport-padding` | Calendar spacing and viewport positioning. | -| Focus and motion | `--vf-color-focus-ring`, `--vf-focus-ring-width`, `--vf-motion-duration-fast` | Keyboard focus and open/close transitions. | - -The time selectors reuse `VfSelect`; navigation and calendar cells reuse `VfIconButton` and -`VfButton`. Theme those primitives to keep the combined control consistent with the rest of the -application. diff --git a/docs/core/components/dialog/api.md b/docs/core/components/dialog/api.md deleted file mode 100644 index 7b404172..00000000 --- a/docs/core/components/dialog/api.md +++ /dev/null @@ -1,69 +0,0 @@ -# API - -Public component contract: props, events, slots, and related types. - -## Props - -Component props and their default values. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `open?` | `boolean` | — | Controlled open state. | -| `defaultOpen?` | `boolean` | `false` | Initial uncontrolled open state. | -| `title?` | `string` | — | Text title shown in the component header area. | -| `description?` | `string` | — | Supporting helper text. | -| `size?` | `VfDialogSize` | `md` | Size token for spacing and dimensions. | -| `dividers?` | `boolean` | `false` | Shows separators between header/body/footer regions. | -| `closeOnOverlayClick?` | `boolean` | `true` | Closes component when overlay/backdrop is clicked. | -| `closeOnEscape?` | `boolean` | `true` | Closes component when `Escape` key is pressed. | -| `closable?` | `boolean` | `true` | Shows close control and allows explicit dismiss action. | -| `ariaLabel?` | `string` | — | Explicit accessible name; takes precedence over the generated title relationship. | -| `ariaLabelledby?` | `string` | — | Explicit ID reference for the accessible name. | -| `ariaDescribedby?` | `string` | — | Explicit ID reference for the accessible description. | -| `teleportTo?` | `string \| HTMLElement \| null \| false` | — | Teleport target selector/element; `null`/`false` disables teleport resolution. | -| `disableTeleport?` | `boolean` | `false` | Forces in-place rendering without teleport. | - -## Emits - -Emitted component events and their payload shapes. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `update:open` | `[value: boolean]` | `void` | Emitted with next open state. | -| `openChange` | `[value: boolean]` | `void` | Emitted when open state changes. | - -## Slots - -Available slots and their slot props. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `default` | `[scope: { close: () => void }]` | `void` | dialog body (`{ close }` slot prop available) | -| `header` | `[scope: { titleId: string }]` | `void` | Custom heading, wrapped by the generated title ID. | -| `description` | `[scope: { descriptionId: string }]` | `void` | Custom description, wrapped by the generated description ID. | -| `actions` | `[scope: { close: () => void }]` | `void` | (`{ close }` slot prop available) | -| `footer` | `[scope: { close: () => void }]` | `void` | (`{ close }` slot prop available) | - -## Events - -Native DOM events exposed by the component. - -| Name | Type | Description | -| --- | --- | --- | -| `—` | `—` | No additional native events are documented. | - -## Interfaces - -Exported interfaces related to this component. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `—` | `—` | `—` | No dedicated interfaces in this component contract. | - -## Types - -Exported utility and union types. - -| Name | Values | -| --- | --- | -| `VfDialogSize` | `'sm' \| 'md' \| 'lg'` | diff --git a/docs/core/components/dialog/features.md b/docs/core/components/dialog/features.md deleted file mode 100644 index 07ce8eb3..00000000 --- a/docs/core/components/dialog/features.md +++ /dev/null @@ -1,72 +0,0 @@ -# Features - -Overlay dialog for confirmations and focused workflows. - -## Import - -Import statement for this component. - -```ts -import { VfDialog } from '@codemonster-ru/vueforge-core'; -``` - -## Basic - -Basic usage example. - -````playground-src -mode: component -framework: vue -height: 260 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Accessibility - -Accessibility behavior and keyboard interactions. - -### Screen Reader - -The following items are listed in this section: - -- Dialog content is rendered with `role="dialog"` and `aria-modal="true"`. -- The accessible name is linked through `aria-labelledby` (title) and optional description through `aria-describedby`. -- Provide a meaningful `title` (or `header` slot) and description so screen readers announce context immediately when opened. - -### Keyboard Support - -Keyboard interaction follows native semantics of the rendered element or composite widget. - -| Key | Function | -| --- | --- | -| `Tab` | Moves focus to the next focusable element inside the dialog (focus is trapped while open). | -| `Shift + Tab` | Moves focus to the previous focusable element inside the dialog. | -| `Escape` | Closes the dialog when `closeOnEscape` is enabled. | -| `Enter` | Activates the currently focused action (for example, confirm/submit buttons). | diff --git a/docs/core/components/dialog/index.md b/docs/core/components/dialog/index.md deleted file mode 100644 index c9e0c0e2..00000000 --- a/docs/core/components/dialog/index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Dialog" -description: "Modal dialog component" -order: 4 ---- - -# Dialog - -This section provides a quick overview before the detailed subsections below. - - -## Tabs - -The following items are listed in this section: - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/dialog/theming.md b/docs/core/components/dialog/theming.md deleted file mode 100644 index bf43f639..00000000 --- a/docs/core/components/dialog/theming.md +++ /dev/null @@ -1,19 +0,0 @@ -# Theming - -Component styling surface: available classes and design tokens. - -## CSS Classes - -Documented CSS classes and their intended usage. - -| Class | Description | -| --- | --- | -| `—` | No documented CSS classes yet. | - -## Design Tokens - -Available design tokens and corresponding CSS variables. - -| Token | CSS Variable | Description | -| --- | --- | --- | -| `—` | `—` | No documented design tokens yet. | diff --git a/docs/core/components/divider/api.md b/docs/core/components/divider/api.md deleted file mode 100644 index eda0b7ca..00000000 --- a/docs/core/components/divider/api.md +++ /dev/null @@ -1,51 +0,0 @@ -# API - -Public component contract: props, events, slots, and related types. - -## Props - -Component props and their default values. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `orientation?` | `'horizontal' \| 'vertical'` | `horizontal` | Divider orientation axis. | - -## Emits - -Emitted component events and their payload shapes. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `—` | `—` | `void` | No custom emits. | - -## Slots - -Available slots and their slot props. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `—` | `—` | `void` | No public slots. | - -## Events - -Native DOM events exposed by the component. - -| Name | Type | Description | -| --- | --- | --- | -| `—` | `—` | No additional native events are documented. | - -## Interfaces - -Exported interfaces related to this component. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `—` | `—` | `—` | No dedicated interfaces in this component contract. | - -## Types - -Exported utility and union types. - -| Name | Values | -| --- | --- | -| `—` | `—` | diff --git a/docs/core/components/divider/features.md b/docs/core/components/divider/features.md deleted file mode 100644 index 951fb854..00000000 --- a/docs/core/components/divider/features.md +++ /dev/null @@ -1,57 +0,0 @@ -# Features - -Visual separator with horizontal and vertical orientations. - -## Import - -Import statement for this component. - -```ts -import { VfDivider } from '@codemonster-ru/vueforge-core'; -``` - -## Basic - -Basic usage example. - -````playground-src -mode: component -framework: vue -height: 220 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Accessibility - -Accessibility behavior and keyboard interactions. - -### Screen Reader - -The following items are listed in this section: - -- Divider is decorative/structural and should not interrupt reading flow with unnecessary verbosity. -- For semantic section separators, rely on heading structure in addition to visual separators. -- Use orientation consistently so visual and structural grouping stay aligned. - -### Keyboard Support - -Keyboard interaction follows native semantics of the rendered element or composite widget. - -| Key | Function | -| --- | --- | -| `Tab` | Divider is not focusable by default. | - diff --git a/docs/core/components/divider/index.md b/docs/core/components/divider/index.md deleted file mode 100644 index 04823c2f..00000000 --- a/docs/core/components/divider/index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Divider" -description: "Component documentation for Divider" -order: 22 ---- - -# Divider - -This section provides a quick overview before the detailed subsections below. - - -## Tabs - -The following items are listed in this section: - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/divider/theming.md b/docs/core/components/divider/theming.md deleted file mode 100644 index bf43f639..00000000 --- a/docs/core/components/divider/theming.md +++ /dev/null @@ -1,19 +0,0 @@ -# Theming - -Component styling surface: available classes and design tokens. - -## CSS Classes - -Documented CSS classes and their intended usage. - -| Class | Description | -| --- | --- | -| `—` | No documented CSS classes yet. | - -## Design Tokens - -Available design tokens and corresponding CSS variables. - -| Token | CSS Variable | Description | -| --- | --- | --- | -| `—` | `—` | No documented design tokens yet. | diff --git a/docs/core/components/drawer/api.md b/docs/core/components/drawer/api.md deleted file mode 100644 index 5064e2b7..00000000 --- a/docs/core/components/drawer/api.md +++ /dev/null @@ -1,73 +0,0 @@ -# API - -Public component contract: props, events, slots, and related types. - -## Props - -Component props and their default values. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `open?` | `boolean` | — | Controlled open state. | -| `defaultOpen?` | `boolean` | `false` | Initial uncontrolled open state. | -| `title?` | `string` | — | Text title shown in the component header area. | -| `size?` | `VfDrawerSize` | `md` | Size token for spacing and dimensions. | -| `placement?` | `VfDrawerPlacement` | `right` | Controls floating panel placement relative to trigger. | -| `dividers?` | `boolean` | `false` | Shows separators between header/body/footer regions. | -| `rounded?` | `boolean` | `false` | Enables rounded outer corners. | -| `offsetTop?` | `string \| number` | — | Sets the shell-oriented top offset CSS variable. | -| `bodyPadding?` | `string \| number` | — | Overrides body padding through the component CSS variable. | -| `teleportTo?` | `string \| HTMLElement \| null \| false` | — | Teleport target; `null`/`false` disables teleport resolution. | -| `disableTeleport?` | `boolean` | `false` | Forces in-place rendering. | -| `scrollLockTarget?` | `HTMLElement \| null \| false` | — | Custom lock target; `false` explicitly disables scroll locking. | -| `closeOnOverlayClick?` | `boolean` | `true` | Closes component when overlay/backdrop is clicked. | -| `closeOnEscape?` | `boolean` | `true` | Closes component when `Escape` key is pressed. | -| `closable?` | `boolean` | `true` | Shows close control and allows explicit dismiss action. | -| `ariaLabel?` | `string` | — | Explicit accessible name; takes precedence over the generated title relationship. | -| `ariaLabelledby?` | `string` | — | Explicit ID reference for the accessible name. | -| `ariaDescribedby?` | `string` | — | Explicit ID reference for the accessible description. | - -## Emits - -Emitted component events and their payload shapes. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `update:open` | `[value: boolean]` | `void` | Emitted with next open state. | -| `openChange` | `[value: boolean]` | `void` | Emitted when open state changes. | - -## Slots - -Available slots and their slot props. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `header` | `[scope: { titleId: string }]` | `void` | Custom heading, wrapped by the generated title ID. | -| `actions` | `[scope: { close: () => void }]` | `void` | gets `{ close }` | -| `default` | `[scope: { close: () => void }]` | `void` | body | -| `footer` | `[scope: { close: () => void }]` | `void` | gets `{ close }` | - -## Events - -Native DOM events exposed by the component. - -| Name | Type | Description | -| --- | --- | --- | -| `—` | `—` | No additional native events are documented. | - -## Interfaces - -Exported interfaces related to this component. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `—` | `—` | `—` | No dedicated interfaces in this component contract. | - -## Types - -Exported utility and union types. - -| Name | Values | -| --- | --- | -| `VfDrawerPlacement` | `'left' \| 'right' \| 'top' \| 'bottom'` | -| `VfDrawerSize` | `VfDialogSize \| 'full'` | diff --git a/docs/core/components/drawer/features.md b/docs/core/components/drawer/features.md deleted file mode 100644 index fb2cca10..00000000 --- a/docs/core/components/drawer/features.md +++ /dev/null @@ -1,86 +0,0 @@ -# Features - -Sliding panel for secondary workflows and contextual actions. - -## Import - -Import statement for this component. - -```ts -import { VfDrawer } from '@codemonster-ru/vueforge-core'; -``` - -## Basic - -Basic usage example. - -````playground-src -mode: component -framework: vue -height: 360 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Accessibility - -Accessibility behavior and keyboard interactions. - -### Screen Reader - -The following items are listed in this section: - -- Drawer surface is rendered as `role="dialog"` with `aria-modal="true"`. -- Accessible name is provided via `aria-labelledby` from drawer title/header. -- Include a meaningful title to announce drawer purpose when it opens. - -### Keyboard Support - -Keyboard interaction follows native semantics of the rendered element or composite widget. - -| Key | Function | -| --- | --- | -| `Tab` | Moves focus to next focusable element inside drawer (focus is trapped while open). | -| `Shift + Tab` | Moves focus to previous focusable element inside drawer. | -| `Escape` | Closes drawer when `closeOnEscape` is enabled. | -| `Enter` | Activates focused action (for example, close/apply buttons). | diff --git a/docs/core/components/drawer/index.md b/docs/core/components/drawer/index.md deleted file mode 100644 index a959c41a..00000000 --- a/docs/core/components/drawer/index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Drawer" -description: "Component documentation for Drawer" -order: 20 ---- - -# Drawer - -This section provides a quick overview before the detailed subsections below. - - -## Tabs - -The following items are listed in this section: - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/drawer/theming.md b/docs/core/components/drawer/theming.md deleted file mode 100644 index f209fe43..00000000 --- a/docs/core/components/drawer/theming.md +++ /dev/null @@ -1,23 +0,0 @@ -# Theming - -Component styling surface: available classes and design tokens. - -## CSS Classes - -Documented CSS classes and their intended usage. - -| Class | Description | -| --- | --- | -| `—` | No documented CSS classes yet. | - -## Design Tokens - -Available design tokens and corresponding CSS variables. - -| Token | CSS Variable | Description | -| --- | --- | --- | -| Drawer size | `--vf-drawer-size-sm`, `--vf-drawer-size-md`, `--vf-drawer-size-lg` | Drawer panel size by component size. | -| Drawer surface | `--vf-drawer-content-background`, `--vf-drawer-content-border-color`, `--vf-drawer-content-color` | Panel background, border, and text colors. | -| Drawer focus | `--vf-drawer-content-focus-border-color` | Border color used for focus-visible state. | -| Drawer chrome | `--vf-drawer-header-min-height`, `--vf-drawer-footer-min-height`, `--vf-drawer-divider-color` | Header/footer minimum heights and divider color. | -| Drawer offsets | `--vf-drawer-offset-x-rest`, `--vf-drawer-offset-y-rest`, `--vf-drawer-offset-x-left`, `--vf-drawer-offset-x-right`, `--vf-drawer-offset-y-top`, `--vf-drawer-offset-y-bottom` | Translation offsets used by placement transitions. | diff --git a/docs/core/components/dropdown/api.md b/docs/core/components/dropdown/api.md deleted file mode 100644 index 4a4903b0..00000000 --- a/docs/core/components/dropdown/api.md +++ /dev/null @@ -1,60 +0,0 @@ -# API - -Public component contract: props, events, slots, and related types. - -## Props - -Component props and their default values. - -| Name | Type | Default | Description | -| ------------------ | ---------------------------------------- | -------------- | ------------------------------------------------------------------------------ | -| `open?` | `boolean` | — | Controlled open state. | -| `defaultOpen?` | `boolean` | `false` | Initial uncontrolled open state. | -| `placement?` | `VfDropdownPlacement` | `bottom-start` | Controls floating panel placement relative to trigger. | -| `closeOnSelect?` | `boolean` | `true` | Closes popup after selecting an item. | -| `variant?` | `'default' \| 'pills'` | `default` | Visual variant for component appearance. | -| `disabled?` | `boolean` | `false` | Prevents pointer and keyboard opening. | -| `teleportTo?` | `string \| HTMLElement \| null \| false` | — | Teleport target selector/element; `null`/`false` disables teleport resolution. | -| `disableTeleport?` | `boolean` | `false` | Forces in-place rendering without teleport. | - -## Emits - -Emitted component events and their payload shapes. - -| Name | Parameters | ReturnType | Description | -| ------------- | ------------------ | ---------- | -------------------------------- | -| `update:open` | `[value: boolean]` | `void` | Emitted with next open state. | -| `openChange` | `[value: boolean]` | `void` | Emitted when open state changes. | - -## Slots - -Available slots and their slot props. - -| Name | Parameters | ReturnType | Description | -| --------- | ------------------------------------------------------------------- | ---------- | ------------------------------------------- | -| `trigger` | `[scope: { open: boolean; toggle: () => void; disabled: boolean }]` | `void` | trigger node (`{ open, toggle, disabled }`) | -| `default` | `[scope: { close: () => void; open: boolean }]` | `void` | menu body (`{ close, open }`) | - -## Events - -Native DOM events exposed by the component. - -| Name | Type | Description | -| ---- | ---- | ------------------------------------------- | -| `—` | `—` | No additional native events are documented. | - -## Interfaces - -Exported interfaces related to this component. - -| Name | Type | Default | Description | -| ---- | ---- | ------- | --------------------------------------------------- | -| `—` | `—` | `—` | No dedicated interfaces in this component contract. | - -## Types - -Exported utility and union types. - -| Name | Values | -| --------------------- | -------------------------------- | -| `VfDropdownPlacement` | `'bottom-start' \| 'bottom-end'` | diff --git a/docs/core/components/dropdown/features.md b/docs/core/components/dropdown/features.md deleted file mode 100644 index a269c9f0..00000000 --- a/docs/core/components/dropdown/features.md +++ /dev/null @@ -1,87 +0,0 @@ -# Features - -Menu dropdown with keyboard navigation and floating positioning. - -## Import - -Import statement for this component. - -```ts -import { VfDropdown } from '@codemonster-ru/vueforge-core'; -``` - -## Basic - -Basic usage example. - -````playground-src -mode: component -framework: vue -height: 280 -entry: /App.vue - -```vue file=/App.vue - - - - - -``` -```` - -## Accessibility - -Accessibility behavior and keyboard interactions. - -### Screen Reader - -The following items are listed in this section: - -- Trigger exposes `aria-haspopup="menu"`, `aria-expanded`, and `aria-controls` so menu state is announced. -- Menu container uses `role="menu"` and should contain interactive children with `role="menuitem"`. -- Keep trigger text explicit so assistive tech can identify what menu is being opened. - -### Keyboard Support - -Keyboard interaction follows native semantics of the rendered element or composite widget. - -| Key | Function | -| ----------- | ------------------------------------------------------------------- | -| `Enter` | Opens the menu from trigger and moves focus to the first menu item. | -| `Space` | Opens the menu from trigger and moves focus to the first menu item. | -| `ArrowDown` | Opens menu from trigger; inside menu moves focus to next item. | -| `ArrowUp` | Inside menu moves focus to previous item. | -| `Home` | Inside menu moves focus to first item. | -| `End` | Inside menu moves focus to last item. | -| `Escape` | Closes menu and restores focus to trigger. | diff --git a/docs/core/components/dropdown/index.md b/docs/core/components/dropdown/index.md deleted file mode 100644 index 6b3d9211..00000000 --- a/docs/core/components/dropdown/index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Dropdown" -description: "Component documentation for Dropdown" -order: 12 ---- - -# Dropdown - -This section provides a quick overview before the detailed subsections below. - - -## Tabs - -The following items are listed in this section: - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/dropdown/theming.md b/docs/core/components/dropdown/theming.md deleted file mode 100644 index 227a3fdd..00000000 --- a/docs/core/components/dropdown/theming.md +++ /dev/null @@ -1,22 +0,0 @@ -# Theming - -Component styling surface: available classes and design tokens. - -## CSS Classes - -Documented CSS classes and their intended usage. - -| Class | Description | -| --- | --- | -| `—` | No documented CSS classes yet. | - -## Design Tokens - -Available design tokens and corresponding CSS variables. - -| Token | CSS Variable | Description | -| --- | --- | --- | -| Dropdown item palette | `--vf-dropdown-item-*` | Base, focus, hover, active, and pills variant item colors. | -| Menu layout | `--vf-menu-padding`, `--vf-menu-gap`, `--vf-menu-min-width` | Shared menu padding, gap, and minimum width. | -| Floating arrow | `--vf-floating-arrow-size`, `--vf-overlay-arrow-overlap-offset-default`, `--vf-overlay-arrow-separated-offset` | Arrow size and attachment offsets. | -| Floating motion | `--vf-overlay-float-enter-shift`, `--vf-overlay-float-enter-scale-default`, `--vf-overlay-float-shadow` | Floating panel transition and shadow defaults. | diff --git a/docs/core/components/field/api.md b/docs/core/components/field/api.md deleted file mode 100644 index 4bfbaec9..00000000 --- a/docs/core/components/field/api.md +++ /dev/null @@ -1,60 +0,0 @@ -# API - -Public component contract: props, events, slots, and related types. - -## Props - -Component props and their default values. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `label?` | `string` | — | Visible field label rendered above the control. | -| `description?` | `string` | — | Helper text rendered below the control. | -| `error?` | `string` | — | Error text rendered below the control. | -| `invalid?` | `boolean` | `false` | Forces invalid styling/state even when `error` is absent. | -| `required?` | `boolean` | `false` | Shows a visual required marker next to the label and exposes required state to the default slot; does not set native `required` on the wrapped control. | -| `labelPlacement?` | `'top' \| 'floating'` | `'top'` | Chooses between the default stacked label and floating label layout for supported text-like controls. | -| `floatingVariant?` | `'in' \| 'on' \| 'over'` | `'in'` | Adjusts the visual resting position of the floating label when `labelPlacement` is set to `floating`. | - -## Emits - -Emitted component events and their payload shapes. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `—` | `—` | `void` | No component events are emitted. | - -## Slots - -Available slots and their slot props. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `default` | `[scope: { controlId: string; describedBy?: string; invalid: boolean; required: boolean }]` | `void` | Wraps the control and exposes a11y metadata to bind onto it. | -| `label` | `—` | `void` | Custom label content. | -| `description` | `—` | `void` | Custom helper text content. | -| `error` | `—` | `void` | Custom error content. | - -## Events - -Native DOM events exposed by the component. - -| Name | Type | Description | -| --- | --- | --- | -| `—` | `—` | No additional native events are documented. | - -## Interfaces - -Exported interfaces related to this component. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `—` | `—` | `—` | No dedicated interfaces in this component contract. | - -## Types - -Exported utility and union types. - -| Name | Values | -| --- | --- | -| `—` | No dedicated public types are exported for this component. | diff --git a/docs/core/components/field/features.md b/docs/core/components/field/features.md deleted file mode 100644 index 4938b43f..00000000 --- a/docs/core/components/field/features.md +++ /dev/null @@ -1,187 +0,0 @@ -# Features - -Reusable form field wrapper for labels, helper text, and errors. - -## Import - -Import statement for this component. - -```ts -import { VfCheckbox, VfField, VfInput } from '@codemonster-ru/vueforge-core'; -``` - -## Basic - -Basic usage example. - -````playground-src -mode: component -framework: vue -height: 320 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Floating Label - -Floating label layout for text-like controls. - -````playground-src -mode: component -framework: vue -height: 260 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Floating Variants - -Floating labels support three visual variants. - -````playground-src -mode: component -framework: vue -height: 360 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Accessibility - -Accessibility behavior and keyboard interactions. - -### Screen Reader - -The following items are listed in this section: - -- Generates a control id so the visible label can associate through `for`. -- Composes helper text and error ids into one `aria-describedby` value. -- Treats `error` as invalid state automatically and also supports explicit `invalid`. -- Renders the `required` marker as visual-only text and exposes `required` to the default slot so the wrapped control can receive native `required` and `aria-required` explicitly. -- `labelPlacement="floating"` is intended for `VfInput`, `VfTextarea`, and `VfSelect`; selection controls continue to use the default stacked label layout. - -### Keyboard Support - -Keyboard interaction is owned by the wrapped control component. diff --git a/docs/core/components/field/index.md b/docs/core/components/field/index.md deleted file mode 100644 index e998cf5f..00000000 --- a/docs/core/components/field/index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Field" -description: "Form field wrapper for labels, helper text, and errors" -order: 11 ---- - -# Field - -This section provides a quick overview before the detailed subsections below. - - -## Tabs - -The following items are listed in this section: - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/field/theming.md b/docs/core/components/field/theming.md deleted file mode 100644 index 1ede59a7..00000000 --- a/docs/core/components/field/theming.md +++ /dev/null @@ -1,38 +0,0 @@ -# Theming - -Component styling surface: available classes and design tokens. - -## CSS Classes - -Documented CSS classes and their intended usage. - -| Class | Description | -| ---------------------------- | -------------------------------------------------------------- | -| `.vf-field` | Root field wrapper with vertical spacing. | -| `.vf-field--floating` | Floating label layout active for supported text-like controls. | -| `.vf-field__label` | Visible field label. | -| `.vf-field__label--floating` | Floating label rendered inside the control area. | -| `.vf-field__required-mark` | Visual required marker rendered next to the label. | -| `.vf-field__description` | Helper text below the control. | -| `.vf-field__error` | Error text below the control. | - -## Design Tokens - -Available design tokens and corresponding CSS variables. - -| Token | CSS Variable | Description | -| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| Field label typography | `--vf-field-label-font-size`, `--vf-text-label-font-weight`, `--vf-text-label-line-height` | Label font size, weight, and line height. | -| Field helper typography | `--vf-text-caption-*` | Description and error text typography. | -| Field spacing | `--vf-surface-gap-compact` | Vertical gap between field parts. | -| Required marker spacing | `--vf-surface-gap-compact` | Inline gap between label text and the required marker. | -| Helper text color | `--vf-color-text-muted` | Neutral helper text tone. | -| Error text color | `--vf-color-status-danger-solid-background` | Error text tone. | -| Floating label base position | `--vf-field-floating-label-offset-block-default`, `--vf-field-floating-label-translate-y-default` | Default resting vertical position for floating labels. | -| Floating label resting offsets | `--vf-field-floating-label-resting-offset-block-sm-default`, `--vf-field-floating-label-resting-offset-block-md-default`, `--vf-field-floating-label-resting-offset-block-lg-default` | Resting offsets by control size. | -| Floating label active position | `--vf-field-floating-label-active-offset-block-default`, `--vf-field-floating-label-active-translate-y-default` | Default active position used when the field is focused or filled. | -| Floating `in` variant | `--vf-field-floating-in-*` | Padding and active label defaults for the `in` floating variant. | -| Floating `on` variant | `--vf-field-floating-on-*` | Padding, label offset, and active label inset defaults for the `on` floating variant. | -| Floating `over` variant | `--vf-field-floating-over-*` | Padding, label offset, and label background defaults for the `over` floating variant. | -| Floating control offsets | `--vf-field-floating-control-offset-inline-*`, `--vf-field-floating-input-offset-inline-*` | Inline label offsets for text-like controls and input wrappers. | -| Floating textarea offsets | `--vf-field-floating-textarea-*` | Textarea-specific resting offsets and label translation. | diff --git a/docs/core/components/fieldset/api.md b/docs/core/components/fieldset/api.md deleted file mode 100644 index e6d5b516..00000000 --- a/docs/core/components/fieldset/api.md +++ /dev/null @@ -1,57 +0,0 @@ -# API - -Public component contract: props, events, slots, and related types. - -## Props - -Component props and their default values. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `label?` | `string` | — | Visible legend rendered above the grouped controls. | -| `description?` | `string` | — | Helper text rendered below the grouped controls. | -| `error?` | `string` | — | Error text rendered below the grouped controls. | -| `invalid?` | `boolean` | `false` | Forces invalid styling/state even when `error` is absent. | - -## Emits - -Emitted component events and their payload shapes. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `—` | `—` | `void` | No component events are emitted. | - -## Slots - -Available slots and their slot props. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `default` | `[scope: { describedBy?: string; invalid: boolean }]` | `void` | Wraps grouped controls and exposes shared a11y metadata. | -| `label` | `—` | `void` | Custom legend content. | -| `description` | `—` | `void` | Custom helper text content. | -| `error` | `—` | `void` | Custom error content. | - -## Events - -Native DOM events exposed by the component. - -| Name | Type | Description | -| --- | --- | --- | -| `—` | `—` | No additional native events are documented. | - -## Interfaces - -Exported interfaces related to this component. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `—` | `—` | `—` | No dedicated interfaces in this component contract. | - -## Types - -Exported utility and union types. - -| Name | Values | -| --- | --- | -| `—` | No dedicated public types are exported for this component. | diff --git a/docs/core/components/fieldset/features.md b/docs/core/components/fieldset/features.md deleted file mode 100644 index 045cb522..00000000 --- a/docs/core/components/fieldset/features.md +++ /dev/null @@ -1,71 +0,0 @@ -# Features - -Reusable grouped field wrapper for `fieldset` / `legend`, helper text, and errors. - -## Import - -Import statement for this component. - -```ts -import { VfCheckbox, VfFieldset, VfRadio } from '@codemonster-ru/vueforge-core'; -``` - -## Basic - -Basic usage example. - -````playground-src -mode: component -framework: vue -height: 340 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Accessibility - -Accessibility behavior and keyboard interactions. - -### Screen Reader - -The following items are listed in this section: - -- Uses native `fieldset` / `legend` semantics for grouped controls. -- Composes helper text and error ids into one `aria-describedby` value on the root fieldset. -- Treats `error` as invalid state automatically and also supports explicit `invalid`. - -### Keyboard Support - -Keyboard interaction is owned by the grouped controls rendered inside the default slot. diff --git a/docs/core/components/fieldset/index.md b/docs/core/components/fieldset/index.md deleted file mode 100644 index b605b417..00000000 --- a/docs/core/components/fieldset/index.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Fieldset" -description: "Grouped form field wrapper for legends, helper text, and errors" -order: 12 ---- - -# Fieldset - -This section provides a quick overview before the detailed subsections below. - - -## Tabs - -The following items are listed in this section: - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/fieldset/theming.md b/docs/core/components/fieldset/theming.md deleted file mode 100644 index c03d45b4..00000000 --- a/docs/core/components/fieldset/theming.md +++ /dev/null @@ -1,27 +0,0 @@ -# Theming - -Component styling surface: available classes and design tokens. - -## CSS Classes - -Documented CSS classes and their intended usage. - -| Class | Description | -| --------------------------- | ------------------------------------------------- | -| `.vf-fieldset` | Root grouped field wrapper with vertical spacing. | -| `.vf-fieldset__legend` | Visible group legend. | -| `.vf-fieldset__description` | Helper text below the grouped controls. | -| `.vf-fieldset__error` | Error text below the grouped controls. | - -## Design Tokens - -Available design tokens and corresponding CSS variables. - -| Token | CSS Variable | Description | -| -------------------------- | --------------------------------- | ------------------------------------------ | -| Fieldset legend typography | `--vf-text-label-*` | Legend font size, weight, and line height. | -| Fieldset helper typography | `--vf-text-caption-*` | Description and error text typography. | -| Fieldset spacing | `--vf-surface-gap-compact` | Vertical gap between fieldset parts. | -| Fieldset legend color | `--vf-fieldset-legend-color` | Legend text color. | -| Helper text color | `--vf-fieldset-description-color` | Neutral helper text tone. | -| Error text color | `--vf-fieldset-error-color` | Error text tone. | diff --git a/docs/core/components/form-layout/api.md b/docs/core/components/form-layout/api.md deleted file mode 100644 index bc45ba5d..00000000 --- a/docs/core/components/form-layout/api.md +++ /dev/null @@ -1,20 +0,0 @@ -# API - -## Props - -| Name | Type | Default | Description | -| ------------- | ------------------------------------------- | -------------------- | ------------------------------- | -| `mode?` | `'stacked' \| 'horizontal' \| 'responsive'` | `'stacked'` | Field arrangement. | -| `labelWidth?` | `string` | `minmax(10rem, 25%)` | CSS grid track used for labels. | - -## Slots - -| Name | Parameters | ReturnType | Description | -| --------- | ---------- | ---------- | ------------------------ | -| `default` | `[]` | `void` | Form fields and content. | - -Native attributes are forwarded to the root element. - -## Types - -`VfFormLayoutMode` is exported from the package root. diff --git a/docs/core/components/form-layout/features.md b/docs/core/components/form-layout/features.md deleted file mode 100644 index 385e6ffa..00000000 --- a/docs/core/components/form-layout/features.md +++ /dev/null @@ -1,22 +0,0 @@ -# Features - -## Import - -```ts -import { VfFormLayout } from '@codemonster-ru/vueforge-core/form-layout'; -``` - -Use `mode="responsive"` to stack fields in narrow containers and place labels beside controls once -the layout container reaches `48rem`. - -```vue - - - - - -``` - -Only direct `VfField` children participate in the horizontal grid. diff --git a/docs/core/components/form-layout/index.md b/docs/core/components/form-layout/index.md deleted file mode 100644 index 03645e64..00000000 --- a/docs/core/components/form-layout/index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: 'Form Layout' -description: 'Stacked and horizontal form field layout' -order: 17 ---- - -# Form Layout - -`VfFormLayout` arranges direct `VfField` children consistently across forms. - -## Tabs - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/form-layout/theming.md b/docs/core/components/form-layout/theming.md deleted file mode 100644 index b50cf2f2..00000000 --- a/docs/core/components/form-layout/theming.md +++ /dev/null @@ -1,4 +0,0 @@ -# Theming - -The root exposes `--vf-form-layout-label-width`. Layout spacing uses `--vf-section-gap`; direct -fields retain their normal `VfField` tokens and states. diff --git a/docs/core/components/group-box/api.md b/docs/core/components/group-box/api.md deleted file mode 100644 index 82f3ebf2..00000000 --- a/docs/core/components/group-box/api.md +++ /dev/null @@ -1,40 +0,0 @@ -# API - -Public component contract: props, events, slots, and related types. - -## Props - -| Name | Type | Default | Description | -| ------------------- | --------- | ------- | -------------------------------------------------------------------------- | -| `title?` | `string` | — | Text rendered in the legend on the container border. | -| `collapsible?` | `boolean` | `false` | Allows the content to be expanded and collapsed. | -| `collapsed?` | `boolean` | — | Controlled collapsed state. | -| `defaultCollapsed?` | `boolean` | `false` | Initial collapsed state when uncontrolled. | -| `disabled?` | `boolean` | `false` | Disables the collapse trigger without disabling controls inside the group. | - -## Emits - -| Name | Parameters | ReturnType | Description | -| ------------------ | ------------------ | ---------- | ------------------------------------------------- | -| `update:collapsed` | `[value: boolean]` | `void` | Emitted with the requested collapsed state. | -| `collapsedChange` | `[value: boolean]` | `void` | Emitted when the trigger requests a state change. | - -## Slots - -| Name | Parameters | ReturnType | Description | -| ------------- | --------------------------------- | ---------- | ------------------------------------------ | -| `default` | `[scope: { collapsed: boolean }]` | `void` | Group content and current collapsed state. | -| `title` | `[scope: { collapsed: boolean }]` | `void` | Custom legend content. | -| `toggle-icon` | `[scope: { collapsed: boolean }]` | `void` | Custom disclosure indicator. | - -## Events - -Native DOM events and attributes are forwarded to the root `fieldset`. - -## Interfaces - -No dedicated public interfaces are exported. - -## Types - -No dedicated public utility types are exported. diff --git a/docs/core/components/group-box/features.md b/docs/core/components/group-box/features.md deleted file mode 100644 index b23ba180..00000000 --- a/docs/core/components/group-box/features.md +++ /dev/null @@ -1,62 +0,0 @@ -# Features - -Outlined content group with a title embedded in its border and optional disclosure behavior. - -## Import - -```ts -import { VfGroupBox } from '@codemonster-ru/vueforge-core'; -``` - -The standalone entry automatically includes the component styles: - -```ts -import { VfGroupBox } from '@codemonster-ru/vueforge-core/group-box'; -``` - -## Basic - -````playground-src -mode: component -framework: vue -height: 240 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Collapsible - -Use `collapsible` with `v-model:collapsed` when users should be able to hide the content. - -```vue - - - -``` - -Use `defaultCollapsed` instead for an initially collapsed uncontrolled component. - -## Accessibility - -- The root uses native `fieldset` semantics and the title uses `legend`. -- In collapsible mode, the legend contains a native button with `aria-expanded` and `aria-controls`. -- Expanded content is exposed as a named region. -- `Enter` and `Space` toggle the content through native button behavior. diff --git a/docs/core/components/group-box/index.md b/docs/core/components/group-box/index.md deleted file mode 100644 index ee3d701e..00000000 --- a/docs/core/components/group-box/index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: 'Group Box' -description: 'Component documentation for Group Box' -order: 30 ---- - -# Group Box - -`VfGroupBox` groups related content inside an outlined container whose title sits on the border. - -## Tabs - -- [Features](./features.md) -- [API](./api.md) -- [Theming](./theming.md) diff --git a/docs/core/components/group-box/theming.md b/docs/core/components/group-box/theming.md deleted file mode 100644 index 7f958b8f..00000000 --- a/docs/core/components/group-box/theming.md +++ /dev/null @@ -1,28 +0,0 @@ -# Theming - -Component styling surface: available classes and design tokens. - -## CSS Classes - -| Class | Description | -| ---------------------------- | ------------------------------------------------- | -| `.vf-group-box` | Root outlined group. | -| `.vf-group-box--titled` | Group with a legend and adjusted top spacing. | -| `.vf-group-box--collapsible` | Group with disclosure behavior enabled. | -| `.vf-group-box--collapsed` | Collapsed group state. | -| `.vf-group-box__legend` | Title container placed on the border. | -| `.vf-group-box__trigger` | Disclosure button inside the legend. | -| `.vf-group-box__title` | Legend text. | -| `.vf-group-box__icon` | Default or custom disclosure indicator container. | -| `.vf-group-box__content` | Expanded content container. | - -## Design Tokens - -| Token | CSS Variable | Description | -| ------------- | ----------------------------- | ---------------------------- | -| Border color | `--vf-group-box-border-color` | Outline color. | -| Background | `--vf-group-box-background` | Group and legend background. | -| Content color | `--vf-group-box-color` | Default content color. | -| Title color | `--vf-group-box-title-color` | Legend text and icon color. | - -The collapsible trigger uses the `VfButton` medium ghost appearance and its button design tokens. diff --git a/docs/core/components/icon-button/api.md b/docs/core/components/icon-button/api.md deleted file mode 100644 index e38e2ac1..00000000 --- a/docs/core/components/icon-button/api.md +++ /dev/null @@ -1,56 +0,0 @@ -# API - -Public component contract: props, events, slots, and related types. - -## Props - -Component props and their default values. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `icon` | `IconName \| string` | — | Icon name or custom icon identifier. | -| `variant?` | `VfButtonVariant` | `ghost` | Visual variant for component appearance. | -| `size?` | `VfControlSize` | `md` | Size token for spacing and dimensions. | -| `type?` | `'button' \| 'submit' \| 'reset'` | `button` | Native HTML `type` forwarded to underlying control. | - -## Emits - -Emitted component events and their payload shapes. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `—` | `—` | `void` | No custom emits. | - -## Slots - -Available slots and their slot props. - -| Name | Parameters | ReturnType | Description | -| --- | --- | --- | --- | -| `—` | `—` | `void` | No public slots. | - -## Events - -Native DOM events exposed by the component. - -| Name | Type | Description | -| --- | --- | --- | -| `—` | `—` | No additional native events are documented. | - -## Interfaces - -Exported interfaces related to this component. - -| Name | Type | Default | Description | -| --- | --- | --- | --- | -| `—` | `—` | `—` | No dedicated interfaces in this component contract. | - -## Types - -Exported utility and union types. - -| Name | Values | -| --- | --- | -| `IconName` | `Union of generated icon names.` | -| `VfButtonVariant` | `'primary' \| 'secondary' \| 'success' \| 'info' \| 'warn' \| 'help' \| 'danger' \| 'contrast' \| 'ghost'` | -| `VfControlSize` | `'sm' \| 'md' \| 'lg'` | diff --git a/docs/core/components/icon-button/features.md b/docs/core/components/icon-button/features.md deleted file mode 100644 index 0c710b94..00000000 --- a/docs/core/components/icon-button/features.md +++ /dev/null @@ -1,58 +0,0 @@ -# Features - -Icon-only button for compact actions in toolbars and controls. - -## Import - -Import statement for this component. - -```ts -import { VfIconButton } from '@codemonster-ru/vueforge-core'; -``` - -## Basic - -Basic usage example. - -````playground-src -mode: component -framework: vue -height: 220 -entry: /App.vue - -```vue file=/App.vue - - - -``` -```` - -## Accessibility - -Accessibility behavior and keyboard interactions. - -### Screen Reader - -The following items are listed in this section: - -- Uses native ` -
- -
-
-
- -
-
- - -
- - Disabled dropdown link -
- - - -`; - -const stateMatrixSnapshotExpression = `(() => { - const selectors = ${JSON.stringify(stateMatrixSelectors)}; - const root = document.documentElement; - const fixture = document.querySelector('#vf-phase2-state-matrix'); - if (!fixture) throw new Error('Phase 2 state-matrix fixture is unavailable.'); - - const elementFor = (key) => { - const element = document.querySelector(selectors[key]); - if (!element) throw new Error('Phase 2 state-matrix node is unavailable: ' + key); - return element; - }; - const material = (element) => { - const style = getComputedStyle(element); - return { - color: style.color, - backgroundColor: style.backgroundColor, - borderColor: style.borderColor, - boxShadow: style.boxShadow, - cursor: style.cursor, - focus: element.matches(':focus'), - focusVisible: element.matches(':focus-visible'), - hover: element.matches(':hover'), - active: element.matches(':active'), - }; - }; - const tokenColor = (token) => { - const probe = document.createElement('span'); - probe.style.color = 'var(' + token + ')'; - fixture.append(probe); - const value = getComputedStyle(probe).color; - probe.remove(); - return value; - }; - const focusShadow = () => { - const probe = document.createElement('span'); - probe.style.boxShadow = '0 0 0 var(--vf-focus-ring-width) var(--vf-color-focus-ring)'; - fixture.append(probe); - const value = getComputedStyle(probe).boxShadow; - probe.remove(); - return value; - }; - const elements = Object.fromEntries( - Object.keys(selectors).map((key) => [key, material(elementFor(key))]), - ); - const disabledExpected = { - color: tokenColor('--vf-color-text-disabled'), - backgroundColor: tokenColor('--vf-color-background-surface-disabled'), - borderColor: tokenColor('--vf-color-border-disabled'), - }; - - return { - elements, - expected: { - invalidBorder: { - input: tokenColor('--vf-input-invalid-border-color'), - textarea: tokenColor('--vf-textarea-invalid-border-color'), - select: tokenColor('--vf-select-invalid-border-color'), - }, - focusShadow: { - input: focusShadow(), - textarea: focusShadow(), - select: focusShadow(), - }, - selectOptionDisabledColor: tokenColor('--vf-select-option-disabled-color'), - selectedTab: { - base: tokenColor('--vf-tabs-tab-active-background'), - hover: tokenColor('--vf-tabs-tab-active-background'), - active: tokenColor('--vf-tabs-tab-active-background'), - }, - secondaryControlBorder: tokenColor('--vf-color-border-interactive'), - disabledNavigation: disabledExpected, - rawTokens: { - focusRing: getComputedStyle(root).getPropertyValue('--vf-color-focus-ring').trim(), - selectedHover: getComputedStyle(root) - .getPropertyValue('--vf-color-background-surface-selected-hover') - .trim(), - selectedActive: getComputedStyle(root) - .getPropertyValue('--vf-color-background-surface-selected-active') - .trim(), - }, - }, - }; -})()`; - -function validateComputedStateMatrix(mode, matrix) { - for (const key of ['input', 'textarea', 'select']) { - const actual = matrix.forcedFocus.elements[key]; - assert( - actual.borderColor === matrix.expected.invalidBorder[key], - `${mode} state matrix: ${key} invalid border lost to focus/open cascade (${actual.borderColor} !== ${matrix.expected.invalidBorder[key]})`, - ); - assert( - actual.boxShadow === matrix.expected.focusShadow[key], - `${mode} state matrix: ${key} focus material is missing (${actual.boxShadow} !== ${matrix.expected.focusShadow[key]}; :focus=${actual.focus}; :focus-visible=${actual.focusVisible})`, - ); - } - - const disabledOption = matrix.forcedHover.elements.selectOption; - assert( - disabledOption.color === matrix.expected.selectOptionDisabledColor, - `${mode} state matrix: disabled Select option lost its disabled foreground on hover`, - ); - assert( - disabledOption.backgroundColor === matrix.baseline.elements.selectOption.backgroundColor, - `${mode} state matrix: disabled Select option acquired a hover background`, - ); - - for (const key of ['secondaryButton', 'secondaryIconButton']) { - assert( - matrix.baseline.elements[key].borderColor === matrix.expected.secondaryControlBorder, - `${mode} state matrix: ${key} lost the interactive control boundary`, - ); - } - - assert( - matrix.baseline.elements.selectedTab.backgroundColor === matrix.expected.selectedTab.base, - `${mode} state matrix: selected tab base material drifted`, - ); - assert( - matrix.forcedHover.elements.selectedTab.backgroundColor === matrix.expected.selectedTab.hover, - `${mode} state matrix: selected + hover material drifted`, - ); - assert( - matrix.forcedActive.elements.selectedTab.backgroundColor === matrix.expected.selectedTab.active, - `${mode} state matrix: selected + active material drifted`, - ); - - for (const key of ['dropdownNative', 'dropdownLink', 'navNative', 'navLink', 'menuNative', 'menuLink']) { - const baseline = matrix.baseline.elements[key]; - const forced = matrix.forcedHover.elements[key]; - for (const property of ['color', 'backgroundColor', 'borderColor']) { - assert( - forced[property] === matrix.expected.disabledNavigation[property], - `${mode} state matrix: ${key} ${property} escaped the disabled material`, - ); - assert( - forced[property] === baseline[property], - `${mode} state matrix: ${key} ${property} changed under forced hover + active`, - ); - } - assert(forced.cursor === 'not-allowed', `${mode} state matrix: ${key} disabled cursor drifted`); - } -} - -async function runComputedStateMatrix(mode) { - await evaluate(`(() => { - document.querySelector('#vf-phase2-state-matrix')?.remove(); - const host = document.createElement('div'); - host.innerHTML = ${JSON.stringify(stateMatrixMarkup)}; - document.body.append(host.firstElementChild); - return true; - })()`); - - const forcedSelectors = [ - stateMatrixSelectors.input, - stateMatrixSelectors.textarea, - stateMatrixSelectors.select, - stateMatrixSelectors.selectOption, - stateMatrixSelectors.selectedTab, - stateMatrixSelectors.dropdownNative, - stateMatrixSelectors.dropdownLink, - stateMatrixSelectors.navNative, - stateMatrixSelectors.navLink, - stateMatrixSelectors.menuNative, - stateMatrixSelectors.menuLink, - ]; - const { root } = await send('DOM.getDocument', { depth: 0 }); - const forcedNodeIds = new Map(); - for (const selector of forcedSelectors) { - const { nodeId } = await send('DOM.querySelector', { nodeId: root.nodeId, selector }); - assert(nodeId, `State-matrix fixture node is missing: ${selector}`); - forcedNodeIds.set(selector, nodeId); - } - - try { - const baseline = await evaluate(stateMatrixSnapshotExpression); - - for (const selector of [stateMatrixSelectors.input, stateMatrixSelectors.textarea, stateMatrixSelectors.select]) { - await forcePseudoState(forcedNodeIds.get(selector), selector, ['focus', 'focus-visible']); - } - await forcePseudoState(forcedNodeIds.get(stateMatrixSelectors.selectOption), stateMatrixSelectors.selectOption, [ - 'hover', - ]); - await forcePseudoState(forcedNodeIds.get(stateMatrixSelectors.selectedTab), stateMatrixSelectors.selectedTab, [ - 'hover', - ]); - for (const selector of [ - stateMatrixSelectors.dropdownNative, - stateMatrixSelectors.dropdownLink, - stateMatrixSelectors.navNative, - stateMatrixSelectors.navLink, - stateMatrixSelectors.menuNative, - stateMatrixSelectors.menuLink, - ]) { - await forcePseudoState(forcedNodeIds.get(selector), selector, ['hover', 'active']); - } - const forcedHover = await evaluate(stateMatrixSnapshotExpression); - await forcePseudoState(forcedNodeIds.get(stateMatrixSelectors.selectedTab), stateMatrixSelectors.selectedTab, [ - 'active', - ]); - const forcedActive = await evaluate(stateMatrixSnapshotExpression); - - const matrix = { - source: 'synthetic fixtures using the current page stylesheet', - driver: 'Chrome DevTools Protocol CSS.forcePseudoState', - baseline, - forcedFocus: forcedHover, - forcedHover, - forcedActive, - expected: forcedHover.expected, - }; - validateComputedStateMatrix(mode, matrix); - return matrix; - } finally { - for (const selector of forcedSelectors) { - try { - await forcePseudoState(forcedNodeIds.get(selector), selector, []); - } catch { - // Fixture cleanup is best-effort after a failed assertion or navigation. - } - } - await evaluate(`document.querySelector('#vf-phase2-state-matrix')?.remove(); true`); - } -} - -async function capture(name) { - const result = await send('Page.captureScreenshot', { format: 'png', fromSurface: true }); - const contents = Buffer.from(result.data, 'base64'); - const filename = `${name}.png`; - const outputPath = resolve(outputDirectory, filename); - - if (baselineDirectory) { - const baselinePath = resolve(baselineDirectory, filename); - assert(existsSync(baselinePath), `Missing visual baseline: ${baselinePath}`); - assert(contents.equals(readFileSync(baselinePath)), `Visual baseline differs: ${filename}`); - } - - writeFileSync(outputPath, contents); - - return { - filename, - bytes: contents.length, - sha256: createHash('sha256').update(contents).digest('hex'), - }; -} - -const validationExpressions = { - colors: `(() => { - const panels = [...document.querySelectorAll('.color-system__theme')]; - const primitives = document.querySelectorAll('.color-system__primitive'); - const codeBlocks = [...document.querySelectorAll('.color-system__theme .vf-codeblock')]; - const buttons = [...document.querySelectorAll('.color-system__theme .vf-button')]; - buttons[0]?.focus(); - buttons[0]?.scrollIntoView({ block: 'center' }); - return { - primitiveCount: primitives.length, - panelCount: panels.length, - alertCount: document.querySelectorAll('.color-system__theme .vf-alert').length, - semanticSwatchCount: document.querySelectorAll('.color-system__semantic').length, - codeBlockCount: codeBlocks.length, - highlightedTokenCount: document.querySelectorAll('.color-system__theme .vf-codeblock__shiki-token').length, - panelModes: panels.map((panel) => panel.getAttribute('data-vf-theme')), - panelBackgrounds: panels.map((panel) => getComputedStyle(panel).backgroundColor), - codeBlockModes: codeBlocks.map((block) => block.getAttribute('data-vf-resolved-theme')), - alertIconCount: document.querySelectorAll('.color-system__theme .vf-alert__icon').length, - checkboxMarkCount: document.querySelectorAll('.color-system__theme .vf-checkbox__mark').length, - documentOverflow: document.documentElement.scrollWidth > document.documentElement.clientWidth, - focused: document.activeElement?.classList.contains('vf-button') ?? false, - }; - })()`, - core: `(() => { - const root = document.documentElement; - const button = [...document.querySelectorAll('.vf-button')].find((element) => { - const rect = element.getBoundingClientRect(); - return rect.width > 0 && rect.height > 0 && !element.disabled; - }); - button?.focus(); - button?.scrollIntoView({ block: 'center' }); - return { - componentCount: document.querySelectorAll('[class^="vf-"], [class*=" vf-"]').length, - focusRing: getComputedStyle(root).getPropertyValue('--vf-color-focus-ring').trim(), - interactiveBorder: getComputedStyle(root).getPropertyValue('--vf-color-border-interactive').trim(), - invalidStateCount: document.querySelectorAll('[class*="--invalid"]').length, - focused: document.activeElement === button, - buttonBackground: button ? getComputedStyle(button).backgroundColor : '', - }; - })()`, - codeblock: `(() => { - const block = [...document.querySelectorAll('.vf-codeblock')].find((element) => { - const rect = element.getBoundingClientRect(); - return rect.width > 0 && rect.height > 0; - }); - const pre = block?.querySelector('.vf-codeblock__pre'); - const copy = block?.querySelector('.vf-codeblock__copy:not(:disabled)'); - copy?.focus(); - block?.scrollIntoView({ block: 'center' }); - return { - visible: Boolean(block && block.getBoundingClientRect().width > 0 && block.getBoundingClientRect().height > 0), - resolvedTheme: block?.getAttribute('data-vf-resolved-theme'), - highlightedTokenCount: block?.querySelectorAll('.vf-codeblock__shiki-token').length ?? 0, - background: block ? getComputedStyle(block).backgroundColor : '', - codeBackground: pre ? getComputedStyle(pre).backgroundColor : '', - syntaxBackground: block ? getComputedStyle(block).getPropertyValue('--vf-codeblock-syntax-background').trim() : '', - copyFocused: document.activeElement === copy, - copyOutline: copy ? getComputedStyle(copy).outlineStyle : '', - }; - })()`, - playground: `(() => { - const playground = [...document.querySelectorAll('.vf-playground')].find((element) => { - const rect = element.getBoundingClientRect(); - return rect.width > 0 && rect.height > 0; - }); - playground?.scrollIntoView({ block: 'center' }); - return { - visible: Boolean(playground && playground.getBoundingClientRect().width > 0 && playground.getBoundingClientRect().height > 0), - resolvedTheme: playground?.getAttribute('data-vf-resolved-theme'), - background: playground ? getComputedStyle(playground).backgroundColor : '', - border: playground ? getComputedStyle(playground).borderColor : '', - codeBlockCount: playground?.querySelectorAll('.vf-codeblock').length ?? 0, - iframeCount: document.querySelectorAll('.vf-playground__iframe').length, - }; - })()`, -}; - -function validateSnapshot(route, mode, snapshot) { - if (route === 'colors') { - assert(snapshot.primitiveCount === 66, `${mode} colors: expected 66 primitives`); - assert(snapshot.panelCount === 2, `${mode} colors: scoped light/dark panels are missing`); - assert(snapshot.alertCount === 10, `${mode} colors: status examples are incomplete`); - assert(snapshot.semanticSwatchCount === 170, `${mode} colors: semantic token matrix is incomplete`); - assert(snapshot.codeBlockCount === 2, `${mode} colors: scoped CodeBlocks are missing`); - assert(snapshot.highlightedTokenCount > 0, `${mode} colors: syntax highlighting did not finish`); - assert(snapshot.panelModes.join(',') === 'light,dark', `${mode} colors: scoped mode order drifted`); - assert(snapshot.codeBlockModes.join(',') === 'light,dark', `${mode} colors: CodeBlock scope drifted`); - assert(snapshot.panelBackgrounds[0] !== snapshot.panelBackgrounds[1], `${mode} colors: mode surfaces collapsed`); - assert(snapshot.alertIconCount === 10, `${mode} colors: status icon cues are incomplete`); - assert(snapshot.checkboxMarkCount === 2, `${mode} colors: selected shape cues are incomplete`); - assert(!snapshot.documentOverflow, `${mode} colors: document has horizontal overflow`); - assert(snapshot.focused, `${mode} colors: a control could not receive focus`); - } else if (route === 'core') { - assert(snapshot.componentCount > 100, `${mode} core: showcase did not render`); - assert(snapshot.focusRing, `${mode} core: focus token is missing`); - assert(snapshot.interactiveBorder, `${mode} core: control boundary token is missing`); - assert(snapshot.invalidStateCount > 0, `${mode} core: invalid states are absent`); - assert(snapshot.focused, `${mode} core: a control could not receive focus`); - assert(snapshot.buttonBackground !== 'rgba(0, 0, 0, 0)', `${mode} core: primary control is transparent`); - } else if (route === 'codeblock') { - assert(snapshot.visible, `${mode} CodeBlock: component is not visible`); - assert(snapshot.resolvedTheme === mode, `${mode} CodeBlock: inherited mode drifted`); - assert(snapshot.highlightedTokenCount > 0, `${mode} CodeBlock: Shiki tokens are absent`); - assert(snapshot.background === snapshot.codeBackground, `${mode} CodeBlock: editor backgrounds diverged`); - assert(snapshot.syntaxBackground, `${mode} CodeBlock: syntax background is missing`); - assert(snapshot.copyFocused, `${mode} CodeBlock: copy action could not receive focus`); - assert(snapshot.copyOutline !== 'none', `${mode} CodeBlock: copy focus indicator is absent`); - } else if (route === 'playground') { - assert(snapshot.visible, `${mode} Playground: component is not visible`); - assert(snapshot.resolvedTheme === mode, `${mode} Playground: inherited mode drifted`); - assert(snapshot.background !== 'rgba(0, 0, 0, 0)', `${mode} Playground: surface is transparent`); - assert(snapshot.border, `${mode} Playground: border is missing`); - assert(snapshot.codeBlockCount > 0 || snapshot.iframeCount > 0, `${mode} Playground: no content surface rendered`); - } -} - -await send('Page.enable'); -await send('Runtime.enable'); -await send('DOM.enable'); -await send('CSS.enable'); -await send('Log.enable'); -await send('Network.enable'); - -const report = { - origin: showcaseOrigin, - baselineDirectory, - snapshots: [], - screenshots: [], - cvdScreenshots: [], - browserErrors, - networkErrors, -}; - -try { - for (const viewport of viewports) { - await send('Emulation.setDeviceMetricsOverride', { - width: viewport.width, - height: viewport.height, - deviceScaleFactor: 1, - mobile: viewport.mobile, - }); - - for (const route of routes) { - await navigate(route.pathname, route.readySelector); - for (const mode of ['light', 'dark']) { - await setMode(mode, route.readySelector); - if (route.name === 'codeblock') { - await forceSelectorPseudoState('.vf-codeblock__copy:not(:disabled)', ['focus', 'focus-visible']); - } - const snapshot = await evaluate(validationExpressions[route.name]); - if (route.name === 'core') { - snapshot.computedStateMatrix = await runComputedStateMatrix(mode); - } - validateSnapshot(route.name, mode, snapshot); - await sleep(250); - - const id = `${viewport.name}-${mode}-${route.name}`; - report.snapshots.push({ id, ...snapshot }); - report.screenshots.push(await capture(`vueforge-phase2-${id}`)); - } - } - } - - await send('Emulation.setDeviceMetricsOverride', { - width: viewports[0].width, - height: viewports[0].height, - deviceScaleFactor: 1, - mobile: false, - }); - await navigate('/colors', '.color-system__theme-grid'); - for (const deficiency of ['protanopia', 'deuteranopia', 'tritanopia', 'achromatopsia']) { - for (const mode of ['light', 'dark']) { - await setMode(mode, '.color-system__theme-grid'); - const cvdSnapshot = await evaluate(`(() => { - const panel = [...document.querySelectorAll('.color-system__theme')].find( - (candidate) => candidate.getAttribute('data-vf-theme') === ${JSON.stringify(mode)}, - ); - const statuses = panel?.querySelector('.color-system__statuses'); - const invalidInput = panel?.querySelector('[data-phase2-state="invalid-input"]'); - invalidInput?.focus(); - statuses?.scrollIntoView({ block: 'center' }); - return { - panelMode: panel?.getAttribute('data-vf-theme') ?? '', - statusCount: statuses?.querySelectorAll('.vf-alert').length ?? 0, - invalidInputFocused: document.activeElement === invalidInput, - scrollY: window.scrollY, - }; - })()`); - assert(cvdSnapshot.panelMode === mode, `${mode} CVD: matching scoped panel is missing`); - assert(cvdSnapshot.statusCount === 5, `${mode} CVD: status cues are incomplete`); - assert(cvdSnapshot.invalidInputFocused, `${mode} CVD: invalid focus cue is unavailable`); - await sleep(100); - await send('Emulation.setEmulatedVisionDeficiency', { type: deficiency }); - report.cvdScreenshots.push({ - deficiency, - mode, - ...cvdSnapshot, - ...(await capture(`vueforge-phase2-desktop-${mode}-colors-${deficiency}`)), - }); - } - } - await send('Emulation.setEmulatedVisionDeficiency', { type: 'none' }); - - assert(browserErrors.length === 0, `Browser errors: ${browserErrors.join(' | ')}`); - assert(networkErrors.length === 0, `Showcase network errors: ${networkErrors.join(' | ')}`); - writeFileSync(resolve(outputDirectory, 'manifest.json'), `${JSON.stringify(report, null, 2)}\n`); - console.log(`Phase 2 visual smoke passed. Artifacts: ${outputDirectory}`); -} finally { - socket.close(); -} diff --git a/scripts/visual/reference-baseline.test.mjs b/scripts/visual/reference-baseline.test.mjs deleted file mode 100644 index 2997152c..00000000 --- a/scripts/visual/reference-baseline.test.mjs +++ /dev/null @@ -1,81 +0,0 @@ -import assert from 'node:assert/strict'; -import { readFileSync } from 'node:fs'; -import { resolve } from 'node:path'; -import test from 'node:test'; - -const read = (path) => readFileSync(resolve(import.meta.dirname, path), 'utf8'); - -test('captures the showcase and state baselines from the frozen reference commit', () => { - const workflow = read('../../.github/workflows/refresh-visual-baselines.yml'); - - // A baseline captured from the working tree would compare the product against itself and - // silently hide every difference from the reviewed VueForge reference. - assert.match(workflow, /fetch-depth: 0/u); - assert.match(workflow, /require\('\.\/contracts\/visual\.config\.json'\)\.reference\.commit/u); - assert.match(workflow, /git worktree add --detach "\$\{RUNNER_TEMP\}\/vueforge-reference" "\$\{reference_commit\}"/u); - assert.match( - workflow, - /\(cd "\$\{RUNNER_TEMP\}\/vueforge-reference" && npm run dev -w @codemonster-ru\/vueforge-playground-example -- --host 127\.0\.0\.1 --port 5175\)/u, - ); - - // Every baseline must come from the reference checkout. The adapters capture stays a Vue-against- - // Razor check; promoting it to a baseline would compare the product against itself. - assert.doesNotMatch(workflow, /cp -R "\$\{cross_platform_capture\}/u); - assert.match(workflow, /--reference="\$\{RUNNER_TEMP\}\/vueforge-reference"/u); - assert.match(workflow, /visual:cross-platform:reference:capture/u); - assert.match(workflow, /cp -R "\$\{cross_platform_reference\}\/\." visual-baselines\/vueforge-cross-platform\//u); - - const captureLines = workflow - .split('\n') - .filter((line) => line.includes('capture-showcase.mjs') || line.includes('states:capture')); - assert.equal(captureLines.length, 2); - for (const line of captureLines) { - assert.match(line, /--origin=http:\/\/127\.0\.0\.1:5175/u); - } - - // The reference names Inter in its tokens and never shipped it. A capture taken without the - // faces records a system fallback, which then reads as the whole product having changed. - const referenceCaptures = workflow - .split('\n') - .filter((line) => /--label=vueforge-(reference|state-reference|cross-platform-reference-vue)/u.test(line)); - assert.equal(referenceCaptures.length, 3); - for (const line of referenceCaptures) { - assert.match(line, /--font=inject/u); - } -}); - -test('probes showcase readiness in a way both application shells satisfy', () => { - const capture = read('capture-showcase.mjs'); - - // The reference commit renders VfAppShell; the current showcase renders a native shell. Probing - // the application root instead of route content lets a short page height drop trailing tiles. - assert.match(capture, /const showcaseContentReady =\s/u); - assert.match(capture, /document\.querySelector\("\.demo-page"\)\?\.children\.length > 0/u); - assert.doesNotMatch(capture, /querySelector\("\.showcase-shell__content-body"\)/u); - assert.match(capture, /\[data-showcase-loading-content=ready\] \.vf-codeblock, \.vf-codeblock/u); - assert.match(capture, /\[data-showcase-loading-content=ready\] \.vf-playground, \.vf-playground/u); -}); - -test('mounts the reference components for the cross-platform baseline', () => { - const fixture = read('cross-platform-reference-fixture/main.ts'); - const server = read('serve-cross-platform-reference.mjs'); - const style = read('cross-platform-reference-fixture/fixture.css'); - - // The baseline must render the reference package, not this repository's adapters. - assert.match(fixture, /import \* as VueForgeCore from '@codemonster-ru\/vueforge-core';/u); - assert.match(fixture, /`Vf\$\{componentSlug/u); - assert.match(fixture, /vueforge-fd-mounted/u); - assert.doesNotMatch(fixture, /@codemonster-ru\/ui-vue/u); - - // Both fixtures must resolve one Vue instance, and from the reference checkout. - assert.match(server, /find: \/\^@codemonster-ru\\\/vueforge-core\$\/u, replacement: referenceCore/u); - assert.match(server, /dedupe: \['vue'\]/u); - - // The reference ships no document typography, so the fixture reproduces the frame its own - // application establishes. Falling back to the browser default drifts every text measurement, - // and stating more than that application does drifts the glyphs by a subpixel. - assert.match(style, /font-family: var\(--vf-font-family-base\)/u); - assert.match(style, /margin: 0;/u); - assert.doesNotMatch(style, /text-rendering/u); - assert.doesNotMatch(style, /font-synthesis/u); -}); diff --git a/scripts/visual/serve-cross-platform-reference.mjs b/scripts/visual/serve-cross-platform-reference.mjs deleted file mode 100644 index d26f000d..00000000 --- a/scripts/visual/serve-cross-platform-reference.mjs +++ /dev/null @@ -1,70 +0,0 @@ -import { existsSync, readFileSync } from 'node:fs'; -import { resolve } from 'node:path'; -import { createServer } from 'vite'; - -const options = Object.fromEntries( - process.argv.slice(2).map((argument) => { - const [name, ...value] = argument.replace(/^--/u, '').split('='); - return [name, value.join('=')]; - }), -); -const referenceRoot = options.reference ? resolve(options.reference) : null; -const port = Number(options.port ?? 5177); - -if (!referenceRoot || !existsSync(referenceRoot)) { - throw new Error('A checkout of the reference commit is required: --reference=DIR.'); -} -if (!Number.isInteger(port) || port < 1 || port > 65_535) { - throw new Error('Reference fixture port must be an integer between 1 and 65535.'); -} - -const config = JSON.parse(readFileSync(resolve(import.meta.dirname, '../../contracts/visual.config.json'), 'utf8')); -const referenceCore = resolve(referenceRoot, 'packages/core'); -const referenceVue = resolve(referenceRoot, 'node_modules/vue'); -for (const [label, path] of [ - ['reference component package', referenceCore], - ['reference Vue runtime', referenceVue], -]) { - if (!existsSync(path)) throw new Error(`Missing ${label} at ${path}. Install and build the reference checkout first.`); -} - -const corePackage = JSON.parse(readFileSync(resolve(referenceCore, 'package.json'), 'utf8')); -if (corePackage.name !== '@codemonster-ru/vueforge-core') { - throw new Error(`Expected @codemonster-ru/vueforge-core at ${referenceCore}, found ${corePackage.name}.`); -} - -// The fixture and the reference components must share one Vue instance, so both resolve through the -// reference checkout rather than this repository's own dependency tree. -const server = await createServer({ - configFile: false, - root: resolve(import.meta.dirname, 'cross-platform-reference-fixture'), - // Vite's dependency optimizer rewrites bare imports before the aliases apply, which silently - // resolved Vue to this repository's copy and left the reference components with a second Vue - // instance that never mounted. - optimizeDeps: { exclude: ['vue', '@codemonster-ru/vueforge-core'] }, - resolve: { - alias: [ - { find: /^@codemonster-ru\/vueforge-core$/u, replacement: referenceCore }, - { find: /^vue$/u, replacement: referenceVue }, - ], - dedupe: ['vue'], - }, - server: { - host: '127.0.0.1', - port, - strictPort: true, - fs: { allow: [resolve(import.meta.dirname, '../..'), referenceRoot] }, - }, -}); - -await server.listen(); -console.log( - `VueForge reference fixtures ready at http://127.0.0.1:${port} from ${referenceRoot} (${config.reference.commit}).`, -); - -await new Promise((resolvePromise) => { - const close = () => resolvePromise(); - process.once('SIGINT', close); - process.once('SIGTERM', close); -}); -await server.close(); diff --git a/scripts/visual/showcase-state-cases.mjs b/scripts/visual/showcase-state-cases.mjs deleted file mode 100644 index 12081fbd..00000000 --- a/scripts/visual/showcase-state-cases.mjs +++ /dev/null @@ -1,89 +0,0 @@ -import { readFileSync } from 'node:fs'; - -const identifierPattern = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u; -const supportedPseudoClasses = new Set(['active', 'focus', 'focus-visible', 'hover']); -const supportedMedia = new Set(['no-preference', 'reduce']); - -export function readShowcaseStateConfig(filePath) { - return JSON.parse(readFileSync(filePath, 'utf8')); -} - -export function validateShowcaseStateConfig(config, routes = []) { - const errors = []; - if (!config || typeof config !== 'object' || Array.isArray(config)) { - return ['Showcase state configuration must be an object.']; - } - if (config.schemaVersion !== 1) { - errors.push('Showcase state schemaVersion must be 1.'); - } - if (!Array.isArray(config.states) || config.states.length === 0) { - errors.push('Showcase state configuration requires at least one state.'); - return errors; - } - - const knownRoutes = new Set(routes); - const ids = new Set(); - for (const state of config.states) { - if (!state || typeof state !== 'object' || Array.isArray(state)) { - errors.push('Each showcase state must be an object.'); - continue; - } - if (!identifierPattern.test(state.id)) { - errors.push('Each showcase state requires a kebab-case id.'); - } else if (ids.has(state.id)) { - errors.push(`Duplicate showcase state id: ${state.id}.`); - } - ids.add(state.id); - if (!knownRoutes.has(state.route)) { - errors.push(`Showcase state ${state.id} uses unknown route: ${state.route}.`); - } - if (typeof state.selector !== 'string' || state.selector.trim() === '') { - errors.push(`Showcase state ${state.id} requires a non-empty selector.`); - } - if (state.index !== undefined && (!Number.isInteger(state.index) || state.index < 0)) { - errors.push(`Showcase state ${state.id} index must be a non-negative integer.`); - } - if (state.padding !== undefined && (!Number.isInteger(state.padding) || state.padding < 0 || state.padding > 256)) { - errors.push(`Showcase state ${state.id} padding must be an integer between 0 and 256.`); - } - if ( - state.pseudoClasses !== undefined && - (!Array.isArray(state.pseudoClasses) || - state.pseudoClasses.length === 0 || - state.pseudoClasses.some((pseudoClass) => !supportedPseudoClasses.has(pseudoClass))) - ) { - errors.push(`Showcase state ${state.id} uses unsupported pseudo-classes.`); - } - if (state.media !== undefined && !supportedMedia.has(state.media)) { - errors.push(`Showcase state ${state.id} uses unsupported reduced-motion media value.`); - } - if (state.assertReducedMotion !== undefined && typeof state.assertReducedMotion !== 'boolean') { - errors.push(`Showcase state ${state.id} assertReducedMotion must be boolean.`); - } - if (state.assertReducedMotion && state.media !== 'reduce') { - errors.push(`Showcase state ${state.id} can assert reduced motion only with reduce media.`); - } - } - return errors; -} - -export function createShowcaseStateMatrix(stateConfig, visualConfig) { - const errors = validateShowcaseStateConfig(stateConfig, visualConfig.reference.routes); - if (errors.length > 0) { - throw new Error(`Invalid showcase state configuration:\n${errors.join('\n')}`); - } - - return visualConfig.viewports.flatMap((viewport) => - visualConfig.themes.flatMap((theme) => - stateConfig.states.map((state) => ({ - ...state, - filename: `state--${state.id}--${theme.name}--${viewport.name}.png`, - index: state.index ?? 0, - media: state.media ?? 'reduce', - padding: state.padding ?? 24, - theme, - viewport, - })), - ), - ); -} diff --git a/scripts/visual/showcase-state-cases.test.mjs b/scripts/visual/showcase-state-cases.test.mjs deleted file mode 100644 index 6dd71a66..00000000 --- a/scripts/visual/showcase-state-cases.test.mjs +++ /dev/null @@ -1,76 +0,0 @@ -import assert from 'node:assert/strict'; -import test from 'node:test'; -import { createShowcaseStateMatrix, validateShowcaseStateConfig } from './showcase-state-cases.mjs'; - -const visualConfig = { - reference: { routes: ['core'] }, - themes: [ - { name: 'light', attribute: 'light' }, - { name: 'dark', attribute: 'dark' }, - ], - viewports: [ - { name: 'mobile', width: 390, height: 844 }, - { name: 'desktop', width: 1280, height: 800 }, - ], -}; - -test('creates a deterministic state, theme, and viewport matrix', () => { - const matrix = createShowcaseStateMatrix( - { - schemaVersion: 1, - states: [ - { id: 'hover', route: 'core', selector: '.cm-button', pseudoClasses: ['hover'] }, - { id: 'reduced-motion', route: 'core', selector: '.cm-skeleton', media: 'reduce' }, - ], - }, - visualConfig, - ); - - assert.equal(matrix.length, 8); - assert.deepEqual( - matrix.map(({ filename }) => filename), - [ - 'state--hover--light--mobile.png', - 'state--reduced-motion--light--mobile.png', - 'state--hover--dark--mobile.png', - 'state--reduced-motion--dark--mobile.png', - 'state--hover--light--desktop.png', - 'state--reduced-motion--light--desktop.png', - 'state--hover--dark--desktop.png', - 'state--reduced-motion--dark--desktop.png', - ], - ); - assert.equal(matrix[0].media, 'reduce'); - assert.equal(matrix[0].index, 0); - assert.equal(matrix[0].padding, 24); -}); - -test('rejects ambiguous state definitions before browser capture', () => { - const errors = validateShowcaseStateConfig( - { - schemaVersion: 1, - states: [ - { id: 'hover', route: 'missing', selector: '', pseudoClasses: ['visited'] }, - { - id: 'hover', - route: 'core', - selector: '.cm-button', - index: -1, - media: 'sometimes', - padding: 300, - assertReducedMotion: true, - }, - ], - }, - ['core'], - ); - - assert.ok(errors.includes('Duplicate showcase state id: hover.')); - assert.ok(errors.includes('Showcase state hover uses unknown route: missing.')); - assert.ok(errors.includes('Showcase state hover requires a non-empty selector.')); - assert.ok(errors.includes('Showcase state hover uses unsupported pseudo-classes.')); - assert.ok(errors.includes('Showcase state hover index must be a non-negative integer.')); - assert.ok(errors.includes('Showcase state hover padding must be an integer between 0 and 256.')); - assert.ok(errors.includes('Showcase state hover uses unsupported reduced-motion media value.')); - assert.ok(errors.includes('Showcase state hover can assert reduced motion only with reduce media.')); -}); diff --git a/visual-baselines/README.md b/visual-baselines/README.md index b12e7f59..feafd775 100644 --- a/visual-baselines/README.md +++ b/visual-baselines/README.md @@ -1,28 +1,31 @@ # Visual baselines -`vueforge-showcase` is the immutable browser reference captured from commit -`fd793696f50d3be0fcd3788f0f8f751c63869963`. It contains the Core, Colors, Layouts, Icons, -CodeBlock, and Playground routes in light and dark themes at the mobile and desktop viewport sizes -declared in `contracts/visual.config.json`. +`vueforge-cross-platform` holds the approved rendering of each cross-platform contract case in +`contracts/cross-platform-visual-baselines.json`, in light and dark themes at the mobile and +desktop viewport sizes declared in `contracts/visual.config.json`. Both the Vue and the Annabel +Razor adapter are compared against it, which is what proves the two platforms render the same +component identically rather than merely producing the same DOM. -The capture disables animation and transition rendering. The two randomized progress examples are -normalized to 50% by `scripts/visual/capture-showcase.mjs`; application source is not modified. -Comparison allows at most two levels per color channel by default (`--threshold=2`) to absorb -non-deterministic browser anti-aliasing. Any larger channel difference is a visual regression; the -M12 gate does not allow a changed-pixel ratio above zero after that threshold is applied. +The capture disables animation and transition rendering. Comparison allows at most four levels per +color channel by default (`--threshold=4`) to absorb non-deterministic browser anti-aliasing. Any +larger channel difference is a visual regression. -Capture a running candidate and compare it with the reference: +Capture a running candidate and compare it with the baseline: ```sh -npm run visual:showcase:capture -- \ - --origin=http://127.0.0.1:5175 \ - --output=/tmp/codemonster-showcase \ +npm run visual:cross-platform:razor-render -- --output=/tmp/codemonster-razor-fixtures.json +npm run visual:cross-platform:serve -- --razor-fixtures=/tmp/codemonster-razor-fixtures.json --port=5176 + +npm run visual:cross-platform:capture -- \ + --origin=http://127.0.0.1:5176 \ + --output=/tmp/codemonster-cross-platform \ --label=codemonster-current -npm run visual:showcase:compare -- \ - --baseline=visual-baselines/vueforge-showcase \ - --current=/tmp/codemonster-showcase \ - --diff=/tmp/codemonster-showcase-diff +node scripts/visual/compare-showcase.mjs \ + --baseline=visual-baselines/vueforge-cross-platform \ + --current=/tmp/codemonster-cross-platform/vue \ + --diff=/tmp/codemonster-cross-platform-diff \ + --threshold=4 ``` Chrome must already be running with remote debugging enabled. The endpoint defaults to @@ -30,13 +33,17 @@ Chrome must already be running with remote debugging enabled. The endpoint defau Start that browser fresh for each comparison you intend to trust. Captures are deterministic within one browser session, but a long-lived one drifts: a session left running through many captures -shifted sub-pixel text rendering on six Core frames, worth roughly seven hundred pixels, with no -change to the page or its computed styles. Restarting Chrome reproduced the earlier images exactly. -CI is unaffected because it launches the browser per run, so this only bites during local work, and -it makes any local difference below about a thousand pixels unsafe to read as a real change. +shifted sub-pixel text rendering on six frames, worth roughly seven hundred pixels, with no change +to the page or its computed styles. Restarting Chrome reproduced the earlier images exactly. CI is +unaffected because it launches the browser per run, so this only bites during local work, and it +makes any local difference below about a thousand pixels unsafe to read as a real change. -Restart the Vite dev servers on the same schedule. A server carried through a long editing session +Restart the Vite dev server on the same schedule. A server carried through a long editing session serves module state that no longer matches the working tree: after one such session a capture reported eight hundred pixels of change across frames the edit could not reach, and the difference -vanished on a restarted server. The frozen reference server is not exempt, though its capture has -been byte-identical across restarts because nothing edits it. +vanished on a restarted server. + +The baseline's `manifest.json` records `fd793696f50d3be0fcd3788f0f8f751c63869963` as the commit its +pixels were originally captured from, back when this comparison proved the migration from VueForge +reproduced it exactly. That provenance stays accurate and is kept for the record; the comparison +itself no longer depends on that commit or on anything being checked out from it. diff --git a/visual-baselines/vueforge-showcase-states/manifest.json b/visual-baselines/vueforge-showcase-states/manifest.json deleted file mode 100644 index 3d3f41a7..00000000 --- a/visual-baselines/vueforge-showcase-states/manifest.json +++ /dev/null @@ -1,749 +0,0 @@ -{ - "label": "vueforge-state-reference", - "referenceCommit": "fd793696f50d3be0fcd3788f0f8f751c63869963", - "routes": ["core"], - "screenshots": [ - { - "filename": "state--hover--light--mobile.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 6074 - }, - "media": "reduce", - "route": "core", - "scrollTop": 5690, - "state": "hover", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--active--light--mobile.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 6074 - }, - "media": "reduce", - "route": "core", - "scrollTop": 5690, - "state": "active", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--focus-visible--light--mobile.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 6074 - }, - "media": "reduce", - "route": "core", - "scrollTop": 5690, - "state": "focus-visible", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--disabled--light--mobile.png", - "clip": { - "height": 77, - "width": 123, - "x": 80, - "y": 6162 - }, - "media": "reduce", - "route": "core", - "scrollTop": 5778, - "state": "disabled", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--invalid--light--mobile.png", - "clip": { - "height": 76, - "width": 372, - "x": 9, - "y": 24494 - }, - "media": "reduce", - "route": "core", - "scrollTop": 24110, - "state": "invalid", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--selected--light--mobile.png", - "clip": { - "height": 84, - "width": 145, - "x": 9, - "y": 34989 - }, - "media": "reduce", - "route": "core", - "scrollTop": 34609, - "state": "selected", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--open--light--mobile.png", - "clip": { - "height": 357, - "width": 516, - "x": 0, - "y": 35676 - }, - "media": "reduce", - "route": "core", - "scrollTop": 35432, - "state": "open", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--closed--light--mobile.png", - "clip": { - "height": 197, - "width": 436, - "x": 0, - "y": 35706 - }, - "media": "reduce", - "route": "core", - "scrollTop": 35382, - "state": "closed", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--loading--light--mobile.png", - "clip": { - "height": 76, - "width": 139, - "x": 9, - "y": 6729 - }, - "media": "reduce", - "route": "core", - "scrollTop": 6345, - "state": "loading", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--indeterminate--light--mobile.png", - "clip": { - "height": 56, - "width": 372, - "x": 9, - "y": 20047 - }, - "media": "reduce", - "route": "core", - "scrollTop": 19653, - "state": "indeterminate", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--reduced-motion--light--mobile.png", - "clip": { - "height": 64, - "width": 372, - "x": 9, - "y": 19991 - }, - "media": "reduce", - "route": "core", - "reducedMotionVerified": true, - "scrollTop": 19601, - "state": "reduced-motion", - "theme": "light", - "viewport": "mobile" - }, - { - "filename": "state--hover--dark--mobile.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 6074 - }, - "media": "reduce", - "route": "core", - "scrollTop": 5690, - "state": "hover", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--active--dark--mobile.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 6074 - }, - "media": "reduce", - "route": "core", - "scrollTop": 5690, - "state": "active", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--focus-visible--dark--mobile.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 6074 - }, - "media": "reduce", - "route": "core", - "scrollTop": 5690, - "state": "focus-visible", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--disabled--dark--mobile.png", - "clip": { - "height": 77, - "width": 123, - "x": 80, - "y": 6162 - }, - "media": "reduce", - "route": "core", - "scrollTop": 5778, - "state": "disabled", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--invalid--dark--mobile.png", - "clip": { - "height": 76, - "width": 372, - "x": 9, - "y": 24494 - }, - "media": "reduce", - "route": "core", - "scrollTop": 24110, - "state": "invalid", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--selected--dark--mobile.png", - "clip": { - "height": 84, - "width": 145, - "x": 9, - "y": 34989 - }, - "media": "reduce", - "route": "core", - "scrollTop": 34609, - "state": "selected", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--open--dark--mobile.png", - "clip": { - "height": 357, - "width": 516, - "x": 0, - "y": 35676 - }, - "media": "reduce", - "route": "core", - "scrollTop": 35432, - "state": "open", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--closed--dark--mobile.png", - "clip": { - "height": 197, - "width": 436, - "x": 0, - "y": 35706 - }, - "media": "reduce", - "route": "core", - "scrollTop": 35382, - "state": "closed", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--loading--dark--mobile.png", - "clip": { - "height": 76, - "width": 139, - "x": 9, - "y": 6729 - }, - "media": "reduce", - "route": "core", - "scrollTop": 6345, - "state": "loading", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--indeterminate--dark--mobile.png", - "clip": { - "height": 56, - "width": 372, - "x": 9, - "y": 20047 - }, - "media": "reduce", - "route": "core", - "scrollTop": 19653, - "state": "indeterminate", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--reduced-motion--dark--mobile.png", - "clip": { - "height": 64, - "width": 372, - "x": 9, - "y": 19991 - }, - "media": "reduce", - "route": "core", - "reducedMotionVerified": true, - "scrollTop": 19601, - "state": "reduced-motion", - "theme": "dark", - "viewport": "mobile" - }, - { - "filename": "state--hover--light--desktop.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 4657 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4295, - "state": "hover", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--active--light--desktop.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 4657 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4295, - "state": "active", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--focus-visible--light--desktop.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 4657 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4295, - "state": "focus-visible", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--disabled--light--desktop.png", - "clip": { - "height": 77, - "width": 122, - "x": 312, - "y": 4701 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4339, - "state": "disabled", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--invalid--light--desktop.png", - "clip": { - "height": 77, - "width": 442, - "x": 9, - "y": 14848 - }, - "media": "reduce", - "route": "core", - "scrollTop": 14486, - "state": "invalid", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--selected--light--desktop.png", - "clip": { - "height": 85, - "width": 145, - "x": 9, - "y": 19129 - }, - "media": "reduce", - "route": "core", - "scrollTop": 18771, - "state": "selected", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--open--light--desktop.png", - "clip": { - "height": 356, - "width": 917, - "x": 489, - "y": 19283 - }, - "media": "reduce", - "route": "core", - "scrollTop": 19061, - "state": "open", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--closed--light--desktop.png", - "clip": { - "height": 196, - "width": 757, - "x": 569, - "y": 19313 - }, - "media": "reduce", - "route": "core", - "scrollTop": 19011, - "state": "closed", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--loading--light--desktop.png", - "clip": { - "height": 76, - "width": 139, - "x": 9, - "y": 4905 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4543, - "state": "loading", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--indeterminate--light--desktop.png", - "clip": { - "height": 57, - "width": 647, - "x": 9, - "y": 12416 - }, - "media": "reduce", - "route": "core", - "scrollTop": 12044, - "state": "indeterminate", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--reduced-motion--light--desktop.png", - "clip": { - "height": 65, - "width": 647, - "x": 9, - "y": 12360 - }, - "media": "reduce", - "route": "core", - "reducedMotionVerified": true, - "scrollTop": 11992, - "state": "reduced-motion", - "theme": "light", - "viewport": "desktop" - }, - { - "filename": "state--hover--dark--desktop.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 4657 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4295, - "state": "hover", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--active--dark--desktop.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 4657 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4295, - "state": "active", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--focus-visible--dark--desktop.png", - "clip": { - "height": 77, - "width": 117, - "x": 9, - "y": 4657 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4295, - "state": "focus-visible", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--disabled--dark--desktop.png", - "clip": { - "height": 77, - "width": 122, - "x": 312, - "y": 4701 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4339, - "state": "disabled", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--invalid--dark--desktop.png", - "clip": { - "height": 77, - "width": 442, - "x": 9, - "y": 14848 - }, - "media": "reduce", - "route": "core", - "scrollTop": 14486, - "state": "invalid", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--selected--dark--desktop.png", - "clip": { - "height": 85, - "width": 145, - "x": 9, - "y": 19129 - }, - "media": "reduce", - "route": "core", - "scrollTop": 18771, - "state": "selected", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--open--dark--desktop.png", - "clip": { - "height": 356, - "width": 917, - "x": 489, - "y": 19283 - }, - "media": "reduce", - "route": "core", - "scrollTop": 19061, - "state": "open", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--closed--dark--desktop.png", - "clip": { - "height": 196, - "width": 757, - "x": 569, - "y": 19313 - }, - "media": "reduce", - "route": "core", - "scrollTop": 19011, - "state": "closed", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--loading--dark--desktop.png", - "clip": { - "height": 76, - "width": 139, - "x": 9, - "y": 4905 - }, - "media": "reduce", - "route": "core", - "scrollTop": 4543, - "state": "loading", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--indeterminate--dark--desktop.png", - "clip": { - "height": 57, - "width": 647, - "x": 9, - "y": 12416 - }, - "media": "reduce", - "route": "core", - "scrollTop": 12044, - "state": "indeterminate", - "theme": "dark", - "viewport": "desktop" - }, - { - "filename": "state--reduced-motion--dark--desktop.png", - "clip": { - "height": 65, - "width": 647, - "x": 9, - "y": 12360 - }, - "media": "reduce", - "route": "core", - "reducedMotionVerified": true, - "scrollTop": 11992, - "state": "reduced-motion", - "theme": "dark", - "viewport": "desktop" - } - ], - "stateCases": [ - { - "id": "hover", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] :is(.vf-button, .cm-button):not(:disabled)", - "pseudoClasses": ["hover"] - }, - { - "id": "active", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] :is(.vf-button, .cm-button):not(:disabled)", - "pseudoClasses": ["active"] - }, - { - "id": "focus-visible", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] :is(.vf-button, .cm-button):not(:disabled)", - "pseudoClasses": ["focus", "focus-visible"] - }, - { - "id": "disabled", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] :is(.vf-button, .cm-button):disabled" - }, - { - "id": "invalid", - "route": "core", - "selector": "[data-test=\"form-geometry-matrix\"] [aria-invalid=\"true\"]" - }, - { - "id": "selected", - "route": "core", - "selector": "[role=\"tab\"][aria-selected=\"true\"]" - }, - { - "id": "open", - "route": "core", - "selector": "[data-test=\"navigation-geometry-matrix\"] :is(.vf-accordion__trigger, .cm-accordion__trigger)[aria-expanded=\"true\"]", - "padding": 160 - }, - { - "id": "closed", - "route": "core", - "selector": "[data-test=\"navigation-geometry-matrix\"] :is(.vf-accordion__trigger, .cm-accordion__trigger)[aria-expanded=\"false\"]", - "padding": 80 - }, - { - "id": "loading", - "route": "core", - "selector": "[data-test=\"action-geometry-matrix\"] [aria-busy=\"true\"]" - }, - { - "id": "indeterminate", - "route": "core", - "selector": "[role=\"progressbar\"][aria-label=\"Background sync progress\"]" - }, - { - "id": "reduced-motion", - "route": "core", - "selector": ":is(.vf-progress-bar--animated, .cm-progress-bar--animated)", - "media": "reduce", - "assertReducedMotion": true - } - ], - "suite": "states", - "themes": ["light", "dark"], - "viewports": [ - { - "name": "mobile", - "width": 390, - "height": 844 - }, - { - "name": "desktop", - "width": 1280, - "height": 800 - } - ] -} diff --git a/visual-baselines/vueforge-showcase-states/state--active--dark--desktop.png b/visual-baselines/vueforge-showcase-states/state--active--dark--desktop.png deleted file mode 100644 index b5f2258df9da3dd260c8d953684c8c3136416b38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2465 zcmaJ@X)qg#7Iy8mQ!T0lMY$-gt*BUTP^H$?-iTVFYKf(`idc)*(o2=vD@c`6u|({u zsM>{!2DzwRY2w8a3D5g~=lwY6%$zf4&dfJ+zVA!3u`=W3y28c8#KdcU7i4!{pPt8k zPUiD0V%?#{#B{;I9ApHJEZQmJwgJzI4UPl%x*|NHeqAZK!C8|46-eimu|j+iCBEOR z_7XTaAAc#%&)3gV%as%yK$jwySS9laRzBGX1#rVkwp*kcM@~HKJxM0alK7yt=l2SP^u%A zN}+xmZUJr^p3Wb?d?5A~D;`*BWqGz<*R3OQ;2X6=aj!dA2fxmRD0Zhx+U0Ws(A~gY zI3YA--`(kuvR|WBQBlnf_=um63v+=0EAac=(gCdx5+%doTf`qzO|ZkvmoV!Ms%{!c z7dbipKx``>rSd~QZ@9W7yAP_Cjh||7&p;&l(>>VGU2)^3XvL4UfnM+Q=;8&R74mWP!<6AoP!MCj0Qd%4tfF9xWoIHyr5w_

&6+#b{x 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 diff --git a/visual-baselines/vueforge-showcase-states/state--closed--dark--desktop.png b/visual-baselines/vueforge-showcase-states/state--closed--dark--desktop.png deleted file mode 100644 index d49cccc46f981ba26706152c25cc48cfb231fc9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18274 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 IA_f8f2dO~w^Z)<= diff --git a/visual-baselines/vueforge-showcase-states/state--closed--light--desktop.png b/visual-baselines/vueforge-showcase-states/state--closed--light--desktop.png deleted file mode 100644 index 131bb7d5ab9c0b1af7f401605a8e416097988e38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18214 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 IM6N<$f(}H$Q~&?~ diff --git a/visual-baselines/vueforge-showcase-states/state--closed--light--mobile.png b/visual-baselines/vueforge-showcase-states/state--closed--light--mobile.png deleted file mode 100644 index 919029f2cbedf3fac16ed7194448f1212e855d10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15189 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 V*n~ayf#3NdDJmyYEo2b*{{V!yGtB@1 diff --git a/visual-baselines/vueforge-showcase-states/state--disabled--dark--desktop.png b/visual-baselines/vueforge-showcase-states/state--disabled--dark--desktop.png deleted file mode 100644 index ffdde9fd5d7c50f3190b79388ccc512c1bd9bf2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2113 zcmbtW`6Cky16FcG&V_PDB2%tqn4=lcu3AHE-+^B;Jgel$!iqKuS8WR^GQG>pWQNoNf0B;16)(oT8PSZct{v^zoTYWt0a@0xP)B5y z&w$z3RYI}<($Uu)J@1}p z(Qdy}ig+e_Pc$P~Ep;}Bp98jcOfIj2e(7U=AI|s*Ib{UHh-sN>PqG!Cnmae?mJBKk z_0Z;hNR~OqikYGaLy>_b%QCgMih%VHn8XxycY@&+5{*aH+C&m6R7Q_Xf=20(D6^-n zBP9wgE2&NM9A!!Koo?J+s&uQZKk9%PbG{NcH)NvNs0h)uIwf4<-Au8=0z%Oj0=Aco zru?}t^ns@Sg&=H^5n)%fEgH|Bf~z}r&z>OJY?W1U^2FNRH*S7lx%1%A5#Ot~jW17Y zoUq2%x-GY7;#xQ;C#;uC4<=Qa&QWM=&mhhp>xEgGGn=MYl8bz20H+G|JH$SFTL|*;XPg4gg`e0-^gzmjt(9tic z2DZY!)gV`O(ckc86$1ZP`1a{MsCEXbQEFGEjczingSLo?SCH)LovRmJn^09RED2oS zq{6k@{|;)DA4)P!FSCqiRC`t-Ii*n1d__xzwbM+PtThwnv!2 z?jGKb97hNLw0ux0vYPSDu`2=k;M2rcL9%eEyv;aoFG6SG#_Oqf;}iH8)D^AO))9~e z$ykdlk~oTXgofgx|B^}68DD!2S5VB7(v)KhkpE1AJG2xi31m`I4_u)youjq!A0jrv z&(pZtK6#P|38;=Use8U;o4|K^QzWUHJ^5HFySbg$>&OmE*Gj6l4JM)L^77lgwOX9~ zo# z2tzq?OQE2V&h#sqdxPpTJtFJXmPqwtc}5=ZSD7L`oS!Ihcxe)#-_`G2S9o*Jc>iUG zK0`{@w!67yti#tg2{ANVaZRfK2qq0pu|k^R=-5;wiTMmV<`W= zRKA6ZF#%7FNs{g*m*adu2zvicN{QD91+OKZ;t^MwyzN1h!wE@Qi|1Y4-FHod43Yqw z&xJn8w7!{UCM@5&YeCHdD0}?ptaWw8<6Z&L>+c61K5eDnb2QkUr=30>j1HEjsvwIKfA@f|lX4Rmn zR+fscHk?TD+CSMJYSz@un}Jd>GKys(-@c_hLOov&)!P^6yN>}h1iBYY_Fl5~ZgbzP z9P|k4?ssowfG+Y~E8`L%gYp$0epls(K%8>3Eokt$KC0(jqtY86$XM|&@2prgIg7qU zg@`L1(4t}#*f03Pgv_9gr$@u&@d9WSe|8xi^3P^1ZIEA~jl%He?0k|2*grU%siMFA zx}LGvsB%eow2TUmd|0@#)qXL<3VXp(p-vaPYucYH7bVix7{;0mV8<11+oBA<|A@>k zCuU4|#Q)svG7nR20wnsGhK)PHh2v1*+I0;jXb)&Zj%ho8?fZ=D4+LCrI`oiwJjd?k zb^X%8GQx1yGM}zekIC`K&22nzkeJoO9iR83n0Py-aWGFjL# z#Y@k!7EK|_$}t8mRnlXE36*w{{wKQk{TmtQ(`&_~)pfWS7zbzboTXArkML*|bPFfF zdB(?7D_Vn)ns#O0*T%4PCLP&lQfwag;#h=xFnsFzbRs{u41lUZ6jWJE$i}E(gERS~ zY2b_Laio_Z;`d3XJ`>V{+R(Lgob*^OCF&;22b3K8&pdXO+9)dsdMj|p_t}6D`hL3P zFSDMYB>nw>q+QBWp%YRqO==E3DmVJ7X{-VTL@Y}QQH{kc2>J$b)HBF4mSRc}$Gj;A xcig>riuL~&7WGc||K#Ky4_oEbaR2uKaB>Kw_&#n2;_#;p2g1Y#UI%*=^B8UX+R diff --git a/visual-baselines/vueforge-showcase-states/state--disabled--dark--mobile.png b/visual-baselines/vueforge-showcase-states/state--disabled--dark--mobile.png deleted file mode 100644 index 2356c9005bae69212da83f4228fa81d17095df23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2258 zcmb7G`9Bkk1D5+fMj0DJco|Z;mQ?P!+3c0vXKqHc9LqaLB6oyl7_U2unXAazlq22< zg+;E=+@xWz?_cnKzCS$YKkz)sHdb&xZgFlVCMG^p6GP;gMxViwllhFf9;N0pF>xlD z8tS1Q6mAqwhkz&&l%&NSmn;#*WbFr!^CE0=yd2U!|1fgiBbwkk_sUlTAasC~!e}gU z)u8zIC{qxQnT=Z{5h0?&E5hjkyjI>f7F3X}fRODsc=K^-XXpd~L zAOqSpYQc$w8maV@K~Wr^pVwdS{-a8Xc0Kmt-BK>2zo156!RyHkaT&rPFW1m!8oaf{WtK_7GdHtNZ6}TjzSNA~!xy zzpVgpsy4PaZEkb7bJG(E$T~N*nUcRndN^%WZ}A>uLm5}vnL!%zpL{K9$zea_=uRyI zDZ>xLy%)+yqdX*e+x1l14_COnwN4v;C7C?raV{7Z->u5WK>v&nV*@~vXEl-&daE=Y zc_s0uk0#K)C7RND@6~>wgYT(|a;`8J)NFlrOUS0Hix-=zm5)8H?CeSrc1acy+R_)H z@FBojhM_Zp{h;%*q{%-3ghmS%;0w>}ngy&|Z{MIWvF{aaUFr z@Z;O#4wsjq;5f#*@>hS2F?<>d`cz3ItPQX{qiB{jB@kMu@agz!JmRm&k?&RG4o_wY zA1jEpuasG^@V^~JFSMGr{@Lo@{7#nvY=jl~w~bX@BnsJwlA9|hr(!c7Yr3w>JX2!U za)mCZ%BzWp@7Le%Da^<$5>8Ey9C&8>-Q}DNz(!~{^91dkVZ&Jso1$4j)9ZzPpoVm= zrmz}a?w7vmJ}urF9iGO7=dW-sn~@T7wFbuL zJr}|FZrBfenb(eOi+*{DzX^=hoK3p+jp1`) zD%D)Rv~C%Xhv=0jSmtlbQSVdI+@G)%9ggdj9_f%qL8)pja|MizizanM4`G+L4Igey9FJ;7K1(f!N6F9YwmFSl9y%a-`x1NaeKEeFNy$e+O(C+HpNn<(ViroZDlNRv{I;vtuxk)fVz) zx*iG{*1s)J48G#Xb!pzC1MB#Bh+eR7jbUI&gx|Sr`^_Q8l$8(-o17UMm}ir{hxoG- zM=Zb}S}it<^I`ANoLlwXJjHtK@+bl1*WWPh@LS*C@&t)JXh%U8CF;2nge<4B}x~;>tJ=ffdZ+S&* zn?Dq`Rm`wHBC9(q=J8wmN<hO= z1@tv>g60uU(A*kSO$Wi}c=B#7SJ@?p-(Hy@zRd^ku$yzS0vpE4;x#!>wk{g}YO-1r zE3WYCXogceJ^Qns#M>?M5Hz>e!#gPFCl3#B&uvK|yRMelyW^49StU!HG_f%LEHj#` zR)1vKnD)WYy-FimR!3dT%^-4{G(RpF_=SsAYw}$O$*u26B3K53q0TZ+6P#iY;&JD*??w_FwB2D5;@_b@&L(|7 zt-AiDvhFlyw|;`gj_1$1YEP`Jb?wdY=ff^!N)kFzLk7gjamfs&3yqW(eYmDnQ^Nrt z75c3S^bjzA|2r^ov@BQOoHXM>XVFD@nOccWZwz-yba>q%sB zmIdThvr08xv7ET0bA&mQPuc|*H#H-6`~0w^5RRg_lJV9_fibJ2{(=Pia145CjnK)5 z;BLLMIYbb*b@_Gt-B6jeK0568eJ_k7H2@3*>j8x7lCwt4()JJz4!Jy~k=x)v1$qsJ`nGfBy#@=Iw-=R(=ByAJiZ#Fp-XC2dv&geK z1(TnOaVBPV08$AJc)izJ5MX>N+`z;p0R`4iY+jXDYrg=rjBhZp+48%9Q&F{5@%iUH zQ7B1&@olLz)D4uRGGd|qFrCt=E>kC%-IWkXatR5o+nnH*mTQ#(vScE5(ys`~(M7ja zLiuJ{ir_~b4s4UBD5djy&P!Z|BBe-Z4~LLT!i&28|6?rvYg2Yr&JGEK0aDMEIy3D5 byCf`3?j9x7cU^gFXAP67k(FV+zFXYCN2oCj diff --git a/visual-baselines/vueforge-showcase-states/state--disabled--light--desktop.png b/visual-baselines/vueforge-showcase-states/state--disabled--light--desktop.png deleted file mode 100644 index 93248db66886b728e164bdd98a6bf10af0ebca4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2106 zcmbuB`9Bkm1IE{g9COS$R3uBtRofI2=3K?cv6f?IWfO)LDUn>0BS&(dQwWh^a^&-I z_F;usN@7zQg^Y4<`1<|@-ygm|JkRrbKmWkrr*&Q4!cdcQ5N9G>2eJj_w5QVBI}V35~$&z zrOttljY&=vcWY=*C#Q!uf1*h?VvF$Wm9ZB?GnvjK+OSJ}^D^9TmX^*lt(M-IqmZ>w z1)qnGbvAF)QtFZ(Wdkjv@i|m+pNGhfJUwO^N6-rmbq&JucLQ`S-EJDqP-BCV??4oE z;Od$a%dlknbq%sautuNqKi&p0eMIl5jX=VI)xPM{N@8+9TBZ6!4~~^kIR`vMywJsV z621JLw`uW)BOLQvM(2_nQan0&-h0^&Sa_+zh399;f{X_{fjaW$D8T~lj~}9_@0ZLW z-AUHhmV?HB?(qA|-^R*6fnh(@L>bq+s>`UU#0kjEu5)+RC6Fq#YI(epO?rai9BtBW zdvPgS?QK?q%yQUuMglhXvC2w~+nRil(k{CC`yqrH8-r_Lntg@@hfoC2Phc(G5q}li z6%xU-`J1EQ)z>C!2#qf~kEHo*3l3B?t3cBwu*|VF@qfZq6~fwfWh^zAoLA(z)G;3b zPad9uDpX+}Hdvx53Irl?5U$We=o7AiP3sDJ-{VSFG{x5{^AQ>*fH-A7 zS-2urz8wXXTWRrVG8BpLKJwDbxl~qk^N@BfhXVNad-J=Kh}%|+>3N@2LLZ zhSm>&0wrth@xDUr+OJQPP1yML6l#l zWZrv(Q9$#!{Di13yhVqT+L?8VFzl!qvNJnna4TZed9TN&Lm;mz^ZUf0acr7(36{Ns zn`W%RpNL#>|H5T0c>4NV1O{YE)96}V*(NsbvooX6WQh5bfiJ7t$dBsIm|}!2%>iKDS97EEFL;{oTkVA` z(YyZcm3@A~sNijWIZnUnh9xO>z_%a-4u4hgdmSV$w#5gnxvEfZ(dnc+y(V+7iFzIo z6{WEoD77G5_;znzG8HL%K6Jgr;7_j-=>}=At&5r=)n#AY`^9uQ_>4;G;?!1lh5k{E zN!Kf3?83;!^_GsQamU(Irwq~a2{wb(9vZpzq@X}bj?%>K`p}4OzeZ!HtEHGlcKcy) zD2&41Ga9+QfxTM=rH6(S2qBXVG%6vI^jbeF%P+O$?`0g$)(ZoYj5Fe}1G0OG68is4gB==xeW1(J2T)Fd;Gi(7mL#y|7USu=#08ikd>8?iV*kp#tT|nO z!Q1S1HErR3)M)=vJ}$@Q7^Qb4bB@_~!86C+oh0!&GZNM}58Q08v$#TEx+y0*>*o2K zd~c>io6YZrj;Us4P#k7K7f13QywS{v-);@evRPASR z568jI8j2uBG?q()Y~9fx%+BD$T1I0N{Ta-NwQQ_AP?8W19e4D`PHKDmB3ss>pnk3Js0vsKS#gtfjso4^LQDkd3R|=L>ME1DW*w| z6Qk3IIXasuU8+2R1FbIk_Y-h}JIvFft*bv(#fE!0>qG4)4~oBkfJk6{ILmtw8oeuZ zr)%VNw7iLc0f#aJhF_?=nLAWE8+>hV2O|fQfR-M0OeoTAWnXKURR3V|*wi`N?|%qGMoGYUw!alPdb$TQjp49 z@F8N;#$Wax$n4ucXNULR6UILFuG~)Q+a&x%9rh;?Or^D#!&tY-_=v?(qu<78^Gl+K zOJ8Qzy&%18MHb(toRR1J{&nNg)D1dWXM2b4Tw$=a<2k8Z&6u2G&oZhQs##r-^-q!h zsi5x}U+a;3@}<_QY5p=3(Ui^oGu2HrRKZO-HdO+QqM)_X{l{irQh{5WTE161VbzrJTgKQJ?-EJ7cq zl4*92eW+WJB918$DPkMsoj@)8gyn>2?7m(iO#%GN=>hw#!kBu};Nqs3v}Qzg<5E}G zOzJNIl2R03K$D1sIyf0m(Owe!IN->d~d>~5jmOCW#Z%m6m2le_D@g6rqizN5f4JJl=t8Ps#< z$w!3dpMQ*+%t}lwwer_p@hW`dFw0L91gc~qGl^G%T7vz2t|?e`dX!geaONlHlT}xT zOPIdy<-bbd6B>+ckXyO7D`wJ(Vq-3;DEz+`)PUs$!~2tDhrQtJW=6usZpV%{GW z2QV_fZ7N@4NK5>o19qUSsj2IWlkPhW3oKNF-CLAIj#7pgXdim-MWOQx8=Z@(zyW?; ziad{n(djdmt%(o^iaeO+8`%9u#}EMm&GdA<=+y!X5oIx5#^Ko?TO2KR2KQ(fcC^_G@rah73!Zm#x^p<9ScTa z=NIHc41MR&*D({^8qrQSOJ1>66!DoU&t)!$AD2yI`%J-h?Sm-8=-9X=on7rvy03oE zr8Akz!WS~2DG++hLHfUYZ@G>R?o%nj5^$THScQB5ZZ1dc#_B(qE;v8O1B#!J>x``x z6!B)YK0rLyE@JxZx|o~Ytziv*aSDzDC;@RvHyfkzAu;WkaVFx}Y^Wi99Gf839HrqUmm#))rOb40=aHD=CL1c|$^2+EG{jS-BYwi@NH z)~}(M%nMh{Lv;O`8n`I^u~(HvM3nzFgqEw}p^geQNP+{qcEo_WcCUhFN955SoVZw7mv!`cEED-{eNEZ+u-G0|t?MLPf zXne;Kh0DyEW~i2ojaMMJAN)2s?)?>x0!UO=l&VazybZPkh8HS0O)j!IU9nfiU>ECx z{F-MZU%)+UoV$&`eo}A0nS{(62TI3^7u$+-#6!H^Q*WF+>M+*QW28EhSuu}WC^|sB z`5^vYqtZzh0!2$1r3yv9{H{ULKkNtBI4_gGZ|t3G+KYuB`Edwt9lw37^gh>z>t(FV zzx^y3;$HEh&DCeMQ$)4#>3)|rY&+sh`OaL->i>IaJ zoo|G&<4>L9$a!_rc-5WInmM_SIBHA)LZEKGf7%4WVkZ~Bpg-jPJIA6*)1%)o4!XBh^u=(6e~~bA--}>;TJaM)EC6YGb6~l4$ozbo?2> zm~E@b8UyuRDs-wJysT3`A+=k6ngH?Rty^-cW3}Hpn`dbR*af!`w^>v6$w@mFFi6>* zc)yfz6;6MX<7F)@U`f0+!>n`UlaTxwzMBTpJcnp4bD+O!hL6^^Ntq~XykN*}NdqdA zOYzGCD^SsY3W}srmsb8ugW)-F>J3t!r|37$)KPe!`$JuJr g#wUUAzZK*ZR~P|z2|o;+JK1pASUOlVA${-t2MH-g{{R30 diff --git a/visual-baselines/vueforge-showcase-states/state--focus-visible--dark--desktop.png b/visual-baselines/vueforge-showcase-states/state--focus-visible--dark--desktop.png deleted file mode 100644 index 217765c648dd5e78e2adb960dfad80089369f001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3006 zcmai$=QkS+8;8>>6^YT(7_~k2s$ILb+G?*-d$u-FVvm#>?NfVHim2Jzq7qc91U0Hu z%?eSYQ8R?*_520zhx@+H`JLan&;9X&TbLQp({a!N008>?hPn?f8F4wLv{x@TtN90U z000zrUsuaIx^$-$6l`U~F=W2fegD9$`0!O48dzPOYI_fwlaztdD2#~G3&9>KYWs0NFd61E5w1|a~(|lX?SPvA#j0yf>><6kE>#a;B zmyDK$ed+C1CR7k(3930MjpGvt83_mIa^8IN#5ISLO{=Sk@7}K3TV2Rh%jhi<4kGmhLh1eR?w{-6ZbmQ&b0rGMh}sD3qAGzxQ0{I$>e?1+Q06 zYqAijm6r6m!`2N=jqI6G9r)C2_xUSp1{NVXM&A<^xZLicT53Dm<2R^qjUjPp$mq~Z z0#e^z&Atf8t$Fh3{onVN@qA=~HOSK+ZP>pGnqU#YpPZFJa)R7e z4p;x?Q%QL!AprXXVZE&dyY_-LLX3w{%a--D>N+%K}z$0sxpMr})^JtN5yk1Lc|^sT^G z(i=@aTKg4pu8mrV(pFAqim^V9K1i4RqN{U7UerD?Qt!wexd@@V?%>BiJf|8?eWsyv z-H46J?oCAwQXtQs1$*2Pu6XP~F5^zuWP7GR`IX9u+AH~Hq@#;aC(=SN*

-1Sdx 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 diff --git a/visual-baselines/vueforge-showcase-states/state--focus-visible--dark--mobile.png b/visual-baselines/vueforge-showcase-states/state--focus-visible--dark--mobile.png deleted file mode 100644 index 38e44c3bd094729ce9b555b2e9bb8e829e03795a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3012 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 diff --git a/visual-baselines/vueforge-showcase-states/state--focus-visible--light--desktop.png b/visual-baselines/vueforge-showcase-states/state--focus-visible--light--desktop.png deleted file mode 100644 index 15e3e1f12a071efa27499ae8aac22b4ca96829ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2722 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 R*?$@)%e%H_7!xnp{{V@AX(#{y diff --git a/visual-baselines/vueforge-showcase-states/state--focus-visible--light--mobile.png b/visual-baselines/vueforge-showcase-states/state--focus-visible--light--mobile.png deleted file mode 100644 index 371ce777ec0e98dc3740d5f5f01d46fb5785b3b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2718 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 M8x9tDGvAc|0gUctcmMzZ diff --git a/visual-baselines/vueforge-showcase-states/state--hover--dark--desktop.png b/visual-baselines/vueforge-showcase-states/state--hover--dark--desktop.png deleted file mode 100644 index 7387a981a9a87015f23a643f2754663682ce4353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2453 zcmaJ@XE+-Q8#QWgO=Gl5tx}sBMQeu`DMfKnqZF42Vzjkat)Qi5tX9#`%0+4mO|Hf* z5f!y(Q8jAEPJHhF`+Ps%^FGfx&wGBp=cHLfOu5*F+3D!$xWHz{4=#4t#aOX2T%f@H zPB}U{HgmACf!))RjS`Na%LE~U!!Woe_hW%*U(U{HyaHl}5fSexBU$KaX7m&TW-+e- z+ZI;eCQ4S3Epw~!p@!fo57x`WgrT9^$qdgB9)`NXPyrlS!@cJV!x^s8yT4I>A_tN` zLbCZ0EKhJ8u174yz?+(8U1xsNwx(c*;airdk)6Jj-d=x_eRRT^*WxIYA3VNX%u!IM zG|qgILN2(1hFFnW;dLsqQopxY4jQ>5jlK3yYBVBk70Yzst7m@uaX8Z>8ND#v!e6Ap z(hk4%=9{rc0iGdiebY!v81K&|VzP2<;EkjfVORx=NXbd_Ck>G(pSjia#(Kp>OKBxV zr`+OtkwGZbFGSl3IvQ|2yWnNX6ICG=(D+dzJ0zMuo8THz^>h4`B^w*dOB*OvgBf3E zNYT$I;)FKqi@is8BwT0sYZa+sbUJY0Ht_YILz>^lW=NaMYklR$fxO8K-a%)_OADFn zJjqx9&UjBmq@1MW(kdx$ISKpZ+XVk?=3ETRmVdmVIu6xP!G{WIm&j*aI8G?_H&%&W zqvz4lfo&$dt(uR8tqTv@Q6prsSA-P9n-+wV#?Yf#M<|xNt=r0jq)t{7@rJ^N{USaV z(77^a=vm6Ut^1b-_E@rPf=+Uh$p!KySg(bBDUKQ?C#~pzaH|$Th+E@-NeQvk2tjAB zVq3m`^Y0MUq*Y4gDJOPD9P`Tr*flggD0r1G(5_gkO*bbM3jux8*$aNim%aIT+7rc? z^(!>lsrb3X1%fIMgG5udeS?#3g^r$0l8tG%iGZ%~Yd2_CcX^cT4vC;c*7 z;&1JqF=f<|?DqwA_`=WKGl^ML@l(w<}ijfn-CL^{Y;IQ@E~CxF!`a3QMqy>Zl*UZ3aI z9z8TcU#>!-@4nrdRuihGrUP!LeJ^^M{4LRt4*E(?yfl$}E;Qgo`*oU(FMxlct+W>@ zAXy1c&O3#6KWH2F)HtqwjB(>)FUI%{muU6AI0GN3(T}4o>o=}ixCQK~@hF%Wz~7)u zDL)!!=~w!U?`5wXMBQ21e(L6uv3=D)5EOrw1XTNg-$X*TkDp35M_=VG_5Y)&Dvh%; z61sui{W4~e^2kRI6GoFLQu$7-t`e&K3c~N|<*i4ckMXDzhkKnNdzA0i4`lgzP0bM0 zjmxKUbB;*omx65FwXJ?KG`3dItwi3aWb!h1Wy&lfh1+H<@E$GK zWL0HYP>8X`;1=+t3|N2a6upuzuRe_k%>#TmEvDZXDmQugSN)gJOF^Wpupj)WIgw;#z z#lS^6E4ChWrE(!g9_gsrr=>r-_N^h`HvSx`x$3UPNv zO$)ZL2Rqg&B5>*Toy;hk!Iq6Ie1SaoinCtf-p)aOmd)BzuVJO z)3c7qCJzY1^k^x;f6Ga5GU4nJP}H3b=inAVGZ-Jc15re5Yy;w?*$VTa&Nd>kj3mkN)OUeoLg^Zr*8 zphQ&01$DRxkn&fEr^SCK1fix|d_8Lq0{az~^g`!cu`}A3(LsR5(AgvTWIoJMAZ;5NX^S%edc$tTTt@qfy8r4fTuxA_irmu$NeDwb(0}O+xno_Dd5Ay*MR@TXc6mm!sPhDjTet6ge z8o1@(?)~?9Y!Zj0M-gYPIsQggMM6$$DmEl|JfkF?Qtrzr_ZvbEXEG>Q3iYJgjf`uI%K71d+dNU$*9 zpi+&>6s*45w-=EqgBg0=DhY3jQ+n@*HjaNFZmWxaATd3EZ4O|$Km3~Fn-gbY#AL1i zJ{jlpHZ@cWakBf+Cy>v^^ESAr%E4Qg>$`poZtv-%2Y!O|uLLyyTCIB}m2-7S+N?yJ zt2X{jGSNes+qbf(8ulR|NAFJxzrMPvFEbw_61$U*2o6CvM+dHHRkZu#{s;Bc*@XZA diff --git a/visual-baselines/vueforge-showcase-states/state--hover--dark--mobile.png b/visual-baselines/vueforge-showcase-states/state--hover--dark--mobile.png deleted file mode 100644 index b212615c5c2f263a82ffacac94a9e9bd8f859b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2429 zcmb7``#%#58^#yOoF25ud5j!#$XO&ZYM7BqmMn8#jEy;!O*totsK+tVL6qjWnVc31 zvG6)fi9Je=g)wuU*Yh8|?+^EVeLmOc`t`oQSK38qn3%AfFaQ7$bFjC&bfA$3g8=d! z?Bg!Y+5mu%p@W^xm6)R6MM8KGQ?`rc__mj-$J)@6m!Psgc;l>3z&3^i~tN=b=X7}Glp-lUsuO0?Eszt-x&se15* z*X3cydS!ZVYkTd;GYT7)TP8@$ZLFQi@rEWyA{6on^wm68`?EDvFWVhI*4x|EN`2E> z=4fVRn%}A$*r4X^-?c~0qiwboo%J`KBkl2V&qj9_UqXegMg0=1xARseKK5)2(w}3# zB%eXzH^1UqB^0&8`a(iNlk`u7C??G>8Y(xlqQrG0@eAYQL${Wm4w*To3kpi{#p?$$ zl^hZx3>#iI4fz>5f|wGAC8gx6E@^csVu=+Am%Zpg6ywPX-DdpKYBHfZ|9w=VtrA}< zeQNcpV@|$P0O6-%y(qm5w<|m!{c!iR)`^MM3I#diLWWw-JaWbvWs)RsSf|_^9er&M z4snWz?3NL|aA8IohvVg4RYf=psQy_Biq?6daAhviLNC*-e9lZZ10#Ev5tnhncW@_{ z-a&S_-k=q%y~&EY*2`FR!QM)WtVIUHK}pf_3kp$`=dVQK!{P!`KL!vQEg9uX zq~s|~g?=g(cs{O7D3M@cN)r2lnKp%-y85xE$hOdDu-WI>du$uA6#3$+`D@>L*2QU4 zcKq&R;2@84i)%!v_KLq~Y4NmmY$ovPU*JZB+bn*dH(B+kdY9c18)W4^I2`z+j^Mic zsUTScs@FcX`rt?l!6JF1>*1X9vbEP>qmjXIf1%NHqhh_Au`S(Pi=C~6jB$4XW<&** zEP68d^6yPj+HPkt>jp0FSK^s>Rm&;aKBuByR^^8GZF2H!&A4UcOm1R}<8>+XJDN4% zt&s@_>+jU|bVgA%vdXMyqev^-O2;!ZBaFv8g)((UDw};`HL*ufv$#m&22tv{jQG3d zyJAXx_YQRsn>+*Zs&{>u3(XH??2qHGJwumu?k~Hc0(H(O2>e*c6EVs}dAh{`3~dh2Y*2`?jN)!rO%D^2^Pl zjJMM&K_4Z&4P;s0jumdq7Bc02X;iTm&(sL^fg(;-{$Z~Nv~7i@PsC$f{_rPKHblER z65P$#*Ezd=G?r8Yede;(lyF8VS+GB-qc6spC0}dP#2U`;TW?WC7jh%!m_zqP?y|qB zKDDKuGFj?@sT}t5HoV?!PBr^kYHQ4`s3PJBP}u(&&>u68~MWs6#Ndj*b$&nUNbBJwCBmzx$^AP2|sA} z*-gThH7#jIoJL`9@vz$Gf}{qdry=~S#rH62UgxUASK!o4Mx3m44vl?(1bgA&wY1Tu zN)9p>CQtlVfWD59FI%#)PAZS3UVIcCE;(zOG?VlZOKx?`rcS|+8j&`kv(E>Q&L=MI zbVr_kAuelWXZuL;D`hT3LOpN}fM#Y5aVempA;DKZqCfV@s~nb%iDY?QI__ zD7{R$g2F}~hmA1g+#y7y&dh=foG-CM0OBRg1S8*jZ2Hk znx6ZJ`!+QynkTdFiP}MN3RP=olO*3!uE)QZ8s)|f55!l4W^)zP?+MMo1h(w9@kx4r z;AyQq=#?zEJydIWSn`p$%BoFI4RxqzyYkL{{kFRvswTE diff --git a/visual-baselines/vueforge-showcase-states/state--hover--light--desktop.png b/visual-baselines/vueforge-showcase-states/state--hover--light--desktop.png deleted file mode 100644 index 6a2ddb61e04956a555354d88baaf891703aaf99a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2425 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 kym;e9( diff --git a/visual-baselines/vueforge-showcase-states/state--hover--light--mobile.png b/visual-baselines/vueforge-showcase-states/state--hover--light--mobile.png deleted file mode 100644 index 44d73abcf59c530307180f0e5be9ed50dc6cd3d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2399 zcma);`9BkmAIIlPjEG#x2dP{i$vqV2KFU=RbNi56jv>v4v7~D#k|X6xF~^2&m^&ux zBP&P3oH1uMG}peq|H0>n_xt&JyncVbAJ0dQ_Ev)YXZZmDfS`@Fx$`lh$8+N(=kbIYqyj{rcS2m$xDi43unWbJ8~kKm-3|r zr>4pIF|~^%|$`Ot}PK?TNA^w6HNi z+wShvtqmB0S(+4UP*eGwF{)r={sq+d`l#{FvFL}jTu1;{=%Le{;9BohYH4H#(UlUc=cU^GI9Ra=}EmY$pcnS6*OdRjt zc4js8UUx{)^7Y znv0Z?P4?pp2T-BlOf!7Ca{d@oEqL{72}k&eOnM8=9i3`|^U)uDvPsD4tc<*=_gYOU zN=-O(nYz5i8e_J3PNdxWlxCx9fOFagdswWiz!i3OqB`IUjQVBB&x}reyjuY`h~g=$ zD|^l5Mcwoi{8@Rg_MYG4e-j^Cq6c2+ZjY^B?Ok|$>2649@C^Y_kC#q4N|q;R<(E9q z4A4^Gl>iGS@~baL%6^;?;1zxy{g}XkR242dz|1=C{TZRnqeE6U{=)ibW__R-(YrUp@qLSCLYMFZnKH;=PEKqgh-it=N{S>!jGVforMy zF7Lk9bFG+qKZrVja+sZBe}R3_HUWn4zgM0-&^RDwSE z)qVhDK3{rip9j=!%049f*lv_B#uxvPl9i4&s?Am6H$=Nn>npKEr!qjZGz-vBQR$&& z+P}G?qZk)lDzq8V4Md(OirsiLi<2X$S1U zOlVk!bOLr@KPdzDtuoTrQ*lPmswewH6C7a$JTJSx65Pu}BpBBc8+WcHzvx{w;V1dU zUjN`gP50mYrX#~Oy$V^22n`7zOpCZuwnBa*ezZFxwAOwqR#&T}W#W~j29tz$Lw!r# z8$tAnEca-5v^MFY!oSnbX-;`z2m3h89a&kYn`R!Ungf=$e$b4&JdNwVz`|z7wecO}XJ+ z_c&kGBurY2_M$=YgkQC4IYqYO>2w_x)u73Yskpw=pK=|uH8t;1>KZFpH zD5^9JHx1N?+Jrh?b6#_w_oZv0Skys4T}^G@U*xn+MxHItFLvyn<@Qtzp%arUoU77o zvTfHzlMCPNpB9@hoow_sX1)7uD!WcokV%afr%Q zq5BE)%-AZUl%-GS<%@hP}Blk8Wt^{)G0dtewULC87UrYBQpyaUE9ex>``TGy|M`(v-q|NN%YxWkOL z{+7q-w691;4d;0%C6UwrJ9-Z9wqo98fpdf2!~dxRpFe9}_SQ_#{}rBk{ioEWVwCP< z;Rw3z`0A%4Ol}G$@XHm~_d}63UtI?`=zrS@3w)Dnlsg@rFd09?)wj23)TG|}u@46Z zNv=xSvt7Xtina{Xf3JKFr_eD5@-jE8-$Zc~{U~HqKuroC-4t+sx>fiol&vfVbV>9V z!IF?_u0$1)uQz#!P1pnf{9AtXhO^3c!EuMpcQdmFXy>MT4!*3@FEGOZYAHK%<+NA^ z$?g;Op;#$t_)7z#zc?F$=5^;>OSvu2lVuYi)d#e)@IT2r#uU4ECq#OvSU5-s$FFQ{ zHJ7Zy_2W$4vg*9g*z;#H7u|a!I#^z(b(2_!VoT#@9fXHx%GyW>)Ua4P5Et+2gZ%OQ m*pAq2E5ri*IGp&uA8`RLLWg3@=hx?s8-R_4y*b9zC-r}Zx5VK9 diff --git a/visual-baselines/vueforge-showcase-states/state--indeterminate--dark--desktop.png b/visual-baselines/vueforge-showcase-states/state--indeterminate--dark--desktop.png deleted file mode 100644 index 6c563d00ac776c382eb5c960cc2b496752bd311b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1599 zcmbW1dpHw%9L9erx#p;al*^GwwHSwTKVi;?G$bFj>j2Q#7AFcY<1B0-vX1n z_C!WL9tK;Tf_5N(GFYA6(^jOhBTOmVxl)DTtc+LDKse1jC+T&}X1ab#=XrEE(s&bm z+o%_oQH7D^aEGdo`8fOQef5^&6K3_F?^>p+#pm6nxZ8UK+BVW9F-)~8oaZRL4$pBn zimAQ1gZ3J~{b>JvRWfPgSadA4)vh{!`+=$UF3~n4yXjFD2L2o_t-kb$pt++F+`%z@(`fKcw+{iCM z++=4|Flw=A|5;SPHVk*fxH?PlPQGuR7tL?8#GNmVh;Z>#1;_h7W+xme%O^}-RXag| znhox+Y!KB6m*_s8gE0xA2|~t;hpyEqJNE)xs-|Yqm@2{vDD5P(Ki+CBB`QMAjDIr2qu9ZVjzLiYgj=ZijOe3{J@<34tiFB5 zU6W=0G~{BaF7eBKyz+XJ#uF2S727Z1c_=fQ9UN!x`AAYPwI>!L3VqfacK*X*d~Sv1 zTE^8KjSR0_iBnLb;Pyw>m`YFM;s~zj(ehKx zLz4Pf$;0KR4d`X|u*JxMDTeELf$aD?JV|rG23g6D(=dc$x{bNyu_*5Zstn7EyXJnU zUot;{GDQ_z@#9J;#aDX#S6~JfYkJbiqEiAWv6bJ^uQgWr-tNFRb}-z&h9_S=mqBK& zFV*PEuygc631i9X)p0r#E1YNyJ!xiWfy3b09iPz7$qvI5mSmJ+q9QRgb7$0*QJd9@ z*)H!`j-hp>7ph2HXiD4nKrZbqGRrI1$p+D8S0~i>s^xo>`34Fzs8Zta8T93V9L07B zLCIGYub5k14b?MnE2(OJsNH;KZoT=-{a2-n;So=b2U}+1q)evWpQnooyC)Zr6vnz0 zZ$OmH)Cu735wGA*wG1sD#0*cj+dXi*BY;-Ke<|Dr%cB@!4!1d~A`lC~Dm$%B2|y#> zEh6`rT53vF1DBaC#(n;(Rdzbhm7!ztDe4d%y_|As%JoVqjT5kKd{7@!E(d>HE|>P> z^yFnU6{4O*{DWz@%n5w#b8wW_B>LRsUK=NR#!cd?g|@NOndc~B-;yc5bL5xTf7NQH zI;#?VrU`JMWH-w3Xs>~xV|(}pbt#m1XCfg%jA81WO`R|RH=G>6twg&;qzp(CI2@D# zKPdR_25CMy-2hxm_mc&>5RxeX<+?;EAh(sO1b#l?8VP{oKcZjPF!e+ZGdMJw3<*~O z%^l-H`$sq5<(fO&hzh!c1St{?DS*6m!Nq5nTL^@xfPHb&B-wg+J~$Kr4Xlm9gC=?d z7bXWlWp?KllGOJTY;uDjQSmQlsi527i2UEo3AA_tQN&smX7VHneOYMmM7duxuel7p zcgnDmv?ke=i3cEUixgy#^(BOY^Y@BX>Ee+_x+avQFYK?oIQ0ndja4E L_jY>hh)n+z8`SI( diff --git a/visual-baselines/vueforge-showcase-states/state--indeterminate--dark--mobile.png b/visual-baselines/vueforge-showcase-states/state--indeterminate--dark--mobile.png deleted file mode 100644 index d265843ea323a5d796a388691bba4699f1628464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2422 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 W%u$}~#*++17T{>-Vq0h9f9+omPW^iT diff --git a/visual-baselines/vueforge-showcase-states/state--indeterminate--light--mobile.png b/visual-baselines/vueforge-showcase-states/state--indeterminate--light--mobile.png deleted file mode 100644 index c0a349751754c61907beb2ae6d19c11842a13a4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2448 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 S1gb|lq0-ef)F=Z#efJ-Z8$gZ# diff --git a/visual-baselines/vueforge-showcase-states/state--invalid--dark--mobile.png b/visual-baselines/vueforge-showcase-states/state--invalid--dark--mobile.png deleted file mode 100644 index 29af5d72c20bb5bead0e488137f4e7eca907cf69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3872 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 diff --git a/visual-baselines/vueforge-showcase-states/state--invalid--light--desktop.png b/visual-baselines/vueforge-showcase-states/state--invalid--light--desktop.png deleted file mode 100644 index 06d1912f721dca5a819e08656dfd85fb71f59d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4210 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 BU()~p diff --git a/visual-baselines/vueforge-showcase-states/state--loading--dark--desktop.png b/visual-baselines/vueforge-showcase-states/state--loading--dark--desktop.png deleted file mode 100644 index 0d97d0ec0ca304f04a38376c53f523b151ca1ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2338 zcmb7`SvVAm8^$GD8d=L@Oha=JDrJoKMr4@?(3Z$v#_x6=zohRI#ebu&d-0lRq_QgZby(QoSGT^;YNcIuC!jb0!W9yFGDXmwC> z@N}ym6O`Vj%AB0SMyZK8bIs-{t7~pJDOvt|LPGaa;dOl~krc(0g6KE8lpD(yLhSgC zhS}xFLI3<^&}JG9m*>nY_JuJ=->K4zd#T>Ic|>~#C3dd4D(wawy@D5?t@4=<9iF*+ zI8o3#&lo5cyh&)r++pqdY`aP0yKp;N{6Cn56m`#P%>wo0uA@sJ!!G2+Z8CNx+1z z_SRk|@Kf6<&{E)g+f+RXf1e_*Z+yn4B|dEjjJrp^m?ec1m3r{s-~EtD&QG&Td+?YR zv=d;cM$wR{b44=a&nA!~8MD`=3&g3kh}78D$ELhnLT_Fd1RR?7yhRprABKyh{DIZc zCh_`$ey)f`e$?~dY5rODe6C$}DPWR-jkGv2G@Fz=7-U`=QXETHZ$XJ;M-!#H{4^9A zY)Z{Oz2R?veMb4_2cB7Bx`PlA)F)rkAtZ3e@Cxz2Vb5Z_&V)MQL^iK9mJyOo+G8^c zKrOwS3b@l#m|kk8Ko*gF|CI*=i5E=jA!d((QylBlBEG z7FSo=;5E^N`SE><9giS|*ghNx$t+3%#WZugE#>=N^kq_nyD|;MPOZF+fYgxhN>KHGJag;&mgN5QxBScT!wD{`jfU@)6gw%uI7$$1x4m z!!X5o;n>eZsn-A-mrGPAWCY?ItjE1J%S=z^EYg(AO=dSANpRc-fknK$m0^E~(huAS zLGt*%za)`1NtF$fmy+An_<-V*$4q;|vcKfmO)V!inq`Ev0;t%vte!XXUyrvujHPZU z2kmKtKa6b#^m~fI5a48Q@tN{5l~~2>U8{}B4NgRN#mC8KyGfY-jdzT2JJ8lTcv#es z=+HLnW^08Wm?`#-*z;iYFHO^S|Nbrt>h2NZ&Z`Vmyp*3G_LzL(HAh(T%^qsSZM0>m z*LL%iXIIm@-(c&U^^KJGB8Em0hcAZo(@IjlP}cnVgR?-Pk+O12T>jF9083o3nvJ=| zkb?vWHQ9J*>)8dF^1KAetb#$(4tM}g5`p~>zxy@Ng)4VsaAvZff@T0Ncqf;E<*yG6 z3KiZx(QO{V+C3qJlZ@RXc0SH^b-6J5VbUwNtwVAGNYXJ+XSOq83QRODZm7w5bu&RA zv^>uGK4NdY@bg7_F>vgOJMNKeda!0?xF9_eUC^MoQrGU%cNf(SuL2bV;leD>`X7zQxtw z@m-b@?|q&%hFs=`br5&=m1xt6V~D!23ti7GuN$V|h|P+b2AaoT&ojM(sz_!%i`+Wb zvDK^yQExs-TA6X)MGe(L<@AQ)@$Mffn}MxcZLuHpsnM^?TTE`N?t!I_!t>#No-dN> zZRC8$Yuo#-Ou#ctimHQpk{s?8BIzTxfhD8BwWD>9OatYB9U%Yli3og=m}cU@!CqTiy7o1RZNYA)N;GkV+%^E8`}JF*RXzoCCqDURfl!rD1ca<8*N_pC?Na@3<= zeNBXxSK%ABXo#;G6WA|zOYoV)LR*E%y-v;#5o@TIaE7!gKoI2>QZu9WK$e(srWB{c zm33L%i*Qaqwl@$-&4E@cN9UeRzQ?PSwIPK*{6+4b*Mt;vB1=v`Enhh=?7waH z>2mX_M>u!VfOHN^(TSc{fpM93}4FH#>#9~JoG&low|RZd!K$_3_K z>X3S5LSDecpIpRpxsK-yaK7f|0Bj@ww%iM$GKtPT%f+3M866S`Zp5@t!d*Dvu- z-oNh?F&pU}YsNa4hdGc5#*(m19u}69lN)S0x~ENt&o*8+pVyO)Mp*y^Bn7y*xB!+2IOdS}Ls|24ANnUE zy^@QIzs(YEVjo?yQW9Y2>?AoLw6Cb1#-046wfSRTXYpCchF{mG+8F`k^2>~;Tf0c zgB`<#m`A-vn7b7G%3MWkS0Zd(oFZc7w^QnFj8-N@OJ|xtLd7-w6FI%U8Y{HNm(qEA zD?7I9PvpjY!)aTkgj<|DHHkl$HH^C=IC%x{%U<1HFVsYW6t|eq)r{D~WxzzvEzopG zP*AdLJWubXHL9A1j~0VD$eWAsZeoSp)$uuDv>iDybXO>mP5=4z+(AGnIA?giQe^0tF5ONeERod@ z{k7m*WSVMxkK|v zlBz_eFdu*%(4cgx^P&qb(~Th94|* zhkfab3I(Vt%ut^L;X{g^hmD|;NP4C(RxwXq3?Y9CfA8+^xU3R`z8lAhY#*)r&h!so zE3doXIxP@+5K%vwv?Y#trt{P23^U9nqa-kNf@EjOU|yr5onuqu-A<>7>dVFoB4T7Q z0gV@GR7jtM3k9WtA|uP?iQhy{pMvYR19T>m5^vG& ze$~ltQ0x@%z{+EvW19qbPbr7{*p_AvX=Byf68sad@T^< zJ{qE&M|3ubmCK$Cz!~`B+~6o#{7v~u><8WZ+C>{qtGlbmPy;0&Kc{b}M~|$&*pGL6 z^?g*^U-RMR?j+K1^UGQ1I@>AsuHN=Ih1HZ_Z>0y#%2N?DaGi8eGt_4F1WLh$cEzUt zUK{sVYGeU=cYGVpu4N3jF{2V&qDkNU6E=Da;!qiI) xec+Yfcs-|jHdVSj1@ktE zMIN4UytQ-Etf&0VDzGcH=9)q=&9ri(6ru3xp!>>5W!CRS7j@h(ws^veTqJ2XsQu$? z_y~31FwTl%Z{ED>uj!=uY$c*r97)rFy_#e&0?SGTdH+aYL-15UaHz52ZT;K_U8M;# zo9fqN`5yNj+?*li<~1(?*aarm4=x{NyJ2FNuBh8#8!<&A%V9Ew%F||Nu2csn(}x#c z`0S;df$7FZCcx_Nq~*DtOYQqO#bU?zo!yKE4mf?6_-EBN8YGdvm-_B9Uy1OMG93Gz zlFfxZ8X6>WoMsK1;(z`Gz(*>tsBR-=0!!Q5-wbw#>NvgB<9_3RMpTsnakn8uSZD-A zy=weAsn&7GM;l5JO^<#N^!yZqxh~>`?!oNof;k4S=yx`fO4|yuZ`e)h(&i(ItW&yR z!rBg6XIofhSbzU}9Kw({dv}t4Aq#H^1Y0LNOZQipU)uR0PC3D1hHLVVXWg}e_M-1w3L^HqiX)`z24Jo`lHSn z%mw^;!FtUe0cdcmNg8~~G~R(ZP5441e#eAdH;C0`cV-+9!K1PtSJyk~>1@CR4q)#^ z^mT{eF6sq(%M;V{IZN_ymFZvGSKxJzF_hmwsj$xhnYTQDH6cloZK3&T2?_ArXzvwC zEhcW$PW+P7=1ZDuvy~&vwC`0Tw9BpkJv*fI2WJ@)C)v2B5USD9YZ$q{K@*}*^&1k@ z+N0_^x2M47@+KG!vg<%#Q^$h)4q+%@#I+-yr=rOE?OfE}SjUZe#MBqh`U!6>lGj1g znBB~C_WU>7DO$%i6`I>Boe1z1BEvyv$b}Ga+Aj0UnhQPxYW!B`vPtzfkFZM%2naz7 z)D*+tEmF0ob%czIxhMh1&T?Ipfu>4v(dCND@TY$f=DDdv9#0a1(adCpFOW_RmI{#*5zEGi!1uG}B&a6^XVdoi&MC zoA%eudsGxhtl5I7PR#uE|81&+B$s5+9v?#yOYK&etonf|BYCA`7&5Ty&zPLl=?JF% zC{M@X%$NzJ*C?Zo5IBS5=H>QYFOmITqX~6{BLV&4k1*L7UlSaw}}d?0_mQNm#za__CI@zY>;V0jqZ rDB*yIi;KgN;vE}4{4#w1J25<5Qzv6VkeeZHhY6RZ846A{^+^5~l=5p& diff --git a/visual-baselines/vueforge-showcase-states/state--loading--light--desktop.png b/visual-baselines/vueforge-showcase-states/state--loading--light--desktop.png deleted file mode 100644 index 1a4e975116975e57e836b7e4ab3cf09fb142e140..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2393 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 P{fUr+9ST{FxN`4*UQ~%B diff --git a/visual-baselines/vueforge-showcase-states/state--loading--light--mobile.png b/visual-baselines/vueforge-showcase-states/state--loading--light--mobile.png deleted file mode 100644 index a054bc7ab577c6b38fc8ca1c7fc7803d0e5ef02d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2355 zcmb7``#%$k8^^J14mKm^xP)ot8l^%i+FEY8mCGS>hUAhuHvql8~CQLX2GJ68rj||KR-aJn!fAyq?$Vc|AWopV#M}n~NP-R$W#?LIUhy zkG{M|!d^JZNbTi!l=qJ%BxGhB&`1wl>3peAghroQUzW((@p*csiz6BRZYYeMh4|Dk z)eTlhL@O~e3$lifj9DXu?gXi%8TZsSRedfX?7MF4)sHDEP3G72a#cod&5ux294lkB zDd@k*`j^ji`wrMep^PTsdFo~wVaYl$_Gf;yXnQenn`6<^<+lcO(`4-&6yinYC)COw zCQY+0uB+(P{6;pwCe3EhUBGjyOnSWN%*Ka7-o|_0Th{LKz5R9ykJ@hw3r;KWwq_N? zKi_U@ms;Jac?nj`@37tAK4FW0w7eQDO}>D|o;@y7UY)TZp8e$OXQD{3Zi}_igoqM{ zL7CM`$8;lrE}6O?>U_3E=0BH1Xm`aW*p81HuNHdZ>Y#IOz6G2GT#%+L@ce&4zR&>P`>X z7h`PK0lAbt3(YM0cbL%bB=B$J6L%$ce0=4q4uDEHNCbWuxbl2|mgJHVY(aNgte6feDV7oPKiVsYhvZAHhP$ zWf~CqKG5${|KreCm86TRFrgan_I`CJ4He8bV>mNfF7+e)L1e{Wz}e35&_|k(kUk#X zTzdRKR##l}S$*exHE0P6sv1@IxNA0!Ilg=3fven;^<{C39&MUyVgKu$_ckp-z;2j9 zhjzqR3Q+4lq{vnX3GuvE+(!RT4+^>|m^Q*;BC_~#wQo5#nb)5`f5Wvv3kuWzP<9MG z_lK->1+O6DhCU-s*eleFS-Ftuf%kP!iUi}*{f~zF-h4QH#3T8UQ_eIHm>?E#K9(=9 zX>{?UP0Apk%+gtW^WJJIv>R@~tlpt2l4#Y)_|UsC5eIRf^CzX|>XSx;v!XVEFQX=E z#jV`&a*dMGxMr_IfdSzK6-cbyC;Y;iixcMwx#wzu>xu8ns=4uP_ywh(7hfXr6>|^W z`bD@z^X(k8Zo=$lRlN4PP4UUD+Ur9qdiUeGCpDZ8DrkXI@EKFJ?>!FKBzJhZWOVrUt&J_2|9*2I!`VnggnPm<-YYGqUf;P}a3 zJ$!#7*1N)1ZXKJC%d&xT!^8J8)kpLT93Iq|mkpL}U@-O>`9eY@$7VMvY`C@jDP7;xGnp3CPN%Cw z0P0_P;@F$RXIx*s1%F6eGy@Z7E1#v1%!&~fi}324zP+usvR~92!CzoIa0{+hojGnPTCKZ9Byu8YiQfs0z3F z!|fGUh|EA-gyFl!j=noAA(*4DCwR?X!sX5BC^y)nC_>0eTF=~C1vz@SISi7Oc?cV& zuC>TaxOywW3!$veXyCf#7e+)4b=|@Ry$)5+RAJF!Uo$X_iu`prrP1t)?6P`aTYZt`L6jk8TEg*2LXlvlUYW`AP+M zHeh||X5jm%fdlQTdxsLA8NIPAA-avs=PrB_g?xk2lX2{+HR0dG<&glhZ9wO}*=A|B z((PFI8~aNm<l@4Q>Q5jIqb$*T$|IheJMB>&`dv}OQ*@*vn+-n?WVq+*C#=s|vJ z+e@Qk#QRXjEU))XG_54zfzf^4sDhv!xQwu)y)!k|uQ>pFQ)UDEMP@(6eCB(gUD_?_ zMv=E(FlP4WRoJyw>D=5(k(q zzp^aA;mf1f&dsI%FpfQTzYo8@qac5Ulb7pJ@TB7@(zTUZxv%=X86Yr*Dy1cmK^?6u ztT|Uu(MEdH@+E0H`G!s63{hu<%{%M$%+S^skday=`I>lJPK{{S+jqXI;6?qb9ugCQ zz9*GDrY6{Xa2hEEWM`{jc^E+6SekWrp=nHx*<08fj;_`dB`;A@+CTHzf28VcBY8Rk zg)*CAlhKG2lcHjjgM2oJjXW%Ct#oV`WY`wl^jWLf1L3?fn*Wbr^&@m=%7en3_`YaC zCpFsp;ck`9U-H?}NIkWq+c$l((@ z-*!pf2>nU{!D~AzCVpakqK2R^?JW_Rjsr}(`kk{f!;pfgSu9`a5I(~vJJ6eux##Y;4_GNUOCVT4gWXzw$^!m{o4k7WorVCkNHWulk|hcI+c7BJ2o*& zna@Qz)|JrOvN=mrSDd$rKi0Uth?T7%Im|zk^)i%G$^EU?KKt03Hm4(h*Y2$oo=R@p mb39@(0mAm*D}ev^JOGIpA^d)sV-0JsBjIqt1x-i!r~MB>T7HE9 diff --git a/visual-baselines/vueforge-showcase-states/state--open--dark--desktop.png b/visual-baselines/vueforge-showcase-states/state--open--dark--desktop.png deleted file mode 100644 index 1c53fe2bf9636304a206f8af5af78b5031c32ffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28346 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 B6+Qp} diff --git a/visual-baselines/vueforge-showcase-states/state--open--dark--mobile.png b/visual-baselines/vueforge-showcase-states/state--open--dark--mobile.png deleted file mode 100644 index ae23cab53714feaa1e8913c66ebfadc09e71b814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23612 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