@empline/preflight 1.1.11 ā 1.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/checks/consolidated/auth-storage-state.d.ts +3 -0
- package/dist/checks/consolidated/auth-storage-state.d.ts.map +1 -0
- package/dist/checks/consolidated/auth-storage-state.js +146 -0
- package/dist/checks/consolidated/auth-storage-state.js.map +1 -0
- package/dist/checks/consolidated/business.d.ts +50 -0
- package/dist/checks/consolidated/business.d.ts.map +1 -0
- package/dist/checks/consolidated/business.js +252 -0
- package/dist/checks/consolidated/business.js.map +1 -0
- package/dist/checks/consolidated/caching-strategy.d.ts +104 -0
- package/dist/checks/consolidated/caching-strategy.d.ts.map +1 -0
- package/dist/checks/consolidated/caching-strategy.js +725 -0
- package/dist/checks/consolidated/caching-strategy.js.map +1 -0
- package/dist/checks/consolidated/code-quality.d.ts +83 -0
- package/dist/checks/consolidated/code-quality.d.ts.map +1 -0
- package/dist/checks/consolidated/code-quality.js +445 -0
- package/dist/checks/consolidated/code-quality.js.map +1 -0
- package/dist/checks/consolidated/console-statements.d.ts +32 -0
- package/dist/checks/consolidated/console-statements.d.ts.map +1 -0
- package/dist/checks/consolidated/console-statements.js +304 -0
- package/dist/checks/consolidated/console-statements.js.map +1 -0
- package/dist/checks/consolidated/css-advanced-validation.d.ts +24 -0
- package/dist/checks/consolidated/css-advanced-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/css-advanced-validation.js +415 -0
- package/dist/checks/consolidated/css-advanced-validation.js.map +1 -0
- package/dist/checks/consolidated/css-organization.d.ts +14 -0
- package/dist/checks/consolidated/css-organization.d.ts.map +1 -0
- package/dist/checks/consolidated/css-organization.js +432 -0
- package/dist/checks/consolidated/css-organization.js.map +1 -0
- package/dist/checks/consolidated/css-runtime-validation.d.ts +22 -0
- package/dist/checks/consolidated/css-runtime-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/css-runtime-validation.js +330 -0
- package/dist/checks/consolidated/css-runtime-validation.js.map +1 -0
- package/dist/checks/consolidated/css-variable-validation.d.ts +17 -0
- package/dist/checks/consolidated/css-variable-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/css-variable-validation.js +412 -0
- package/dist/checks/consolidated/css-variable-validation.js.map +1 -0
- package/dist/checks/consolidated/dark-mode-consistency.d.ts +23 -0
- package/dist/checks/consolidated/dark-mode-consistency.d.ts.map +1 -0
- package/dist/checks/consolidated/dark-mode-consistency.js +291 -0
- package/dist/checks/consolidated/dark-mode-consistency.js.map +1 -0
- package/dist/checks/consolidated/database.d.ts +95 -0
- package/dist/checks/consolidated/database.d.ts.map +1 -0
- package/dist/checks/consolidated/database.js +427 -0
- package/dist/checks/consolidated/database.js.map +1 -0
- package/dist/checks/consolidated/e2e-checks.d.ts +52 -0
- package/dist/checks/consolidated/e2e-checks.d.ts.map +1 -0
- package/dist/checks/consolidated/e2e-checks.js +157 -0
- package/dist/checks/consolidated/e2e-checks.js.map +1 -0
- package/dist/checks/consolidated/e2e-regression-coverage.d.ts +14 -0
- package/dist/checks/consolidated/e2e-regression-coverage.d.ts.map +1 -0
- package/dist/checks/consolidated/e2e-regression-coverage.js +151 -0
- package/dist/checks/consolidated/e2e-regression-coverage.js.map +1 -0
- package/dist/checks/consolidated/e2e-validation.d.ts +137 -0
- package/dist/checks/consolidated/e2e-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/e2e-validation.js +1001 -0
- package/dist/checks/consolidated/e2e-validation.js.map +1 -0
- package/dist/checks/consolidated/enterprise-baseline.d.ts +9 -0
- package/dist/checks/consolidated/enterprise-baseline.d.ts.map +1 -0
- package/dist/checks/consolidated/enterprise-baseline.js +277 -0
- package/dist/checks/consolidated/enterprise-baseline.js.map +1 -0
- package/dist/checks/consolidated/generate-pageload-config.d.ts +6 -0
- package/dist/checks/consolidated/generate-pageload-config.d.ts.map +1 -0
- package/dist/checks/consolidated/generate-pageload-config.js +161 -0
- package/dist/checks/consolidated/generate-pageload-config.js.map +1 -0
- package/dist/checks/consolidated/hardened-checks.d.ts +276 -0
- package/dist/checks/consolidated/hardened-checks.d.ts.map +1 -0
- package/dist/checks/consolidated/hardened-checks.js +3056 -0
- package/dist/checks/consolidated/hardened-checks.js.map +1 -0
- package/dist/checks/consolidated/homepage-ux.d.ts +12 -0
- package/dist/checks/consolidated/homepage-ux.d.ts.map +1 -0
- package/dist/checks/consolidated/homepage-ux.js +242 -0
- package/dist/checks/consolidated/homepage-ux.js.map +1 -0
- package/dist/checks/consolidated/images.d.ts +76 -0
- package/dist/checks/consolidated/images.d.ts.map +1 -0
- package/dist/checks/consolidated/images.js +311 -0
- package/dist/checks/consolidated/images.js.map +1 -0
- package/dist/checks/consolidated/import-cycles.d.ts +63 -0
- package/dist/checks/consolidated/import-cycles.d.ts.map +1 -0
- package/dist/checks/consolidated/import-cycles.js +291 -0
- package/dist/checks/consolidated/import-cycles.js.map +1 -0
- package/dist/checks/consolidated/imports.d.ts +112 -0
- package/dist/checks/consolidated/imports.d.ts.map +1 -0
- package/dist/checks/consolidated/imports.js +977 -0
- package/dist/checks/consolidated/imports.js.map +1 -0
- package/dist/checks/consolidated/inline-style-conflicts.d.ts +21 -0
- package/dist/checks/consolidated/inline-style-conflicts.d.ts.map +1 -0
- package/dist/checks/consolidated/inline-style-conflicts.js +300 -0
- package/dist/checks/consolidated/inline-style-conflicts.js.map +1 -0
- package/dist/checks/consolidated/lib-organization.d.ts +12 -0
- package/dist/checks/consolidated/lib-organization.d.ts.map +1 -0
- package/dist/checks/consolidated/lib-organization.js +419 -0
- package/dist/checks/consolidated/lib-organization.js.map +1 -0
- package/dist/checks/consolidated/n-plus-one.d.ts +63 -0
- package/dist/checks/consolidated/n-plus-one.d.ts.map +1 -0
- package/dist/checks/consolidated/n-plus-one.js +331 -0
- package/dist/checks/consolidated/n-plus-one.js.map +1 -0
- package/dist/checks/consolidated/nextjs.d.ts +51 -0
- package/dist/checks/consolidated/nextjs.d.ts.map +1 -0
- package/dist/checks/consolidated/nextjs.js +205 -0
- package/dist/checks/consolidated/nextjs.js.map +1 -0
- package/dist/checks/consolidated/organization.d.ts +54 -0
- package/dist/checks/consolidated/organization.d.ts.map +1 -0
- package/dist/checks/consolidated/organization.js +158 -0
- package/dist/checks/consolidated/organization.js.map +1 -0
- package/dist/checks/consolidated/pageload.d.ts +12 -0
- package/dist/checks/consolidated/pageload.d.ts.map +1 -0
- package/dist/checks/consolidated/pageload.js +138 -0
- package/dist/checks/consolidated/pageload.js.map +1 -0
- package/dist/checks/consolidated/performance.d.ts +112 -0
- package/dist/checks/consolidated/performance.d.ts.map +1 -0
- package/dist/checks/consolidated/performance.js +1546 -0
- package/dist/checks/consolidated/performance.js.map +1 -0
- package/dist/checks/consolidated/quality.d.ts +52 -0
- package/dist/checks/consolidated/quality.d.ts.map +1 -0
- package/dist/checks/consolidated/quality.js +253 -0
- package/dist/checks/consolidated/quality.js.map +1 -0
- package/dist/checks/consolidated/react.d.ts +48 -0
- package/dist/checks/consolidated/react.d.ts.map +1 -0
- package/dist/checks/consolidated/react.js +203 -0
- package/dist/checks/consolidated/react.js.map +1 -0
- package/dist/checks/consolidated/regression-hygiene.d.ts +17 -0
- package/dist/checks/consolidated/regression-hygiene.d.ts.map +1 -0
- package/dist/checks/consolidated/regression-hygiene.js +242 -0
- package/dist/checks/consolidated/regression-hygiene.js.map +1 -0
- package/dist/checks/consolidated/regression.d.ts +20 -0
- package/dist/checks/consolidated/regression.d.ts.map +1 -0
- package/dist/checks/consolidated/regression.js +121 -0
- package/dist/checks/consolidated/regression.js.map +1 -0
- package/dist/checks/consolidated/runtime.d.ts +53 -0
- package/dist/checks/consolidated/runtime.d.ts.map +1 -0
- package/dist/checks/consolidated/runtime.js +160 -0
- package/dist/checks/consolidated/runtime.js.map +1 -0
- package/dist/checks/consolidated/script-performance.d.ts +17 -0
- package/dist/checks/consolidated/script-performance.d.ts.map +1 -0
- package/dist/checks/consolidated/script-performance.js +137 -0
- package/dist/checks/consolidated/script-performance.js.map +1 -0
- package/dist/checks/consolidated/security.d.ts +78 -0
- package/dist/checks/consolidated/security.d.ts.map +1 -0
- package/dist/checks/consolidated/security.js +404 -0
- package/dist/checks/consolidated/security.js.map +1 -0
- package/dist/checks/consolidated/seo.d.ts +31 -0
- package/dist/checks/consolidated/seo.d.ts.map +1 -0
- package/dist/checks/consolidated/seo.js +1438 -0
- package/dist/checks/consolidated/seo.js.map +1 -0
- package/dist/checks/consolidated/sx-prop-deprecation.d.ts +22 -0
- package/dist/checks/consolidated/sx-prop-deprecation.d.ts.map +1 -0
- package/dist/checks/consolidated/sx-prop-deprecation.js +280 -0
- package/dist/checks/consolidated/sx-prop-deprecation.js.map +1 -0
- package/dist/checks/consolidated/tailwind-class-validation.d.ts +25 -0
- package/dist/checks/consolidated/tailwind-class-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/tailwind-class-validation.js +533 -0
- package/dist/checks/consolidated/tailwind-class-validation.js.map +1 -0
- package/dist/checks/consolidated/testing.d.ts +54 -0
- package/dist/checks/consolidated/testing.d.ts.map +1 -0
- package/dist/checks/consolidated/testing.js +163 -0
- package/dist/checks/consolidated/testing.js.map +1 -0
- package/dist/checks/consolidated/typescript.d.ts +3 -0
- package/dist/checks/consolidated/typescript.d.ts.map +1 -0
- package/dist/checks/consolidated/typescript.js +31 -0
- package/dist/checks/consolidated/typescript.js.map +1 -0
- package/dist/checks/consolidated/ui-accessibility-advanced.d.ts +104 -0
- package/dist/checks/consolidated/ui-accessibility-advanced.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-accessibility-advanced.js +689 -0
- package/dist/checks/consolidated/ui-accessibility-advanced.js.map +1 -0
- package/dist/checks/consolidated/ui-accessibility.d.ts +121 -0
- package/dist/checks/consolidated/ui-accessibility.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-accessibility.js +776 -0
- package/dist/checks/consolidated/ui-accessibility.js.map +1 -0
- package/dist/checks/consolidated/ui-advanced-spacing.d.ts +142 -0
- package/dist/checks/consolidated/ui-advanced-spacing.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-advanced-spacing.js +1220 -0
- package/dist/checks/consolidated/ui-advanced-spacing.js.map +1 -0
- package/dist/checks/consolidated/ui-animation-duration.d.ts +108 -0
- package/dist/checks/consolidated/ui-animation-duration.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-animation-duration.js +531 -0
- package/dist/checks/consolidated/ui-animation-duration.js.map +1 -0
- package/dist/checks/consolidated/ui-border-radius.d.ts +90 -0
- package/dist/checks/consolidated/ui-border-radius.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-border-radius.js +519 -0
- package/dist/checks/consolidated/ui-border-radius.js.map +1 -0
- package/dist/checks/consolidated/ui-buttons.d.ts +32 -0
- package/dist/checks/consolidated/ui-buttons.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-buttons.js +481 -0
- package/dist/checks/consolidated/ui-buttons.js.map +1 -0
- package/dist/checks/consolidated/ui-cards.d.ts +29 -0
- package/dist/checks/consolidated/ui-cards.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-cards.js +504 -0
- package/dist/checks/consolidated/ui-cards.js.map +1 -0
- package/dist/checks/consolidated/ui-checks.d.ts +48 -0
- package/dist/checks/consolidated/ui-checks.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-checks.js +264 -0
- package/dist/checks/consolidated/ui-checks.js.map +1 -0
- package/dist/checks/consolidated/ui-cleanup.d.ts +81 -0
- package/dist/checks/consolidated/ui-cleanup.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-cleanup.js +650 -0
- package/dist/checks/consolidated/ui-cleanup.js.map +1 -0
- package/dist/checks/consolidated/ui-components.d.ts +255 -0
- package/dist/checks/consolidated/ui-components.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-components.js +2008 -0
- package/dist/checks/consolidated/ui-components.js.map +1 -0
- package/dist/checks/consolidated/ui-consistency-advanced.d.ts +130 -0
- package/dist/checks/consolidated/ui-consistency-advanced.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-consistency-advanced.js +982 -0
- package/dist/checks/consolidated/ui-consistency-advanced.js.map +1 -0
- package/dist/checks/consolidated/ui-consistency-comprehensive.d.ts +30 -0
- package/dist/checks/consolidated/ui-consistency-comprehensive.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-consistency-comprehensive.js +1018 -0
- package/dist/checks/consolidated/ui-consistency-comprehensive.js.map +1 -0
- package/dist/checks/consolidated/ui-consistency-extended.d.ts +26 -0
- package/dist/checks/consolidated/ui-consistency-extended.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-consistency-extended.js +606 -0
- package/dist/checks/consolidated/ui-consistency-extended.js.map +1 -0
- package/dist/checks/consolidated/ui-data-display.d.ts +103 -0
- package/dist/checks/consolidated/ui-data-display.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-data-display.js +740 -0
- package/dist/checks/consolidated/ui-data-display.js.map +1 -0
- package/dist/checks/consolidated/ui-deprecated.d.ts +22 -0
- package/dist/checks/consolidated/ui-deprecated.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-deprecated.js +336 -0
- package/dist/checks/consolidated/ui-deprecated.js.map +1 -0
- package/dist/checks/consolidated/ui-empty-null-states.d.ts +90 -0
- package/dist/checks/consolidated/ui-empty-null-states.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-empty-null-states.js +511 -0
- package/dist/checks/consolidated/ui-empty-null-states.js.map +1 -0
- package/dist/checks/consolidated/ui-error-states.d.ts +99 -0
- package/dist/checks/consolidated/ui-error-states.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-error-states.js +694 -0
- package/dist/checks/consolidated/ui-error-states.js.map +1 -0
- package/dist/checks/consolidated/ui-feedback-confirmations.d.ts +90 -0
- package/dist/checks/consolidated/ui-feedback-confirmations.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-feedback-confirmations.js +596 -0
- package/dist/checks/consolidated/ui-feedback-confirmations.js.map +1 -0
- package/dist/checks/consolidated/ui-forms.d.ts +32 -0
- package/dist/checks/consolidated/ui-forms.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-forms.js +568 -0
- package/dist/checks/consolidated/ui-forms.js.map +1 -0
- package/dist/checks/consolidated/ui-gradient-shadow.d.ts +90 -0
- package/dist/checks/consolidated/ui-gradient-shadow.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-gradient-shadow.js +568 -0
- package/dist/checks/consolidated/ui-gradient-shadow.js.map +1 -0
- package/dist/checks/consolidated/ui-grid-responsive.d.ts +27 -0
- package/dist/checks/consolidated/ui-grid-responsive.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-grid-responsive.js +441 -0
- package/dist/checks/consolidated/ui-grid-responsive.js.map +1 -0
- package/dist/checks/consolidated/ui-icon-size-tokens.d.ts +104 -0
- package/dist/checks/consolidated/ui-icon-size-tokens.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-icon-size-tokens.js +514 -0
- package/dist/checks/consolidated/ui-icon-size-tokens.js.map +1 -0
- package/dist/checks/consolidated/ui-iconography.d.ts +90 -0
- package/dist/checks/consolidated/ui-iconography.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-iconography.js +565 -0
- package/dist/checks/consolidated/ui-iconography.js.map +1 -0
- package/dist/checks/consolidated/ui-interactive-states.d.ts +240 -0
- package/dist/checks/consolidated/ui-interactive-states.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-interactive-states.js +2474 -0
- package/dist/checks/consolidated/ui-interactive-states.js.map +1 -0
- package/dist/checks/consolidated/ui-layout.d.ts +256 -0
- package/dist/checks/consolidated/ui-layout.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-layout.js +1371 -0
- package/dist/checks/consolidated/ui-layout.js.map +1 -0
- package/dist/checks/consolidated/ui-loading-skeletons.d.ts +11 -0
- package/dist/checks/consolidated/ui-loading-skeletons.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-loading-skeletons.js +145 -0
- package/dist/checks/consolidated/ui-loading-skeletons.js.map +1 -0
- package/dist/checks/consolidated/ui-loading-state-skeletons.d.ts +9 -0
- package/dist/checks/consolidated/ui-loading-state-skeletons.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-loading-state-skeletons.js +125 -0
- package/dist/checks/consolidated/ui-loading-state-skeletons.js.map +1 -0
- package/dist/checks/consolidated/ui-media.d.ts +74 -0
- package/dist/checks/consolidated/ui-media.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-media.js +408 -0
- package/dist/checks/consolidated/ui-media.js.map +1 -0
- package/dist/checks/consolidated/ui-micro-interactions.d.ts +107 -0
- package/dist/checks/consolidated/ui-micro-interactions.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-micro-interactions.js +825 -0
- package/dist/checks/consolidated/ui-micro-interactions.js.map +1 -0
- package/dist/checks/consolidated/ui-microcopy-consistency.d.ts +114 -0
- package/dist/checks/consolidated/ui-microcopy-consistency.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-microcopy-consistency.js +566 -0
- package/dist/checks/consolidated/ui-microcopy-consistency.js.map +1 -0
- package/dist/checks/consolidated/ui-mobile-ux.d.ts +251 -0
- package/dist/checks/consolidated/ui-mobile-ux.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-mobile-ux.js +2212 -0
- package/dist/checks/consolidated/ui-mobile-ux.js.map +1 -0
- package/dist/checks/consolidated/ui-motion-accessibility.d.ts +93 -0
- package/dist/checks/consolidated/ui-motion-accessibility.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-motion-accessibility.js +450 -0
- package/dist/checks/consolidated/ui-motion-accessibility.js.map +1 -0
- package/dist/checks/consolidated/ui-navigation.d.ts +85 -0
- package/dist/checks/consolidated/ui-navigation.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-navigation.js +673 -0
- package/dist/checks/consolidated/ui-navigation.js.map +1 -0
- package/dist/checks/consolidated/ui-patterns.d.ts +174 -0
- package/dist/checks/consolidated/ui-patterns.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-patterns.js +1532 -0
- package/dist/checks/consolidated/ui-patterns.js.map +1 -0
- package/dist/checks/consolidated/ui-responsive.d.ts +89 -0
- package/dist/checks/consolidated/ui-responsive.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-responsive.js +588 -0
- package/dist/checks/consolidated/ui-responsive.js.map +1 -0
- package/dist/checks/consolidated/ui-spacing-standards.d.ts +43 -0
- package/dist/checks/consolidated/ui-spacing-standards.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-spacing-standards.js +874 -0
- package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -0
- package/dist/checks/consolidated/ui-spacing.d.ts +751 -0
- package/dist/checks/consolidated/ui-spacing.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-spacing.js +4996 -0
- package/dist/checks/consolidated/ui-spacing.js.map +1 -0
- package/dist/checks/consolidated/ui-standards-auto-fixer.d.ts +70 -0
- package/dist/checks/consolidated/ui-standards-auto-fixer.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-standards-auto-fixer.js +429 -0
- package/dist/checks/consolidated/ui-standards-auto-fixer.js.map +1 -0
- package/dist/checks/consolidated/ui-standards-enforcement.d.ts +100 -0
- package/dist/checks/consolidated/ui-standards-enforcement.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-standards-enforcement.js +935 -0
- package/dist/checks/consolidated/ui-standards-enforcement.js.map +1 -0
- package/dist/checks/consolidated/ui-state-consistency.d.ts +90 -0
- package/dist/checks/consolidated/ui-state-consistency.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-state-consistency.js +659 -0
- package/dist/checks/consolidated/ui-state-consistency.js.map +1 -0
- package/dist/checks/consolidated/ui-style-validation.d.ts +74 -0
- package/dist/checks/consolidated/ui-style-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-style-validation.js +403 -0
- package/dist/checks/consolidated/ui-style-validation.js.map +1 -0
- package/dist/checks/consolidated/ui-tokens.d.ts +110 -0
- package/dist/checks/consolidated/ui-tokens.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-tokens.js +990 -0
- package/dist/checks/consolidated/ui-tokens.js.map +1 -0
- package/dist/checks/consolidated/ui-typography.d.ts +77 -0
- package/dist/checks/consolidated/ui-typography.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-typography.js +416 -0
- package/dist/checks/consolidated/ui-typography.js.map +1 -0
- package/dist/checks/consolidated/ui-visual-hierarchy.d.ts +90 -0
- package/dist/checks/consolidated/ui-visual-hierarchy.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-visual-hierarchy.js +562 -0
- package/dist/checks/consolidated/ui-visual-hierarchy.js.map +1 -0
- package/dist/checks/consolidated/woocommerce.d.ts +50 -0
- package/dist/checks/consolidated/woocommerce.d.ts.map +1 -0
- package/dist/checks/consolidated/woocommerce.js +198 -0
- package/dist/checks/consolidated/woocommerce.js.map +1 -0
- package/dist/checks/core/api-route-protection.d.ts +2 -0
- package/dist/checks/core/api-route-protection.d.ts.map +1 -0
- package/dist/checks/core/api-route-protection.js +101 -0
- package/dist/checks/core/api-route-protection.js.map +1 -0
- package/dist/checks/core/critical.d.ts +8 -0
- package/dist/checks/core/critical.d.ts.map +1 -0
- package/dist/checks/core/critical.js +200 -0
- package/dist/checks/core/critical.js.map +1 -0
- package/dist/checks/core/database.d.ts +8 -0
- package/dist/checks/core/database.d.ts.map +1 -0
- package/dist/checks/core/database.js +699 -0
- package/dist/checks/core/database.js.map +1 -0
- package/dist/checks/core/development.d.ts +8 -0
- package/dist/checks/core/development.d.ts.map +1 -0
- package/dist/checks/core/development.js +417 -0
- package/dist/checks/core/development.js.map +1 -0
- package/dist/checks/core/hydration-mismatch-check.d.ts +38 -0
- package/dist/checks/core/hydration-mismatch-check.d.ts.map +1 -0
- package/dist/checks/core/hydration-mismatch-check.js +411 -0
- package/dist/checks/core/hydration-mismatch-check.js.map +1 -0
- package/dist/checks/core/performance.d.ts +8 -0
- package/dist/checks/core/performance.d.ts.map +1 -0
- package/dist/checks/core/performance.js +474 -0
- package/dist/checks/core/performance.js.map +1 -0
- package/dist/checks/core/security.d.ts +8 -0
- package/dist/checks/core/security.d.ts.map +1 -0
- package/dist/checks/core/security.js +275 -0
- package/dist/checks/core/security.js.map +1 -0
- package/dist/checks/core/standardized-error-handling.d.ts +43 -0
- package/dist/checks/core/standardized-error-handling.d.ts.map +1 -0
- package/dist/checks/core/standardized-error-handling.js +384 -0
- package/dist/checks/core/standardized-error-handling.js.map +1 -0
- package/dist/checks/core/supercatch.d.ts +8 -0
- package/dist/checks/core/supercatch.d.ts.map +1 -0
- package/dist/checks/core/supercatch.js +750 -0
- package/dist/checks/core/supercatch.js.map +1 -0
- package/dist/checks/core/suppression-check.d.ts +2 -0
- package/dist/checks/core/suppression-check.d.ts.map +1 -0
- package/dist/checks/core/suppression-check.js +129 -0
- package/dist/checks/core/suppression-check.js.map +1 -0
- package/dist/checks/core/ui-quality.d.ts +8 -0
- package/dist/checks/core/ui-quality.d.ts.map +1 -0
- package/dist/checks/core/ui-quality.js +1736 -0
- package/dist/checks/core/ui-quality.js.map +1 -0
- package/dist/checks/core/unused-assets-check.d.ts +2 -0
- package/dist/checks/core/unused-assets-check.d.ts.map +1 -0
- package/dist/checks/core/unused-assets-check.js +112 -0
- package/dist/checks/core/unused-assets-check.js.map +1 -0
- package/dist/checks/core/use-status-ssr-safety.d.ts +34 -0
- package/dist/checks/core/use-status-ssr-safety.d.ts.map +1 -0
- package/dist/checks/core/use-status-ssr-safety.js +283 -0
- package/dist/checks/core/use-status-ssr-safety.js.map +1 -0
- package/dist/checks/email/email-flow-validation.d.ts +23 -0
- package/dist/checks/email/email-flow-validation.d.ts.map +1 -0
- package/dist/checks/email/email-flow-validation.js +468 -0
- package/dist/checks/email/email-flow-validation.js.map +1 -0
- package/dist/checks/email/email-template-db-verification.d.ts +20 -0
- package/dist/checks/email/email-template-db-verification.d.ts.map +1 -0
- package/dist/checks/email/email-template-db-verification.js +46 -0
- package/dist/checks/email/email-template-db-verification.js.map +1 -0
- package/dist/checks/email/email-template-validation.d.ts +24 -0
- package/dist/checks/email/email-template-validation.d.ts.map +1 -0
- package/dist/checks/email/email-template-validation.js +688 -0
- package/dist/checks/email/email-template-validation.js.map +1 -0
- package/dist/checks/jsx/comment-placement.d.ts +45 -0
- package/dist/checks/jsx/comment-placement.d.ts.map +1 -0
- package/dist/checks/jsx/comment-placement.js +316 -0
- package/dist/checks/jsx/comment-placement.js.map +1 -0
- package/dist/checks/specialized/admin-layout-check.d.ts +19 -0
- package/dist/checks/specialized/admin-layout-check.d.ts.map +1 -0
- package/dist/checks/specialized/admin-layout-check.js +166 -0
- package/dist/checks/specialized/admin-layout-check.js.map +1 -0
- package/dist/checks/specialized/client-server-separation.d.ts +14 -0
- package/dist/checks/specialized/client-server-separation.d.ts.map +1 -0
- package/dist/checks/specialized/client-server-separation.js +197 -0
- package/dist/checks/specialized/client-server-separation.js.map +1 -0
- package/dist/checks/specialized/cost-optimization.d.ts +18 -0
- package/dist/checks/specialized/cost-optimization.d.ts.map +1 -0
- package/dist/checks/specialized/cost-optimization.js +78 -0
- package/dist/checks/specialized/cost-optimization.js.map +1 -0
- package/dist/checks/specialized/database-migration-sync.d.ts +21 -0
- package/dist/checks/specialized/database-migration-sync.d.ts.map +1 -0
- package/dist/checks/specialized/database-migration-sync.js +150 -0
- package/dist/checks/specialized/database-migration-sync.js.map +1 -0
- package/dist/checks/specialized/database-model-validation.d.ts +15 -0
- package/dist/checks/specialized/database-model-validation.d.ts.map +1 -0
- package/dist/checks/specialized/database-model-validation.js +35 -0
- package/dist/checks/specialized/database-model-validation.js.map +1 -0
- package/dist/checks/specialized/database-schema-migrations-diff.d.ts +27 -0
- package/dist/checks/specialized/database-schema-migrations-diff.d.ts.map +1 -0
- package/dist/checks/specialized/database-schema-migrations-diff.js +177 -0
- package/dist/checks/specialized/database-schema-migrations-diff.js.map +1 -0
- package/dist/checks/specialized/database-schema-sync.d.ts +23 -0
- package/dist/checks/specialized/database-schema-sync.d.ts.map +1 -0
- package/dist/checks/specialized/database-schema-sync.js +77 -0
- package/dist/checks/specialized/database-schema-sync.js.map +1 -0
- package/dist/checks/specialized/decimal-serialization.d.ts +24 -0
- package/dist/checks/specialized/decimal-serialization.d.ts.map +1 -0
- package/dist/checks/specialized/decimal-serialization.js +400 -0
- package/dist/checks/specialized/decimal-serialization.js.map +1 -0
- package/dist/checks/specialized/detect-router-issues.d.ts +14 -0
- package/dist/checks/specialized/detect-router-issues.d.ts.map +1 -0
- package/dist/checks/specialized/detect-router-issues.js +96 -0
- package/dist/checks/specialized/detect-router-issues.js.map +1 -0
- package/dist/checks/specialized/enum-validation.d.ts +15 -0
- package/dist/checks/specialized/enum-validation.d.ts.map +1 -0
- package/dist/checks/specialized/enum-validation.js +35 -0
- package/dist/checks/specialized/enum-validation.js.map +1 -0
- package/dist/checks/specialized/hash-collision.d.ts +18 -0
- package/dist/checks/specialized/hash-collision.d.ts.map +1 -0
- package/dist/checks/specialized/hash-collision.js +78 -0
- package/dist/checks/specialized/hash-collision.js.map +1 -0
- package/dist/checks/specialized/id-generation-enforcement.d.ts +16 -0
- package/dist/checks/specialized/id-generation-enforcement.d.ts.map +1 -0
- package/dist/checks/specialized/id-generation-enforcement.js +307 -0
- package/dist/checks/specialized/id-generation-enforcement.js.map +1 -0
- package/dist/checks/specialized/image-data-integrity.d.ts +15 -0
- package/dist/checks/specialized/image-data-integrity.d.ts.map +1 -0
- package/dist/checks/specialized/image-data-integrity.js +79 -0
- package/dist/checks/specialized/image-data-integrity.js.map +1 -0
- package/dist/checks/specialized/image-health.d.ts +14 -0
- package/dist/checks/specialized/image-health.d.ts.map +1 -0
- package/dist/checks/specialized/image-health.js +122 -0
- package/dist/checks/specialized/image-health.js.map +1 -0
- package/dist/checks/specialized/image-metadata-validation.d.ts +14 -0
- package/dist/checks/specialized/image-metadata-validation.d.ts.map +1 -0
- package/dist/checks/specialized/image-metadata-validation.js +95 -0
- package/dist/checks/specialized/image-metadata-validation.js.map +1 -0
- package/dist/checks/specialized/image-optimization.d.ts +16 -0
- package/dist/checks/specialized/image-optimization.d.ts.map +1 -0
- package/dist/checks/specialized/image-optimization.js +86 -0
- package/dist/checks/specialized/image-optimization.js.map +1 -0
- package/dist/checks/specialized/invalid-module-imports.d.ts +24 -0
- package/dist/checks/specialized/invalid-module-imports.d.ts.map +1 -0
- package/dist/checks/specialized/invalid-module-imports.js +209 -0
- package/dist/checks/specialized/invalid-module-imports.js.map +1 -0
- package/dist/checks/specialized/lint-validation.d.ts +26 -0
- package/dist/checks/specialized/lint-validation.d.ts.map +1 -0
- package/dist/checks/specialized/lint-validation.js +193 -0
- package/dist/checks/specialized/lint-validation.js.map +1 -0
- package/dist/checks/specialized/listing-workflow.d.ts +19 -0
- package/dist/checks/specialized/listing-workflow.d.ts.map +1 -0
- package/dist/checks/specialized/listing-workflow.js +89 -0
- package/dist/checks/specialized/listing-workflow.js.map +1 -0
- package/dist/checks/specialized/mui-imports-validation.d.ts +18 -0
- package/dist/checks/specialized/mui-imports-validation.d.ts.map +1 -0
- package/dist/checks/specialized/mui-imports-validation.js +134 -0
- package/dist/checks/specialized/mui-imports-validation.js.map +1 -0
- package/dist/checks/specialized/nextauth-v5-compliance.d.ts +16 -0
- package/dist/checks/specialized/nextauth-v5-compliance.d.ts.map +1 -0
- package/dist/checks/specialized/nextauth-v5-compliance.js +164 -0
- package/dist/checks/specialized/nextauth-v5-compliance.js.map +1 -0
- package/dist/checks/specialized/nextjs-params-check.d.ts +14 -0
- package/dist/checks/specialized/nextjs-params-check.d.ts.map +1 -0
- package/dist/checks/specialized/nextjs-params-check.js +140 -0
- package/dist/checks/specialized/nextjs-params-check.js.map +1 -0
- package/dist/checks/specialized/no-legacy-catalog-aliases-validation.d.ts +16 -0
- package/dist/checks/specialized/no-legacy-catalog-aliases-validation.d.ts.map +1 -0
- package/dist/checks/specialized/no-legacy-catalog-aliases-validation.js +36 -0
- package/dist/checks/specialized/no-legacy-catalog-aliases-validation.js.map +1 -0
- package/dist/checks/specialized/no-wata-cardgraded-validation.d.ts +22 -0
- package/dist/checks/specialized/no-wata-cardgraded-validation.d.ts.map +1 -0
- package/dist/checks/specialized/no-wata-cardgraded-validation.js +97 -0
- package/dist/checks/specialized/no-wata-cardgraded-validation.js.map +1 -0
- package/dist/checks/specialized/parameter-consistency-check.d.ts +20 -0
- package/dist/checks/specialized/parameter-consistency-check.d.ts.map +1 -0
- package/dist/checks/specialized/parameter-consistency-check.js +115 -0
- package/dist/checks/specialized/parameter-consistency-check.js.map +1 -0
- package/dist/checks/specialized/prisma-field-names-validation.d.ts +15 -0
- package/dist/checks/specialized/prisma-field-names-validation.d.ts.map +1 -0
- package/dist/checks/specialized/prisma-field-names-validation.js +35 -0
- package/dist/checks/specialized/prisma-field-names-validation.js.map +1 -0
- package/dist/checks/specialized/prisma-null-syntax.d.ts +34 -0
- package/dist/checks/specialized/prisma-null-syntax.d.ts.map +1 -0
- package/dist/checks/specialized/prisma-null-syntax.js +330 -0
- package/dist/checks/specialized/prisma-null-syntax.js.map +1 -0
- package/dist/checks/specialized/prisma-query-validation.d.ts +15 -0
- package/dist/checks/specialized/prisma-query-validation.d.ts.map +1 -0
- package/dist/checks/specialized/prisma-query-validation.js +35 -0
- package/dist/checks/specialized/prisma-query-validation.js.map +1 -0
- package/dist/checks/specialized/product-type-validation.d.ts +17 -0
- package/dist/checks/specialized/product-type-validation.d.ts.map +1 -0
- package/dist/checks/specialized/product-type-validation.js +129 -0
- package/dist/checks/specialized/product-type-validation.js.map +1 -0
- package/dist/checks/specialized/responsive-image-validation.d.ts +14 -0
- package/dist/checks/specialized/responsive-image-validation.d.ts.map +1 -0
- package/dist/checks/specialized/responsive-image-validation.js +101 -0
- package/dist/checks/specialized/responsive-image-validation.js.map +1 -0
- package/dist/checks/specialized/root-cleanliness.d.ts +21 -0
- package/dist/checks/specialized/root-cleanliness.d.ts.map +1 -0
- package/dist/checks/specialized/root-cleanliness.js +251 -0
- package/dist/checks/specialized/root-cleanliness.js.map +1 -0
- package/dist/checks/specialized/rotation-detection-validation.d.ts +16 -0
- package/dist/checks/specialized/rotation-detection-validation.d.ts.map +1 -0
- package/dist/checks/specialized/rotation-detection-validation.js +113 -0
- package/dist/checks/specialized/rotation-detection-validation.js.map +1 -0
- package/dist/checks/specialized/script-organization.d.ts +17 -0
- package/dist/checks/specialized/script-organization.d.ts.map +1 -0
- package/dist/checks/specialized/script-organization.js +487 -0
- package/dist/checks/specialized/script-organization.js.map +1 -0
- package/dist/checks/specialized/shared-components-migration.d.ts +137 -0
- package/dist/checks/specialized/shared-components-migration.d.ts.map +1 -0
- package/dist/checks/specialized/shared-components-migration.js +1288 -0
- package/dist/checks/specialized/shared-components-migration.js.map +1 -0
- package/dist/checks/specialized/store-specialties-normalization.d.ts +10 -0
- package/dist/checks/specialized/store-specialties-normalization.d.ts.map +1 -0
- package/dist/checks/specialized/store-specialties-normalization.js +126 -0
- package/dist/checks/specialized/store-specialties-normalization.js.map +1 -0
- package/dist/checks/specialized/two-stage-trim-validation.d.ts +16 -0
- package/dist/checks/specialized/two-stage-trim-validation.d.ts.map +1 -0
- package/dist/checks/specialized/two-stage-trim-validation.js +115 -0
- package/dist/checks/specialized/two-stage-trim-validation.js.map +1 -0
- package/dist/checks/specialized/underscore-variable-audit.d.ts +26 -0
- package/dist/checks/specialized/underscore-variable-audit.d.ts.map +1 -0
- package/dist/checks/specialized/underscore-variable-audit.js +219 -0
- package/dist/checks/specialized/underscore-variable-audit.js.map +1 -0
- package/dist/checks/specialized/unified-badge-consistency.d.ts +16 -0
- package/dist/checks/specialized/unified-badge-consistency.d.ts.map +1 -0
- package/dist/checks/specialized/unified-badge-consistency.js +284 -0
- package/dist/checks/specialized/unified-badge-consistency.js.map +1 -0
- package/dist/checks/specialized/validate-integration-enums.d.ts +15 -0
- package/dist/checks/specialized/validate-integration-enums.d.ts.map +1 -0
- package/dist/checks/specialized/validate-integration-enums.js +131 -0
- package/dist/checks/specialized/validate-integration-enums.js.map +1 -0
- package/dist/checks/testing/action-regression.d.ts +23 -0
- package/dist/checks/testing/action-regression.d.ts.map +1 -0
- package/dist/checks/testing/action-regression.js +192 -0
- package/dist/checks/testing/action-regression.js.map +1 -0
- package/dist/checks/testing/critical-api-coverage.d.ts +21 -0
- package/dist/checks/testing/critical-api-coverage.d.ts.map +1 -0
- package/dist/checks/testing/critical-api-coverage.js +158 -0
- package/dist/checks/testing/critical-api-coverage.js.map +1 -0
- package/dist/checks/testing/data-entry-regression-required.d.ts +24 -0
- package/dist/checks/testing/data-entry-regression-required.d.ts.map +1 -0
- package/dist/checks/testing/data-entry-regression-required.js +378 -0
- package/dist/checks/testing/data-entry-regression-required.js.map +1 -0
- package/dist/checks/testing/e2e-best-practices.d.ts +24 -0
- package/dist/checks/testing/e2e-best-practices.d.ts.map +1 -0
- package/dist/checks/testing/e2e-best-practices.js +791 -0
- package/dist/checks/testing/e2e-best-practices.js.map +1 -0
- package/dist/checks/testing/e2e-flake-patterns.d.ts +26 -0
- package/dist/checks/testing/e2e-flake-patterns.d.ts.map +1 -0
- package/dist/checks/testing/e2e-flake-patterns.js +305 -0
- package/dist/checks/testing/e2e-flake-patterns.js.map +1 -0
- package/dist/checks/testing/e2e-redundant-visibility-checks.d.ts +25 -0
- package/dist/checks/testing/e2e-redundant-visibility-checks.d.ts.map +1 -0
- package/dist/checks/testing/e2e-redundant-visibility-checks.js +613 -0
- package/dist/checks/testing/e2e-redundant-visibility-checks.js.map +1 -0
- package/dist/checks/testing/e2e-slow-tests.d.ts +9 -0
- package/dist/checks/testing/e2e-slow-tests.d.ts.map +1 -0
- package/dist/checks/testing/e2e-slow-tests.js +142 -0
- package/dist/checks/testing/e2e-slow-tests.js.map +1 -0
- package/dist/checks/testing/e2e-timeouts.d.ts +9 -0
- package/dist/checks/testing/e2e-timeouts.d.ts.map +1 -0
- package/dist/checks/testing/e2e-timeouts.js +82 -0
- package/dist/checks/testing/e2e-timeouts.js.map +1 -0
- package/dist/checks/testing/integration-e2e-depth.d.ts +20 -0
- package/dist/checks/testing/integration-e2e-depth.d.ts.map +1 -0
- package/dist/checks/testing/integration-e2e-depth.js +575 -0
- package/dist/checks/testing/integration-e2e-depth.js.map +1 -0
- package/dist/checks/testing/playwright-feature-coverage-gaps.d.ts +31 -0
- package/dist/checks/testing/playwright-feature-coverage-gaps.d.ts.map +1 -0
- package/dist/checks/testing/playwright-feature-coverage-gaps.js +1582 -0
- package/dist/checks/testing/playwright-feature-coverage-gaps.js.map +1 -0
- package/dist/checks/testing/playwright-mock-inventory.d.ts +24 -0
- package/dist/checks/testing/playwright-mock-inventory.d.ts.map +1 -0
- package/dist/checks/testing/playwright-mock-inventory.js +380 -0
- package/dist/checks/testing/playwright-mock-inventory.js.map +1 -0
- package/dist/checks/testing/test-coverage-threshold.d.ts +25 -0
- package/dist/checks/testing/test-coverage-threshold.d.ts.map +1 -0
- package/dist/checks/testing/test-coverage-threshold.js +166 -0
- package/dist/checks/testing/test-coverage-threshold.js.map +1 -0
- package/dist/checks/testing/test-flakiness-score.d.ts +27 -0
- package/dist/checks/testing/test-flakiness-score.d.ts.map +1 -0
- package/dist/checks/testing/test-flakiness-score.js +358 -0
- package/dist/checks/testing/test-flakiness-score.js.map +1 -0
- package/dist/checks/testing/test-patterns.d.ts +16 -0
- package/dist/checks/testing/test-patterns.d.ts.map +1 -0
- package/dist/checks/testing/test-patterns.js +156 -0
- package/dist/checks/testing/test-patterns.js.map +1 -0
- package/dist/checks/workflows/a-plus-rating-validation.d.ts +42 -0
- package/dist/checks/workflows/a-plus-rating-validation.d.ts.map +1 -0
- package/dist/checks/workflows/a-plus-rating-validation.js +527 -0
- package/dist/checks/workflows/a-plus-rating-validation.js.map +1 -0
- package/dist/checks/workflows/affected.d.ts +14 -0
- package/dist/checks/workflows/affected.d.ts.map +1 -0
- package/dist/checks/workflows/affected.js +126 -0
- package/dist/checks/workflows/affected.js.map +1 -0
- package/dist/checks/workflows/ai.d.ts +6 -0
- package/dist/checks/workflows/ai.d.ts.map +1 -0
- package/dist/checks/workflows/ai.js +42 -0
- package/dist/checks/workflows/ai.js.map +1 -0
- package/dist/checks/workflows/all.d.ts +31 -0
- package/dist/checks/workflows/all.d.ts.map +1 -0
- package/dist/checks/workflows/all.js +2688 -0
- package/dist/checks/workflows/all.js.map +1 -0
- package/dist/checks/workflows/commit.d.ts +19 -0
- package/dist/checks/workflows/commit.d.ts.map +1 -0
- package/dist/checks/workflows/commit.js +207 -0
- package/dist/checks/workflows/commit.js.map +1 -0
- package/dist/checks/workflows/critical.d.ts +9 -0
- package/dist/checks/workflows/critical.d.ts.map +1 -0
- package/dist/checks/workflows/critical.js +213 -0
- package/dist/checks/workflows/critical.js.map +1 -0
- package/dist/checks/workflows/database-id-validation.d.ts +9 -0
- package/dist/checks/workflows/database-id-validation.d.ts.map +1 -0
- package/dist/checks/workflows/database-id-validation.js +13 -0
- package/dist/checks/workflows/database-id-validation.js.map +1 -0
- package/dist/checks/workflows/deploy.d.ts +20 -0
- package/dist/checks/workflows/deploy.d.ts.map +1 -0
- package/dist/checks/workflows/deploy.js +107 -0
- package/dist/checks/workflows/deploy.js.map +1 -0
- package/dist/checks/workflows/deployment-readiness.d.ts +12 -0
- package/dist/checks/workflows/deployment-readiness.d.ts.map +1 -0
- package/dist/checks/workflows/deployment-readiness.js +403 -0
- package/dist/checks/workflows/deployment-readiness.js.map +1 -0
- package/dist/checks/workflows/dev.d.ts +19 -0
- package/dist/checks/workflows/dev.d.ts.map +1 -0
- package/dist/checks/workflows/dev.js +88 -0
- package/dist/checks/workflows/dev.js.map +1 -0
- package/dist/checks/workflows/development.d.ts +9 -0
- package/dist/checks/workflows/development.d.ts.map +1 -0
- package/dist/checks/workflows/development.js +65 -0
- package/dist/checks/workflows/development.js.map +1 -0
- package/dist/checks/workflows/enterprise.d.ts +10 -0
- package/dist/checks/workflows/enterprise.d.ts.map +1 -0
- package/dist/checks/workflows/enterprise.js +359 -0
- package/dist/checks/workflows/enterprise.js.map +1 -0
- package/dist/checks/workflows/images.d.ts +6 -0
- package/dist/checks/workflows/images.d.ts.map +1 -0
- package/dist/checks/workflows/images.js +58 -0
- package/dist/checks/workflows/images.js.map +1 -0
- package/dist/checks/workflows/naming.d.ts +19 -0
- package/dist/checks/workflows/naming.d.ts.map +1 -0
- package/dist/checks/workflows/naming.js +42 -0
- package/dist/checks/workflows/naming.js.map +1 -0
- package/dist/checks/workflows/performance.d.ts +8 -0
- package/dist/checks/workflows/performance.d.ts.map +1 -0
- package/dist/checks/workflows/performance.js +77 -0
- package/dist/checks/workflows/performance.js.map +1 -0
- package/dist/checks/workflows/pre-deploy.d.ts +6 -0
- package/dist/checks/workflows/pre-deploy.d.ts.map +1 -0
- package/dist/checks/workflows/pre-deploy.js +41 -0
- package/dist/checks/workflows/pre-deploy.js.map +1 -0
- package/dist/checks/workflows/security.d.ts +8 -0
- package/dist/checks/workflows/security.d.ts.map +1 -0
- package/dist/checks/workflows/security.js +71 -0
- package/dist/checks/workflows/security.js.map +1 -0
- package/dist/checks/workflows/supercatch.d.ts +8 -0
- package/dist/checks/workflows/supercatch.d.ts.map +1 -0
- package/dist/checks/workflows/supercatch.js +127 -0
- package/dist/checks/workflows/supercatch.js.map +1 -0
- package/dist/checks/workflows/ui-quality.d.ts +9 -0
- package/dist/checks/workflows/ui-quality.d.ts.map +1 -0
- package/dist/checks/workflows/ui-quality.js +264 -0
- package/dist/checks/workflows/ui-quality.js.map +1 -0
- package/dist/checks/workflows/ui-uniformity.d.ts +18 -0
- package/dist/checks/workflows/ui-uniformity.d.ts.map +1 -0
- package/dist/checks/workflows/ui-uniformity.js +265 -0
- package/dist/checks/workflows/ui-uniformity.js.map +1 -0
- package/dist/checks/workflows/vercel.d.ts +16 -0
- package/dist/checks/workflows/vercel.d.ts.map +1 -0
- package/dist/checks/workflows/vercel.js +173 -0
- package/dist/checks/workflows/vercel.js.map +1 -0
- package/dist/utils/validation-helpers.d.ts +43 -0
- package/dist/utils/validation-helpers.d.ts.map +1 -0
- package/dist/utils/validation-helpers.js +370 -0
- package/dist/utils/validation-helpers.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,874 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* UI Spacing Standards Preflight - IRON-CLAD ENFORCEMENT
|
|
5
|
+
*
|
|
6
|
+
* This module enforces strict spacing standards across the entire application.
|
|
7
|
+
* All checks are BLOCKING - violations prevent deployment.
|
|
8
|
+
*
|
|
9
|
+
* SPACING STANDARDS (Design System):
|
|
10
|
+
* ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
11
|
+
*
|
|
12
|
+
* 1. CARD CONTAINER GAP: gap-4 (16px) ALWAYS
|
|
13
|
+
* - Containers holding multiple Cards MUST use gap-4
|
|
14
|
+
* - Stack with Cards MUST use spacing={4}
|
|
15
|
+
* - NEVER mix gap with margin on children
|
|
16
|
+
*
|
|
17
|
+
* 2. BREADCRUMB TO CONTENT: spacing-3 (12px)
|
|
18
|
+
* - Content area paddingTop: var(--spacing-3)
|
|
19
|
+
* - Breadcrumbs have their own padding (spacing-2 top/bottom)
|
|
20
|
+
*
|
|
21
|
+
* 3. PAGE HEADER TO CONTENT: spacing-3 (12px)
|
|
22
|
+
* - UnifiedHeader variant="page" has marginBottom: var(--spacing-3)
|
|
23
|
+
* - Content after header should NOT add marginTop
|
|
24
|
+
*
|
|
25
|
+
* 4. SECTION TO SECTION: spacing-6 to spacing-8 (24-32px)
|
|
26
|
+
* - Major page sections need mt-6 to mt-8
|
|
27
|
+
* - Consistent within same page
|
|
28
|
+
*
|
|
29
|
+
* 5. CARD INTERNAL PADDING: p-6 (24px) standard
|
|
30
|
+
* - CardContent should use p-6 for forms/content
|
|
31
|
+
* - p-4 acceptable for compact cards
|
|
32
|
+
*
|
|
33
|
+
* 6. ASYMMETRIC POSITIONING: top/right/bottom/left must use same spacing
|
|
34
|
+
* - Absolute/fixed positioned elements must have symmetric corner spacing
|
|
35
|
+
* - e.g., top: spacing-3 + right: spacing-3 (not top: spacing-2 + right: spacing-3)
|
|
36
|
+
*
|
|
37
|
+
* Usage:
|
|
38
|
+
* pnpm preflight:ui-spacing-standards # All checks
|
|
39
|
+
* pnpm preflight:ui-spacing-standards cards # Card gap only
|
|
40
|
+
* pnpm preflight:ui-spacing-standards layout # Layout spacing only
|
|
41
|
+
* pnpm preflight:ui-spacing-standards positioning # Asymmetric positioning only
|
|
42
|
+
*/
|
|
43
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
44
|
+
if (k2 === undefined) k2 = k;
|
|
45
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
46
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
47
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
48
|
+
}
|
|
49
|
+
Object.defineProperty(o, k2, desc);
|
|
50
|
+
}) : (function(o, m, k, k2) {
|
|
51
|
+
if (k2 === undefined) k2 = k;
|
|
52
|
+
o[k2] = m[k];
|
|
53
|
+
}));
|
|
54
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
55
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
56
|
+
}) : function(o, v) {
|
|
57
|
+
o["default"] = v;
|
|
58
|
+
});
|
|
59
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
60
|
+
var ownKeys = function(o) {
|
|
61
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
62
|
+
var ar = [];
|
|
63
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
64
|
+
return ar;
|
|
65
|
+
};
|
|
66
|
+
return ownKeys(o);
|
|
67
|
+
};
|
|
68
|
+
return function (mod) {
|
|
69
|
+
if (mod && mod.__esModule) return mod;
|
|
70
|
+
var result = {};
|
|
71
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
72
|
+
__setModuleDefault(result, mod);
|
|
73
|
+
return result;
|
|
74
|
+
};
|
|
75
|
+
})();
|
|
76
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
77
|
+
const fs = __importStar(require("fs"));
|
|
78
|
+
const path = __importStar(require("path"));
|
|
79
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
80
|
+
const file_cache_1 = require("../../shared/file-cache");
|
|
81
|
+
const glob_patterns_1 = require("../../shared/glob-patterns");
|
|
82
|
+
const layout_constants_1 = require("../../shared/layout-constants");
|
|
83
|
+
const universal_progress_reporter_1 = require("../system/universal-progress-reporter");
|
|
84
|
+
// Cached file getters
|
|
85
|
+
let _cachedClientFiles = null;
|
|
86
|
+
async function getClientFiles() {
|
|
87
|
+
if (!_cachedClientFiles) {
|
|
88
|
+
_cachedClientFiles = await file_cache_1.fileCache.getClientFiles();
|
|
89
|
+
}
|
|
90
|
+
return _cachedClientFiles;
|
|
91
|
+
}
|
|
92
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
93
|
+
// SPACING CONSTANTS - Single Source of Truth
|
|
94
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
95
|
+
const SPACING = {
|
|
96
|
+
// Card containers - use shared constants from layout-constants.ts
|
|
97
|
+
CARD_CONTAINER_GAP: layout_constants_1.LAYOUT_GAP_SPACING, // gap-3 = 12px (matches UnifiedHeader marginBottom)
|
|
98
|
+
CARD_CONTAINER_GAP_LARGE: layout_constants_1.CARD_GRID_GAP_SPACING, // gap-6 = 24px (for grid layouts with cards)
|
|
99
|
+
CARD_CONTAINER_GAP_DENSE: layout_constants_1.LAYOUT_GAP_SPACING, // gap-3 = 12px (kept for compatibility)
|
|
100
|
+
// Admin pages use same standard
|
|
101
|
+
ADMIN_CARD_CONTAINER_GAP: layout_constants_1.LAYOUT_GAP_SPACING, // gap-3 / spacing={3} = 12px
|
|
102
|
+
// Layout spacing
|
|
103
|
+
BREADCRUMB_TO_CONTENT: 1, // spacing-1 = 4px (breadcrumb internal spacing)
|
|
104
|
+
DASHBOARD_LAYOUT_PADDING_TOP: layout_constants_1.LAYOUT_PADDING_TOP_SPACING, // spacing-3 = 12px (must match gap for visual consistency)
|
|
105
|
+
PAGE_HEADER_MARGIN_TOP: 0, // 0px - layout provides top spacing
|
|
106
|
+
PAGE_HEADER_MARGIN_BOTTOM: 3, // spacing-3 = 12px
|
|
107
|
+
// Section spacing - use gap-3 for consistency, gap-6 for major sections
|
|
108
|
+
SECTION_GAP_MIN: layout_constants_1.LAYOUT_GAP_SPACING, // spacing-3 = 12px (standard)
|
|
109
|
+
SECTION_GAP_MAX: layout_constants_1.CARD_GRID_GAP_SPACING, // spacing-6 = 24px (major sections only)
|
|
110
|
+
// Card internal
|
|
111
|
+
CARD_CONTENT_PADDING: 6, // p-6 = 24px
|
|
112
|
+
CARD_CONTENT_PADDING_COMPACT: 4, // p-4 = 16px
|
|
113
|
+
// PROHIBITED VALUES - gap-4 creates inconsistent spacing
|
|
114
|
+
PROHIBITED_GAPS: [4], // gap-4 (16px) is NOT allowed
|
|
115
|
+
};
|
|
116
|
+
const EXCLUDED = [...glob_patterns_1.STANDARD_EXCLUDES];
|
|
117
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
118
|
+
// CHECK: Card Container Gap Consistency
|
|
119
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
120
|
+
/**
|
|
121
|
+
* Check if a Card with margin is actually inside a gap container
|
|
122
|
+
* by tracking JSX nesting depth
|
|
123
|
+
*/
|
|
124
|
+
function isCardDirectChildOfGapContainer(lines, gapLineIndex, cardLineIndex) {
|
|
125
|
+
// The Card must be within the same JSX block as the gap container
|
|
126
|
+
// Track opening/closing tags to determine nesting
|
|
127
|
+
let depth = 0;
|
|
128
|
+
for (let i = gapLineIndex; i <= cardLineIndex; i++) {
|
|
129
|
+
const line = lines[i];
|
|
130
|
+
// Skip the gap line itself
|
|
131
|
+
if (i === gapLineIndex) {
|
|
132
|
+
// Count opening tag on gap line
|
|
133
|
+
if (/<[A-Z][a-zA-Z]*[^/>]*>/.test(line) && !/<[A-Z][a-zA-Z]*[^>]*\/>/.test(line)) {
|
|
134
|
+
depth = 1;
|
|
135
|
+
}
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// Count closing tags (reduce depth)
|
|
139
|
+
const closingTags = (line.match(/<\/[A-Z][a-zA-Z]*>/g) || []).length;
|
|
140
|
+
// Count self-closing tags (no change)
|
|
141
|
+
const selfClosing = (line.match(/<[A-Z][a-zA-Z]*[^>]*\/>/g) || []).length;
|
|
142
|
+
// Count opening tags (increase depth)
|
|
143
|
+
const openingTags = (line.match(/<[A-Z][a-zA-Z]*[^/>]*>/g) || []).length;
|
|
144
|
+
depth += openingTags - closingTags;
|
|
145
|
+
// If we've closed the gap container before reaching the Card, it's not a direct child
|
|
146
|
+
if (depth <= 0 && i < cardLineIndex) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
// Check for ternary expressions or conditional renders that would break direct child relationship
|
|
150
|
+
if (/\?\s*$/.test(line) || /\?\s*</.test(line) || /:\s*</.test(line)) {
|
|
151
|
+
// Card after a ternary is in a different branch
|
|
152
|
+
if (i < cardLineIndex) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Card is at depth 1 (direct child) or depth 2 (inside a wrapper like Box)
|
|
158
|
+
return depth >= 1 && depth <= 3;
|
|
159
|
+
}
|
|
160
|
+
function hasDirectCardChildInStack(lines, stackLineIndex) {
|
|
161
|
+
// Conservative nesting heuristic: find <Card> that appears before this <Stack> closes
|
|
162
|
+
// and is roughly at depth 1 (direct-ish child), similar to gap container logic.
|
|
163
|
+
let depth = 0;
|
|
164
|
+
for (let i = stackLineIndex; i < Math.min(stackLineIndex + 200, lines.length); i++) {
|
|
165
|
+
const line = lines[i];
|
|
166
|
+
// Initialize depth when we encounter the opening Stack tag line
|
|
167
|
+
if (i === stackLineIndex) {
|
|
168
|
+
if (/<Stack\b/.test(line) && !/<Stack\b[^>]*\/\s*>/.test(line)) {
|
|
169
|
+
depth = 1;
|
|
170
|
+
}
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// Detect direct Card child (depth 1) before closing the Stack
|
|
174
|
+
if (/<Card\b/.test(line) && depth === 1) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
// Count opening/closing tags to track depth
|
|
178
|
+
const closingTags = (line.match(/<\/[A-Za-z][a-zA-Z]*>/g) || []).length;
|
|
179
|
+
const openingTags = (line.match(/<[A-Za-z][a-zA-Z]*[^/>]*>/g) || []).length;
|
|
180
|
+
depth += openingTags - closingTags;
|
|
181
|
+
// Stop when Stack closes
|
|
182
|
+
if (depth <= 0) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
// Bail on obvious branch breaks
|
|
186
|
+
if (/^\s*return\s/.test(line) || /^\s*if\s*\(/.test(line)) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
// CACHED FILE LISTS - Scan once, use everywhere
|
|
193
|
+
let _cachedAppTsxFiles = null;
|
|
194
|
+
async function getAppTsxFiles() {
|
|
195
|
+
if (!_cachedAppTsxFiles) {
|
|
196
|
+
_cachedAppTsxFiles = await file_cache_1.fileCache.getAppTSX();
|
|
197
|
+
}
|
|
198
|
+
return _cachedAppTsxFiles;
|
|
199
|
+
}
|
|
200
|
+
let _cachedAppComponentsTsxFiles = null;
|
|
201
|
+
async function getAppComponentsTsxFiles() {
|
|
202
|
+
if (!_cachedAppComponentsTsxFiles) {
|
|
203
|
+
_cachedAppComponentsTsxFiles = await file_cache_1.fileCache.getAppAndComponentsTSX();
|
|
204
|
+
}
|
|
205
|
+
return _cachedAppComponentsTsxFiles;
|
|
206
|
+
}
|
|
207
|
+
async function checkCardContainerGap() {
|
|
208
|
+
const startTime = Date.now();
|
|
209
|
+
const issues = [];
|
|
210
|
+
const files = await getAppComponentsTsxFiles();
|
|
211
|
+
for (const file of files) {
|
|
212
|
+
// Skip excluded files (UI definitions, tests, auth pages)
|
|
213
|
+
if ((0, layout_constants_1.isExcludedFromGapEnforcement)(file))
|
|
214
|
+
continue;
|
|
215
|
+
const content = fs.readFileSync(file, "utf8");
|
|
216
|
+
if (!content.includes("<Card"))
|
|
217
|
+
continue;
|
|
218
|
+
const lines = content.split("\n");
|
|
219
|
+
const isInDashboard = (0, layout_constants_1.isDashboardPage)(file);
|
|
220
|
+
for (let i = 0; i < lines.length; i++) {
|
|
221
|
+
const line = lines[i];
|
|
222
|
+
const expectedCardGap = SPACING.CARD_CONTAINER_GAP;
|
|
223
|
+
// Check for gap values on containers with Cards
|
|
224
|
+
const gapMatch = line.match(/gap-(\d+)/) || line.match(/gap:\s*["']?var\(--spacing-(\d+)\)["']?/);
|
|
225
|
+
if (gapMatch) {
|
|
226
|
+
const gapValue = parseInt(gapMatch[1]);
|
|
227
|
+
const contextLines = lines.slice(i, Math.min(i + 30, lines.length)).join("\n");
|
|
228
|
+
const prevLines = lines.slice(Math.max(0, i - 3), i).join("\n");
|
|
229
|
+
// Skip button containers (gap-2 is appropriate for button groups)
|
|
230
|
+
const isButtonContainer = /action|button/i.test(contextLines.split("\n").slice(0, 5).join("\n")) ||
|
|
231
|
+
/<Button/.test(contextLines.split("\n").slice(0, 10).join("\n"));
|
|
232
|
+
if (isButtonContainer && gapValue <= 3)
|
|
233
|
+
continue;
|
|
234
|
+
// Skip icon+text rows (gap-2 is appropriate for inline icon alignment)
|
|
235
|
+
// These are typically in headers, list items, or flex rows with icons
|
|
236
|
+
const isIconTextRow = /<[A-Z][a-zA-Z]*Icon|Icon\s*\/>|className="w-\d+\s+h-\d+"|lucide-react/.test(contextLines.split("\n").slice(0, 5).join("\n")) ||
|
|
237
|
+
(/display:\s*["']?flex["']?/.test(line) && /alignItems:\s*["']?center["']?/.test(line)) ||
|
|
238
|
+
/flex.*items-center/.test(line) ||
|
|
239
|
+
/<h[1-6]/.test(prevLines) ||
|
|
240
|
+
/<h[1-6]/.test(line) ||
|
|
241
|
+
/<li/.test(prevLines) ||
|
|
242
|
+
/<li/.test(line) ||
|
|
243
|
+
/display:\s*["']?flex["']?.*alignItems/.test(lines.slice(i, i + 3).join(""));
|
|
244
|
+
if (isIconTextRow && gapValue <= 3)
|
|
245
|
+
continue;
|
|
246
|
+
// Skip list containers inside cards (gap-2 is appropriate for list items)
|
|
247
|
+
const isListContainer = /<ul|<ol|listStyle|list-none/.test(prevLines) ||
|
|
248
|
+
/<ul|<ol|listStyle|list-none/.test(line) ||
|
|
249
|
+
/benefits|features|items|steps/i.test(line);
|
|
250
|
+
if (isListContainer && gapValue <= 3)
|
|
251
|
+
continue;
|
|
252
|
+
// Skip flex rows that are clearly not card containers
|
|
253
|
+
const isFlexRow = /flexDirection:\s*["']?row["']?/.test(line) ||
|
|
254
|
+
/flex-row/.test(line) ||
|
|
255
|
+
/direction="row"/.test(line);
|
|
256
|
+
if (isFlexRow && gapValue <= 4)
|
|
257
|
+
continue;
|
|
258
|
+
// Check if there's a Card that's actually a direct child of this container
|
|
259
|
+
// by looking for Cards before the container closes
|
|
260
|
+
let depth = 1; // Start at depth 1 (inside the container)
|
|
261
|
+
let hasDirectCardChild = false;
|
|
262
|
+
let cardLineIndex = -1;
|
|
263
|
+
for (let j = i + 1; j < Math.min(i + 30, lines.length); j++) {
|
|
264
|
+
const checkLine = lines[j];
|
|
265
|
+
// Track depth
|
|
266
|
+
const closingTags = (checkLine.match(/<\/[A-Za-z][a-zA-Z]*>/g) || []).length;
|
|
267
|
+
const selfClosing = (checkLine.match(/<[A-Za-z][a-zA-Z]*[^>]*\/>/g) || []).length;
|
|
268
|
+
const openingTags = (checkLine.match(/<[A-Za-z][a-zA-Z]*[^/>]*>/g) || []).length;
|
|
269
|
+
// Check for Card at current depth (must be direct child, depth 1)
|
|
270
|
+
if (/<Card\b/.test(checkLine) && depth === 1) {
|
|
271
|
+
hasDirectCardChild = true;
|
|
272
|
+
cardLineIndex = j;
|
|
273
|
+
}
|
|
274
|
+
depth += openingTags - closingTags;
|
|
275
|
+
// If we've closed the container, stop looking
|
|
276
|
+
if (depth <= 0)
|
|
277
|
+
break;
|
|
278
|
+
// If we hit a return statement, stop (different code path)
|
|
279
|
+
if (/^\s*return\s/.test(checkLine) || /^\s*if\s*\(/.test(checkLine))
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
if (!hasDirectCardChild)
|
|
283
|
+
continue;
|
|
284
|
+
// Use dashboard-specific allowed gaps for /admin/*, /store/*, /account/* pages
|
|
285
|
+
const allowedGaps = isInDashboard ? layout_constants_1.ALLOWED_DASHBOARD_GAPS : layout_constants_1.ALLOWED_CARD_CONTAINER_GAPS;
|
|
286
|
+
// Flag non-standard gaps
|
|
287
|
+
if (!allowedGaps.includes(gapValue)) {
|
|
288
|
+
const suggestion = isInDashboard
|
|
289
|
+
? `Change to gap-${layout_constants_1.LAYOUT_GAP_SPACING} (dashboard pages only allow gap-3)`
|
|
290
|
+
: `Change to gap-${layout_constants_1.LAYOUT_GAP_SPACING} (tight) or gap-${layout_constants_1.CARD_GRID_GAP_SPACING} (grid layouts)`;
|
|
291
|
+
issues.push({
|
|
292
|
+
file,
|
|
293
|
+
line: i + 1,
|
|
294
|
+
type: "card-container-wrong-gap",
|
|
295
|
+
severity: "error",
|
|
296
|
+
message: isInDashboard
|
|
297
|
+
? `Dashboard page uses gap-${gapValue} - only gap-${layout_constants_1.LAYOUT_GAP_SPACING} allowed in /admin/*, /store/*, /account/*`
|
|
298
|
+
: `Card container uses gap-${gapValue} instead of standard gap-${layout_constants_1.LAYOUT_GAP_SPACING} or gap-${layout_constants_1.CARD_GRID_GAP_SPACING}`,
|
|
299
|
+
suggestion,
|
|
300
|
+
snippet: line.trim().substring(0, 80),
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
// Check for Cards with margin inside gap container (double spacing!)
|
|
304
|
+
// Find all Cards with margin in the context
|
|
305
|
+
for (let j = i + 1; j < Math.min(i + 30, lines.length); j++) {
|
|
306
|
+
const cardLine = lines[j];
|
|
307
|
+
const cardMarginMatch = cardLine.match(/<Card[^>]*className="[^"]*\bmt-(\d+)/) ||
|
|
308
|
+
cardLine.match(/<Card[^>]*style=\{[^}]*marginTop/);
|
|
309
|
+
if (cardMarginMatch) {
|
|
310
|
+
// Check if this Card is actually a direct child of the gap container
|
|
311
|
+
if (isCardDirectChildOfGapContainer(lines, i, j)) {
|
|
312
|
+
issues.push({
|
|
313
|
+
file,
|
|
314
|
+
line: j + 1,
|
|
315
|
+
type: "card-double-spacing",
|
|
316
|
+
severity: "error",
|
|
317
|
+
message: "Card has margin inside container with gap - creates inconsistent spacing!",
|
|
318
|
+
suggestion: "Remove mt-* from Card - the container's gap handles spacing",
|
|
319
|
+
snippet: cardLine.trim().substring(0, 80),
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// Check Stack with Cards
|
|
326
|
+
const stackMatch = line.match(/<Stack[^>]*spacing=\{?(\d+)\}?/);
|
|
327
|
+
if (stackMatch) {
|
|
328
|
+
const stackSpacing = parseInt(stackMatch[1]);
|
|
329
|
+
const hasCardChildren = hasDirectCardChildInStack(lines, i);
|
|
330
|
+
// Use dashboard-specific allowed spacing for /admin/*, /store/*, /account/* pages
|
|
331
|
+
const allowedSpacing = isInDashboard ? layout_constants_1.ALLOWED_DASHBOARD_GAPS : layout_constants_1.ALLOWED_CARD_CONTAINER_GAPS;
|
|
332
|
+
if (hasCardChildren && !allowedSpacing.includes(stackSpacing)) {
|
|
333
|
+
const suggestion = isInDashboard
|
|
334
|
+
? `Change to spacing={${layout_constants_1.LAYOUT_GAP_SPACING}} (dashboard pages only allow spacing={3})`
|
|
335
|
+
: `Change to spacing={${layout_constants_1.LAYOUT_GAP_SPACING}} (tight) or spacing={${layout_constants_1.CARD_GRID_GAP_SPACING}} (grid layouts)`;
|
|
336
|
+
issues.push({
|
|
337
|
+
file,
|
|
338
|
+
line: i + 1,
|
|
339
|
+
type: "stack-card-wrong-spacing",
|
|
340
|
+
severity: "error",
|
|
341
|
+
message: isInDashboard
|
|
342
|
+
? `Dashboard page Stack uses spacing={${stackSpacing}} - only spacing={${layout_constants_1.LAYOUT_GAP_SPACING}} allowed in /admin/*, /store/*, /account/*`
|
|
343
|
+
: `Stack with Cards uses spacing={${stackSpacing}} instead of spacing={${layout_constants_1.LAYOUT_GAP_SPACING}} or spacing={${layout_constants_1.CARD_GRID_GAP_SPACING}}`,
|
|
344
|
+
suggestion,
|
|
345
|
+
snippet: line.trim().substring(0, 80),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
name: "Card Container Gap",
|
|
353
|
+
passed: issues.filter((i) => i.severity === "error").length === 0,
|
|
354
|
+
blocking: true,
|
|
355
|
+
issues,
|
|
356
|
+
duration: Date.now() - startTime,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
360
|
+
// CHECK: Layout Spacing Consistency
|
|
361
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
362
|
+
async function checkLayoutSpacing() {
|
|
363
|
+
const startTime = Date.now();
|
|
364
|
+
const issues = [];
|
|
365
|
+
// Enforce horizontal padding for the seller listing creation page.
|
|
366
|
+
// This page is the primary card-upload workflow and must be perfectly consistent.
|
|
367
|
+
const newListingFile = "app/store/listings/new/NewListingClient.tsx";
|
|
368
|
+
if (fs.existsSync(newListingFile)) {
|
|
369
|
+
const content = fs.readFileSync(newListingFile, "utf8");
|
|
370
|
+
const lines = content.split("\n");
|
|
371
|
+
// Main Stack wrapper: must not add any outer padding.
|
|
372
|
+
// DashboardPageLayout already provides paddingX=spacing-4 and paddingTop=spacing-3.
|
|
373
|
+
// The card-to-edge spacing should match card-to-card gap (16px).
|
|
374
|
+
const progressIndex = lines.findIndex((l) => /<UploadProgressStepper\b/.test(l));
|
|
375
|
+
if (progressIndex !== -1) {
|
|
376
|
+
let stackIndex = -1;
|
|
377
|
+
for (let i = progressIndex; i >= Math.max(0, progressIndex - 40); i--) {
|
|
378
|
+
if (/<Stack\b/.test(lines[i])) {
|
|
379
|
+
stackIndex = i;
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (stackIndex !== -1) {
|
|
384
|
+
const stackLine = lines[stackIndex];
|
|
385
|
+
const hasTailwindPadding = /\b(p|px|py)-\d+\b/.test(stackLine);
|
|
386
|
+
const hasInlinePadding = /\bpadding(Left|Right|Top|Bottom)?\s*:/.test(stackLine) ||
|
|
387
|
+
/\bstyle=\{\{[^}]*padding/.test(stackLine);
|
|
388
|
+
if (hasTailwindPadding || hasInlinePadding) {
|
|
389
|
+
issues.push({
|
|
390
|
+
file: newListingFile,
|
|
391
|
+
line: stackIndex + 1,
|
|
392
|
+
type: "new-listing-double-padding",
|
|
393
|
+
severity: "error",
|
|
394
|
+
message: "New listing page main Stack must not add padding; use layout paddingX only to keep card-to-edge spacing = gap-4",
|
|
395
|
+
suggestion: "Remove className padding (p-*/px-*/py-*) and inline padding from the main Stack",
|
|
396
|
+
snippet: stackLine.trim().substring(0, 140),
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// Loading wrapper should also avoid adding padding (layout already provides it).
|
|
402
|
+
const skeletonIndex = lines.findIndex((l) => /<SkeletonForm\b/.test(l));
|
|
403
|
+
if (skeletonIndex !== -1) {
|
|
404
|
+
for (let i = skeletonIndex; i >= Math.max(0, skeletonIndex - 15); i--) {
|
|
405
|
+
const maybeBoxLine = lines[i];
|
|
406
|
+
if (!/<Box\b/.test(maybeBoxLine))
|
|
407
|
+
continue;
|
|
408
|
+
if (/\b(p|px|py)-\d+\b/.test(maybeBoxLine)) {
|
|
409
|
+
issues.push({
|
|
410
|
+
file: newListingFile,
|
|
411
|
+
line: i + 1,
|
|
412
|
+
type: "new-listing-loading-padding",
|
|
413
|
+
severity: "error",
|
|
414
|
+
message: "New listing loading state should not add extra padding; keep outer spacing consistent with gap-4",
|
|
415
|
+
suggestion: "Remove p-*/px-*/py-* from the loading Box wrapper",
|
|
416
|
+
snippet: maybeBoxLine.trim().substring(0, 140),
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// PairedCardSlots wrapper Card must use p-4 (not spacing-6) to match gap-4.
|
|
423
|
+
const pairedIndex = lines.findIndex((l) => /<PairedCardSlots\b/.test(l));
|
|
424
|
+
if (pairedIndex !== -1) {
|
|
425
|
+
// Look back for the wrapping <Card ...> line.
|
|
426
|
+
for (let i = pairedIndex; i >= Math.max(0, pairedIndex - 20); i--) {
|
|
427
|
+
const maybeCardLine = lines[i];
|
|
428
|
+
if (!/<Card\b/.test(maybeCardLine))
|
|
429
|
+
continue;
|
|
430
|
+
// Handle multi-line opening tags like:
|
|
431
|
+
// <Card
|
|
432
|
+
// className="p-4"
|
|
433
|
+
// style={{ ... }}
|
|
434
|
+
// >
|
|
435
|
+
let tag = maybeCardLine;
|
|
436
|
+
if (!/>/.test(maybeCardLine)) {
|
|
437
|
+
for (let j = i + 1; j < Math.min(i + 8, lines.length); j++) {
|
|
438
|
+
tag += "\n" + lines[j];
|
|
439
|
+
if (/>/.test(lines[j]))
|
|
440
|
+
break;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
const hasBadPadding6 = /\b(p|px|py)-6\b/.test(tag) || /var\(--spacing-6\)/.test(tag);
|
|
444
|
+
const hasGoodPadding4 = /\b(p|px|py)-4\b/.test(tag) || /var\(--spacing-4\)/.test(tag);
|
|
445
|
+
if (hasBadPadding6 || !hasGoodPadding4) {
|
|
446
|
+
issues.push({
|
|
447
|
+
file: newListingFile,
|
|
448
|
+
line: i + 1,
|
|
449
|
+
type: "new-listing-paired-slots-padding",
|
|
450
|
+
severity: "error",
|
|
451
|
+
message: "PairedCardSlots wrapper Card must use padding=4 so edge spacing matches gap-4",
|
|
452
|
+
suggestion: 'Use className="p-4" on the wrapping Card (avoid var(--spacing-6))',
|
|
453
|
+
snippet: maybeCardLine.trim().substring(0, 140),
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
// Check DashboardPageLayout
|
|
461
|
+
const layoutFile = "components/shared/DashboardPageLayout.tsx";
|
|
462
|
+
if (fs.existsSync(layoutFile)) {
|
|
463
|
+
const content = fs.readFileSync(layoutFile, "utf8");
|
|
464
|
+
const lines = content.split("\n");
|
|
465
|
+
// Verify ALL paddingTop values are spacing-3 (must match gap for visual consistency)
|
|
466
|
+
// DashboardPageLayout has two contentStyle definitions: scroll and non-scroll
|
|
467
|
+
const paddingTopMatches = content.matchAll(/paddingTop:\s*["']var\(--spacing-(\d+)\)["']/g);
|
|
468
|
+
let matchIndex = 0;
|
|
469
|
+
for (const match of paddingTopMatches) {
|
|
470
|
+
matchIndex++;
|
|
471
|
+
const value = parseInt(match[1]);
|
|
472
|
+
if (value !== SPACING.DASHBOARD_LAYOUT_PADDING_TOP) {
|
|
473
|
+
// Find the line number for better error reporting
|
|
474
|
+
const matchPos = match.index || 0;
|
|
475
|
+
const lineNumber = content.substring(0, matchPos).split("\n").length;
|
|
476
|
+
issues.push({
|
|
477
|
+
file: layoutFile,
|
|
478
|
+
line: lineNumber,
|
|
479
|
+
type: "layout-wrong-padding-top",
|
|
480
|
+
severity: "error",
|
|
481
|
+
message: `DashboardPageLayout contentStyle #${matchIndex} uses paddingTop spacing-${value} instead of spacing-${SPACING.DASHBOARD_LAYOUT_PADDING_TOP}`,
|
|
482
|
+
suggestion: `Change to paddingTop: "var(--spacing-${SPACING.DASHBOARD_LAYOUT_PADDING_TOP})" - paddingTop must equal gap for visual consistency`,
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// Check UnifiedBreadcrumbs
|
|
488
|
+
const breadcrumbFile = "components/shared/UnifiedBreadcrumbs.tsx";
|
|
489
|
+
if (fs.existsSync(breadcrumbFile)) {
|
|
490
|
+
const content = fs.readFileSync(breadcrumbFile, "utf8");
|
|
491
|
+
// Verify consistent padding across variants
|
|
492
|
+
const paddingMatches = content.matchAll(/paddingTop:\s*["']var\(--spacing-(\d+)\)["']/g);
|
|
493
|
+
const paddingValues = new Set();
|
|
494
|
+
for (const match of paddingMatches) {
|
|
495
|
+
paddingValues.add(parseInt(match[1]));
|
|
496
|
+
}
|
|
497
|
+
// Should only have spacing-1 (minimal) and spacing-2 (default/compact/rich)
|
|
498
|
+
const allowedValues = new Set([1, 2]);
|
|
499
|
+
for (const value of paddingValues) {
|
|
500
|
+
if (!allowedValues.has(value)) {
|
|
501
|
+
issues.push({
|
|
502
|
+
file: breadcrumbFile,
|
|
503
|
+
type: "breadcrumb-inconsistent-padding",
|
|
504
|
+
severity: "warning",
|
|
505
|
+
message: `UnifiedBreadcrumbs has non-standard paddingTop: spacing-${value}`,
|
|
506
|
+
suggestion: "Use spacing-2 for default/compact/rich, spacing-1 for minimal",
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return {
|
|
512
|
+
name: "Layout Spacing",
|
|
513
|
+
passed: issues.filter((i) => i.severity === "error").length === 0,
|
|
514
|
+
blocking: true,
|
|
515
|
+
issues,
|
|
516
|
+
duration: Date.now() - startTime,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
520
|
+
// CHECK: Page Header Spacing
|
|
521
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
522
|
+
async function checkPageHeaderSpacing() {
|
|
523
|
+
const startTime = Date.now();
|
|
524
|
+
const issues = [];
|
|
525
|
+
// Check UnifiedHeader
|
|
526
|
+
const headerFile = "components/UnifiedHeader.tsx";
|
|
527
|
+
if (fs.existsSync(headerFile)) {
|
|
528
|
+
const content = fs.readFileSync(headerFile, "utf8");
|
|
529
|
+
// Find page variant marginBottom
|
|
530
|
+
const pageVariantMatch = content.match(/variant === "page"[\s\S]*?marginBottom:\s*["']var\(--spacing-(\d+)\)["']/);
|
|
531
|
+
if (pageVariantMatch) {
|
|
532
|
+
const value = parseInt(pageVariantMatch[1]);
|
|
533
|
+
if (value !== SPACING.PAGE_HEADER_MARGIN_BOTTOM) {
|
|
534
|
+
issues.push({
|
|
535
|
+
file: headerFile,
|
|
536
|
+
type: "header-wrong-margin-bottom",
|
|
537
|
+
severity: "error",
|
|
538
|
+
message: `UnifiedHeader page variant uses marginBottom spacing-${value} instead of spacing-${SPACING.PAGE_HEADER_MARGIN_BOTTOM}`,
|
|
539
|
+
suggestion: `Change to marginBottom: "var(--spacing-${SPACING.PAGE_HEADER_MARGIN_BOTTOM})"`,
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
// Check for content with marginTop after UnifiedHeader
|
|
545
|
+
const files = await getClientFiles();
|
|
546
|
+
for (const file of files) {
|
|
547
|
+
const content = fs.readFileSync(file, "utf8");
|
|
548
|
+
if (!content.includes("UnifiedHeader"))
|
|
549
|
+
continue;
|
|
550
|
+
const lines = content.split("\n");
|
|
551
|
+
let headerLineIndex = -1;
|
|
552
|
+
let containerLineIndex = -1;
|
|
553
|
+
for (let i = 0; i < lines.length; i++) {
|
|
554
|
+
// Track the parent container (Box/div with className) before UnifiedHeader
|
|
555
|
+
if (/<(?:Box|div)[^>]*className=/.test(lines[i])) {
|
|
556
|
+
containerLineIndex = i;
|
|
557
|
+
}
|
|
558
|
+
if (/UnifiedHeader[^>]*variant=["']page["']/.test(lines[i]) ||
|
|
559
|
+
(/UnifiedHeader/.test(lines[i]) &&
|
|
560
|
+
lines
|
|
561
|
+
.slice(i, i + 5)
|
|
562
|
+
.join("")
|
|
563
|
+
.includes('variant="page"'))) {
|
|
564
|
+
headerLineIndex = i;
|
|
565
|
+
// Check if the container has gap-3 or flex-col gap
|
|
566
|
+
if (containerLineIndex !== -1 && containerLineIndex < headerLineIndex) {
|
|
567
|
+
const containerLine = lines[containerLineIndex];
|
|
568
|
+
const hasGap = /gap-3|gap-\d|flex-col.*gap|gap.*flex-col/.test(containerLine);
|
|
569
|
+
const isFlexCol = /flex-col|flex flex-col/.test(containerLine);
|
|
570
|
+
// If it's a flex-col container without gap, flag it
|
|
571
|
+
if (isFlexCol && !hasGap) {
|
|
572
|
+
// Look ahead to see if there's content after the header (not just closing tags)
|
|
573
|
+
const nextLines = lines.slice(headerLineIndex + 1, headerLineIndex + 20).join("\n");
|
|
574
|
+
const hasContentAfterHeader = /<(?!\/)[A-Z]/.test(nextLines) && !/<\/Box>|<\/div>/.test(nextLines.split("\n")[0]);
|
|
575
|
+
if (hasContentAfterHeader) {
|
|
576
|
+
issues.push({
|
|
577
|
+
file,
|
|
578
|
+
line: containerLineIndex + 1,
|
|
579
|
+
type: "missing-gap-after-header",
|
|
580
|
+
severity: "error",
|
|
581
|
+
message: "Content container with UnifiedHeader missing gap-3 - creates no spacing between header and content",
|
|
582
|
+
suggestion: 'Add gap-3 to the flex-col container: className="flex flex-col gap-3"',
|
|
583
|
+
snippet: containerLine.trim().substring(0, 80),
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
// Check for marginTop after header
|
|
590
|
+
if (headerLineIndex !== -1 && i > headerLineIndex && i <= headerLineIndex + 10) {
|
|
591
|
+
if (/marginTop:\s*["']var\(--spacing-\d+\)["']/.test(lines[i]) ||
|
|
592
|
+
/\bmt-\d+\b/.test(lines[i])) {
|
|
593
|
+
issues.push({
|
|
594
|
+
file,
|
|
595
|
+
line: i + 1,
|
|
596
|
+
type: "doubled-header-spacing",
|
|
597
|
+
severity: "warning",
|
|
598
|
+
message: "Content after UnifiedHeader has marginTop - header already has marginBottom",
|
|
599
|
+
suggestion: "Remove marginTop - the header's marginBottom provides spacing",
|
|
600
|
+
snippet: lines[i].trim().substring(0, 80),
|
|
601
|
+
});
|
|
602
|
+
headerLineIndex = -1; // Reset to avoid duplicate warnings
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
// Check for excessive padding after breadcrumbs (py-8, pt-8, etc.)
|
|
608
|
+
const allPageFiles = await getAppTsxFiles();
|
|
609
|
+
for (const file of allPageFiles) {
|
|
610
|
+
const content = fs.readFileSync(file, "utf8");
|
|
611
|
+
// Skip files without breadcrumbs
|
|
612
|
+
if (!content.includes("Breadcrumb") && !content.includes("breadcrumb"))
|
|
613
|
+
continue;
|
|
614
|
+
const lines = content.split("\n");
|
|
615
|
+
let breadcrumbLineIndex = -1;
|
|
616
|
+
for (let i = 0; i < lines.length; i++) {
|
|
617
|
+
const line = lines[i];
|
|
618
|
+
// Track breadcrumb location
|
|
619
|
+
if (/Breadcrumb/.test(line)) {
|
|
620
|
+
breadcrumbLineIndex = i;
|
|
621
|
+
}
|
|
622
|
+
// Check for excessive padding on content after breadcrumbs
|
|
623
|
+
if (breadcrumbLineIndex !== -1 && i > breadcrumbLineIndex && i <= breadcrumbLineIndex + 15) {
|
|
624
|
+
// Check for py-8, pt-8, py-6, pt-6 or similar large padding
|
|
625
|
+
const largePaddingMatch = line.match(/\b(py|pt)-([6-9]|\d{2})\b/);
|
|
626
|
+
if (largePaddingMatch) {
|
|
627
|
+
const paddingValue = parseInt(largePaddingMatch[2]);
|
|
628
|
+
if (paddingValue >= 6) {
|
|
629
|
+
issues.push({
|
|
630
|
+
file,
|
|
631
|
+
line: i + 1,
|
|
632
|
+
type: "excessive-padding-after-breadcrumbs",
|
|
633
|
+
severity: "error",
|
|
634
|
+
message: `Content after breadcrumbs has ${largePaddingMatch[1]}-${paddingValue} (${paddingValue * 4}px) - creates excessive gap`,
|
|
635
|
+
suggestion: `Use pt-3 (12px) for consistent spacing after breadcrumbs`,
|
|
636
|
+
snippet: line.trim().substring(0, 80),
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
return {
|
|
644
|
+
name: "Page Header Spacing",
|
|
645
|
+
passed: issues.filter((i) => i.severity === "error").length === 0,
|
|
646
|
+
blocking: true,
|
|
647
|
+
issues,
|
|
648
|
+
duration: Date.now() - startTime,
|
|
649
|
+
};
|
|
650
|
+
}
|
|
651
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
652
|
+
// CHECK: Inconsistent Spacing Within File
|
|
653
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
654
|
+
async function checkIntraFileConsistency() {
|
|
655
|
+
const startTime = Date.now();
|
|
656
|
+
const issues = [];
|
|
657
|
+
const files = await getAppComponentsTsxFiles();
|
|
658
|
+
for (const file of files) {
|
|
659
|
+
const content = fs.readFileSync(file, "utf8");
|
|
660
|
+
// Track gap values used in this file
|
|
661
|
+
const gapValues = [];
|
|
662
|
+
const gapMatches = content.matchAll(/gap-(\d+)/g);
|
|
663
|
+
for (const match of gapMatches) {
|
|
664
|
+
gapValues.push(parseInt(match[1]));
|
|
665
|
+
}
|
|
666
|
+
// Track margin-top values on Cards
|
|
667
|
+
const cardMargins = [];
|
|
668
|
+
const cardMarginMatches = content.matchAll(/<Card[^>]*className="[^"]*\bmt-(\d+)/g);
|
|
669
|
+
for (const match of cardMarginMatches) {
|
|
670
|
+
cardMargins.push(parseInt(match[1]));
|
|
671
|
+
}
|
|
672
|
+
// Check for inconsistent Card margins within same file
|
|
673
|
+
const uniqueCardMargins = [...new Set(cardMargins)];
|
|
674
|
+
if (uniqueCardMargins.length > 1) {
|
|
675
|
+
issues.push({
|
|
676
|
+
file,
|
|
677
|
+
type: "inconsistent-card-margins",
|
|
678
|
+
severity: "warning",
|
|
679
|
+
message: `File uses inconsistent Card margins: mt-${uniqueCardMargins.join(", mt-")}`,
|
|
680
|
+
suggestion: "Standardize to a single margin value or use container with gap",
|
|
681
|
+
});
|
|
682
|
+
}
|
|
683
|
+
// Check for mixing gap with Card margins (anti-pattern)
|
|
684
|
+
if (gapValues.length > 0 && cardMargins.length > 0) {
|
|
685
|
+
issues.push({
|
|
686
|
+
file,
|
|
687
|
+
type: "mixed-gap-and-margin",
|
|
688
|
+
severity: "warning",
|
|
689
|
+
message: "File mixes gap containers with Card margins - pick one approach",
|
|
690
|
+
suggestion: "Use gap on container OR margin on Cards, not both",
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
return {
|
|
695
|
+
name: "Intra-File Consistency",
|
|
696
|
+
passed: issues.filter((i) => i.severity === "error").length === 0,
|
|
697
|
+
blocking: false, // Warning only
|
|
698
|
+
issues,
|
|
699
|
+
duration: Date.now() - startTime,
|
|
700
|
+
};
|
|
701
|
+
}
|
|
702
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
703
|
+
// CHECK: Asymmetric Positioning (top/right/bottom/left consistency)
|
|
704
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
705
|
+
/**
|
|
706
|
+
* Detects absolute/fixed positioned elements where top/right/bottom/left
|
|
707
|
+
* use different spacing values, creating visual asymmetry.
|
|
708
|
+
*
|
|
709
|
+
* Example violation:
|
|
710
|
+
* style={{ top: "var(--spacing-2)", right: "var(--spacing-3)" }}
|
|
711
|
+
* // top = 8px, right = 12px - asymmetric!
|
|
712
|
+
*
|
|
713
|
+
* Correct:
|
|
714
|
+
* style={{ top: "var(--spacing-3)", right: "var(--spacing-3)" }}
|
|
715
|
+
* // Both 12px - symmetric
|
|
716
|
+
*/
|
|
717
|
+
async function checkAsymmetricPositioning() {
|
|
718
|
+
const startTime = Date.now();
|
|
719
|
+
const issues = [];
|
|
720
|
+
const files = await getAppComponentsTsxFiles();
|
|
721
|
+
// Regex to extract spacing values from position properties
|
|
722
|
+
const spacingVarRegex = /var\(--spacing-(\d+)\)/;
|
|
723
|
+
const spacingConstRegex = /SPACING_(\d+)/;
|
|
724
|
+
for (const file of files) {
|
|
725
|
+
const content = fs.readFileSync(file, "utf8");
|
|
726
|
+
const lines = content.split("\n");
|
|
727
|
+
for (let i = 0; i < lines.length; i++) {
|
|
728
|
+
const line = lines[i];
|
|
729
|
+
// Look for absolute or fixed positioned elements
|
|
730
|
+
if (!/(position:\s*["']?(absolute|fixed)|className="[^"]*\b(absolute|fixed)\b)/.test(line)) {
|
|
731
|
+
continue;
|
|
732
|
+
}
|
|
733
|
+
// Gather the style block (may span multiple lines)
|
|
734
|
+
let styleBlock = "";
|
|
735
|
+
let searchStart = i;
|
|
736
|
+
// Look for style={{ in current or nearby lines
|
|
737
|
+
for (let j = Math.max(0, i - 2); j < Math.min(lines.length, i + 10); j++) {
|
|
738
|
+
if (/style=\{\{/.test(lines[j])) {
|
|
739
|
+
searchStart = j;
|
|
740
|
+
// Collect until closing }}
|
|
741
|
+
let braceCount = 0;
|
|
742
|
+
for (let k = j; k < Math.min(lines.length, j + 20); k++) {
|
|
743
|
+
styleBlock += lines[k] + "\n";
|
|
744
|
+
braceCount += (lines[k].match(/\{/g) || []).length;
|
|
745
|
+
braceCount -= (lines[k].match(/\}/g) || []).length;
|
|
746
|
+
if (braceCount <= 0 && styleBlock.includes("}}"))
|
|
747
|
+
break;
|
|
748
|
+
}
|
|
749
|
+
break;
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
if (!styleBlock)
|
|
753
|
+
continue;
|
|
754
|
+
// Extract position values
|
|
755
|
+
const positions = [];
|
|
756
|
+
const positionProps = ["top", "right", "bottom", "left"];
|
|
757
|
+
for (const prop of positionProps) {
|
|
758
|
+
// Match: top: SPACING_2 or top: "var(--spacing-2)"
|
|
759
|
+
const propRegex = new RegExp(`${prop}:\\s*(?:["']?(var\\(--spacing-(\\d+)\\))["']?|SPACING_(\\d+))`, "i");
|
|
760
|
+
const match = styleBlock.match(propRegex);
|
|
761
|
+
if (match) {
|
|
762
|
+
const value = parseInt(match[2] || match[3]);
|
|
763
|
+
positions.push({ prop, value, raw: match[0] });
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
// Check for asymmetry between adjacent edges
|
|
767
|
+
// top/right should match, right/bottom should match, etc.
|
|
768
|
+
if (positions.length >= 2) {
|
|
769
|
+
const values = positions.map((p) => p.value);
|
|
770
|
+
const uniqueValues = [...new Set(values)];
|
|
771
|
+
// If we have top+right or top+left with different values, that's asymmetric
|
|
772
|
+
const hasTop = positions.find((p) => p.prop === "top");
|
|
773
|
+
const hasRight = positions.find((p) => p.prop === "right");
|
|
774
|
+
const hasBottom = positions.find((p) => p.prop === "bottom");
|
|
775
|
+
const hasLeft = positions.find((p) => p.prop === "left");
|
|
776
|
+
// Check corner asymmetry (top-right corner, top-left corner, etc.)
|
|
777
|
+
const cornerPairs = [
|
|
778
|
+
[hasTop, hasRight],
|
|
779
|
+
[hasTop, hasLeft],
|
|
780
|
+
[hasBottom, hasRight],
|
|
781
|
+
[hasBottom, hasLeft],
|
|
782
|
+
];
|
|
783
|
+
for (const [edge1, edge2] of cornerPairs) {
|
|
784
|
+
if (edge1 && edge2 && edge1.value !== edge2.value) {
|
|
785
|
+
issues.push({
|
|
786
|
+
file,
|
|
787
|
+
line: searchStart + 1,
|
|
788
|
+
type: "asymmetric-positioning",
|
|
789
|
+
severity: "error",
|
|
790
|
+
message: `Asymmetric positioning: ${edge1.prop}=spacing-${edge1.value} but ${edge2.prop}=spacing-${edge2.value}`,
|
|
791
|
+
suggestion: `Use same spacing value for ${edge1.prop} and ${edge2.prop} (e.g., both spacing-${Math.max(edge1.value, edge2.value)})`,
|
|
792
|
+
snippet: `${edge1.raw}, ${edge2.raw}`,
|
|
793
|
+
});
|
|
794
|
+
break; // One issue per element is enough
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
return {
|
|
801
|
+
name: "Asymmetric Positioning",
|
|
802
|
+
passed: issues.filter((i) => i.severity === "error").length === 0,
|
|
803
|
+
blocking: true,
|
|
804
|
+
issues,
|
|
805
|
+
duration: Date.now() - startTime,
|
|
806
|
+
};
|
|
807
|
+
}
|
|
808
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
809
|
+
// MAIN
|
|
810
|
+
// ${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}${box.doubleHorizontal}
|
|
811
|
+
async function main() {
|
|
812
|
+
const reporter = (0, universal_progress_reporter_1.createUniversalProgressReporter)(path.basename(__filename, ".ts"));
|
|
813
|
+
const args = process.argv.slice(2);
|
|
814
|
+
const mode = args[0] || "all";
|
|
815
|
+
console.log("\nš UI SPACING STANDARDS PREFLIGHT");
|
|
816
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
817
|
+
console.log(`Standard Gap: gap-${SPACING.CARD_CONTAINER_GAP} (${SPACING.CARD_CONTAINER_GAP * 4}px) - matches header spacing`);
|
|
818
|
+
console.log(`Major Sections: gap-${SPACING.SECTION_GAP_MAX} (${SPACING.SECTION_GAP_MAX * 4}px) - for large separations`);
|
|
819
|
+
console.log(`PROHIBITED: gap-4 (16px) - creates inconsistent spacing`);
|
|
820
|
+
console.log(`Breadcrumb to Content: spacing-${SPACING.BREADCRUMB_TO_CONTENT} (${SPACING.BREADCRUMB_TO_CONTENT * 4}px)`);
|
|
821
|
+
console.log(`Page Header Margin: spacing-${SPACING.PAGE_HEADER_MARGIN_BOTTOM} (${SPACING.PAGE_HEADER_MARGIN_BOTTOM * 4}px)`);
|
|
822
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
823
|
+
const checks = [];
|
|
824
|
+
if (mode === "all" || mode === "cards") {
|
|
825
|
+
checks.push(await checkCardContainerGap());
|
|
826
|
+
}
|
|
827
|
+
if (mode === "all" || mode === "layout") {
|
|
828
|
+
checks.push(await checkLayoutSpacing());
|
|
829
|
+
checks.push(await checkPageHeaderSpacing());
|
|
830
|
+
}
|
|
831
|
+
if (mode === "all" || mode === "consistency") {
|
|
832
|
+
checks.push(await checkIntraFileConsistency());
|
|
833
|
+
}
|
|
834
|
+
if (mode === "all" || mode === "positioning") {
|
|
835
|
+
checks.push(await checkAsymmetricPositioning());
|
|
836
|
+
}
|
|
837
|
+
// Print results
|
|
838
|
+
console.log(`\n${console_chars_1.emoji.chart} RESULTS`);
|
|
839
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
840
|
+
let totalErrors = 0;
|
|
841
|
+
let totalWarnings = 0;
|
|
842
|
+
for (const check of checks) {
|
|
843
|
+
const errors = check.issues.filter((i) => i.severity === "error").length;
|
|
844
|
+
const warnings = check.issues.filter((i) => i.severity === "warning").length;
|
|
845
|
+
totalErrors += errors;
|
|
846
|
+
totalWarnings += warnings;
|
|
847
|
+
const icon = errors > 0 ? `${console_chars_1.emoji.error}` : warnings > 0 ? `${console_chars_1.emoji.warning}` : `${console_chars_1.emoji.success}`;
|
|
848
|
+
console.log(`${icon} ${check.name.padEnd(30)} ${(check.duration / 1000).toFixed(1)}s (${errors} errors, ${warnings} warnings)`);
|
|
849
|
+
// Print first 10 issues
|
|
850
|
+
if (check.issues.length > 0) {
|
|
851
|
+
check.issues.slice(0, 10).forEach((issue) => {
|
|
852
|
+
const prefix = issue.severity === "error" ? ` ${console_chars_1.emoji.error}` : ` ${console_chars_1.emoji.warning}`;
|
|
853
|
+
console.log(`${prefix} ${issue.file}:${issue.line || "?"}`);
|
|
854
|
+
console.log(` ${issue.message}`);
|
|
855
|
+
});
|
|
856
|
+
if (check.issues.length > 10) {
|
|
857
|
+
console.log(` ... and ${check.issues.length - 10} more`);
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
862
|
+
console.log(`Total: ${totalErrors} errors, ${totalWarnings} warnings`);
|
|
863
|
+
const hasBlockingErrors = checks.some((c) => c.blocking && !c.passed);
|
|
864
|
+
if (hasBlockingErrors) {
|
|
865
|
+
console.log(`\n${console_chars_1.emoji.error} UI SPACING STANDARDS FAILED`);
|
|
866
|
+
process.exit(1);
|
|
867
|
+
}
|
|
868
|
+
else {
|
|
869
|
+
console.log(`\n${console_chars_1.emoji.success} UI SPACING STANDARDS PASSED`);
|
|
870
|
+
process.exit(0);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
main();
|
|
874
|
+
//# sourceMappingURL=ui-spacing-standards.js.map
|