@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.
Files changed (709) hide show
  1. package/dist/checks/consolidated/auth-storage-state.d.ts +3 -0
  2. package/dist/checks/consolidated/auth-storage-state.d.ts.map +1 -0
  3. package/dist/checks/consolidated/auth-storage-state.js +146 -0
  4. package/dist/checks/consolidated/auth-storage-state.js.map +1 -0
  5. package/dist/checks/consolidated/business.d.ts +50 -0
  6. package/dist/checks/consolidated/business.d.ts.map +1 -0
  7. package/dist/checks/consolidated/business.js +252 -0
  8. package/dist/checks/consolidated/business.js.map +1 -0
  9. package/dist/checks/consolidated/caching-strategy.d.ts +104 -0
  10. package/dist/checks/consolidated/caching-strategy.d.ts.map +1 -0
  11. package/dist/checks/consolidated/caching-strategy.js +725 -0
  12. package/dist/checks/consolidated/caching-strategy.js.map +1 -0
  13. package/dist/checks/consolidated/code-quality.d.ts +83 -0
  14. package/dist/checks/consolidated/code-quality.d.ts.map +1 -0
  15. package/dist/checks/consolidated/code-quality.js +445 -0
  16. package/dist/checks/consolidated/code-quality.js.map +1 -0
  17. package/dist/checks/consolidated/console-statements.d.ts +32 -0
  18. package/dist/checks/consolidated/console-statements.d.ts.map +1 -0
  19. package/dist/checks/consolidated/console-statements.js +304 -0
  20. package/dist/checks/consolidated/console-statements.js.map +1 -0
  21. package/dist/checks/consolidated/css-advanced-validation.d.ts +24 -0
  22. package/dist/checks/consolidated/css-advanced-validation.d.ts.map +1 -0
  23. package/dist/checks/consolidated/css-advanced-validation.js +415 -0
  24. package/dist/checks/consolidated/css-advanced-validation.js.map +1 -0
  25. package/dist/checks/consolidated/css-organization.d.ts +14 -0
  26. package/dist/checks/consolidated/css-organization.d.ts.map +1 -0
  27. package/dist/checks/consolidated/css-organization.js +432 -0
  28. package/dist/checks/consolidated/css-organization.js.map +1 -0
  29. package/dist/checks/consolidated/css-runtime-validation.d.ts +22 -0
  30. package/dist/checks/consolidated/css-runtime-validation.d.ts.map +1 -0
  31. package/dist/checks/consolidated/css-runtime-validation.js +330 -0
  32. package/dist/checks/consolidated/css-runtime-validation.js.map +1 -0
  33. package/dist/checks/consolidated/css-variable-validation.d.ts +17 -0
  34. package/dist/checks/consolidated/css-variable-validation.d.ts.map +1 -0
  35. package/dist/checks/consolidated/css-variable-validation.js +412 -0
  36. package/dist/checks/consolidated/css-variable-validation.js.map +1 -0
  37. package/dist/checks/consolidated/dark-mode-consistency.d.ts +23 -0
  38. package/dist/checks/consolidated/dark-mode-consistency.d.ts.map +1 -0
  39. package/dist/checks/consolidated/dark-mode-consistency.js +291 -0
  40. package/dist/checks/consolidated/dark-mode-consistency.js.map +1 -0
  41. package/dist/checks/consolidated/database.d.ts +95 -0
  42. package/dist/checks/consolidated/database.d.ts.map +1 -0
  43. package/dist/checks/consolidated/database.js +427 -0
  44. package/dist/checks/consolidated/database.js.map +1 -0
  45. package/dist/checks/consolidated/e2e-checks.d.ts +52 -0
  46. package/dist/checks/consolidated/e2e-checks.d.ts.map +1 -0
  47. package/dist/checks/consolidated/e2e-checks.js +157 -0
  48. package/dist/checks/consolidated/e2e-checks.js.map +1 -0
  49. package/dist/checks/consolidated/e2e-regression-coverage.d.ts +14 -0
  50. package/dist/checks/consolidated/e2e-regression-coverage.d.ts.map +1 -0
  51. package/dist/checks/consolidated/e2e-regression-coverage.js +151 -0
  52. package/dist/checks/consolidated/e2e-regression-coverage.js.map +1 -0
  53. package/dist/checks/consolidated/e2e-validation.d.ts +137 -0
  54. package/dist/checks/consolidated/e2e-validation.d.ts.map +1 -0
  55. package/dist/checks/consolidated/e2e-validation.js +1001 -0
  56. package/dist/checks/consolidated/e2e-validation.js.map +1 -0
  57. package/dist/checks/consolidated/enterprise-baseline.d.ts +9 -0
  58. package/dist/checks/consolidated/enterprise-baseline.d.ts.map +1 -0
  59. package/dist/checks/consolidated/enterprise-baseline.js +277 -0
  60. package/dist/checks/consolidated/enterprise-baseline.js.map +1 -0
  61. package/dist/checks/consolidated/generate-pageload-config.d.ts +6 -0
  62. package/dist/checks/consolidated/generate-pageload-config.d.ts.map +1 -0
  63. package/dist/checks/consolidated/generate-pageload-config.js +161 -0
  64. package/dist/checks/consolidated/generate-pageload-config.js.map +1 -0
  65. package/dist/checks/consolidated/hardened-checks.d.ts +276 -0
  66. package/dist/checks/consolidated/hardened-checks.d.ts.map +1 -0
  67. package/dist/checks/consolidated/hardened-checks.js +3056 -0
  68. package/dist/checks/consolidated/hardened-checks.js.map +1 -0
  69. package/dist/checks/consolidated/homepage-ux.d.ts +12 -0
  70. package/dist/checks/consolidated/homepage-ux.d.ts.map +1 -0
  71. package/dist/checks/consolidated/homepage-ux.js +242 -0
  72. package/dist/checks/consolidated/homepage-ux.js.map +1 -0
  73. package/dist/checks/consolidated/images.d.ts +76 -0
  74. package/dist/checks/consolidated/images.d.ts.map +1 -0
  75. package/dist/checks/consolidated/images.js +311 -0
  76. package/dist/checks/consolidated/images.js.map +1 -0
  77. package/dist/checks/consolidated/import-cycles.d.ts +63 -0
  78. package/dist/checks/consolidated/import-cycles.d.ts.map +1 -0
  79. package/dist/checks/consolidated/import-cycles.js +291 -0
  80. package/dist/checks/consolidated/import-cycles.js.map +1 -0
  81. package/dist/checks/consolidated/imports.d.ts +112 -0
  82. package/dist/checks/consolidated/imports.d.ts.map +1 -0
  83. package/dist/checks/consolidated/imports.js +977 -0
  84. package/dist/checks/consolidated/imports.js.map +1 -0
  85. package/dist/checks/consolidated/inline-style-conflicts.d.ts +21 -0
  86. package/dist/checks/consolidated/inline-style-conflicts.d.ts.map +1 -0
  87. package/dist/checks/consolidated/inline-style-conflicts.js +300 -0
  88. package/dist/checks/consolidated/inline-style-conflicts.js.map +1 -0
  89. package/dist/checks/consolidated/lib-organization.d.ts +12 -0
  90. package/dist/checks/consolidated/lib-organization.d.ts.map +1 -0
  91. package/dist/checks/consolidated/lib-organization.js +419 -0
  92. package/dist/checks/consolidated/lib-organization.js.map +1 -0
  93. package/dist/checks/consolidated/n-plus-one.d.ts +63 -0
  94. package/dist/checks/consolidated/n-plus-one.d.ts.map +1 -0
  95. package/dist/checks/consolidated/n-plus-one.js +331 -0
  96. package/dist/checks/consolidated/n-plus-one.js.map +1 -0
  97. package/dist/checks/consolidated/nextjs.d.ts +51 -0
  98. package/dist/checks/consolidated/nextjs.d.ts.map +1 -0
  99. package/dist/checks/consolidated/nextjs.js +205 -0
  100. package/dist/checks/consolidated/nextjs.js.map +1 -0
  101. package/dist/checks/consolidated/organization.d.ts +54 -0
  102. package/dist/checks/consolidated/organization.d.ts.map +1 -0
  103. package/dist/checks/consolidated/organization.js +158 -0
  104. package/dist/checks/consolidated/organization.js.map +1 -0
  105. package/dist/checks/consolidated/pageload.d.ts +12 -0
  106. package/dist/checks/consolidated/pageload.d.ts.map +1 -0
  107. package/dist/checks/consolidated/pageload.js +138 -0
  108. package/dist/checks/consolidated/pageload.js.map +1 -0
  109. package/dist/checks/consolidated/performance.d.ts +112 -0
  110. package/dist/checks/consolidated/performance.d.ts.map +1 -0
  111. package/dist/checks/consolidated/performance.js +1546 -0
  112. package/dist/checks/consolidated/performance.js.map +1 -0
  113. package/dist/checks/consolidated/quality.d.ts +52 -0
  114. package/dist/checks/consolidated/quality.d.ts.map +1 -0
  115. package/dist/checks/consolidated/quality.js +253 -0
  116. package/dist/checks/consolidated/quality.js.map +1 -0
  117. package/dist/checks/consolidated/react.d.ts +48 -0
  118. package/dist/checks/consolidated/react.d.ts.map +1 -0
  119. package/dist/checks/consolidated/react.js +203 -0
  120. package/dist/checks/consolidated/react.js.map +1 -0
  121. package/dist/checks/consolidated/regression-hygiene.d.ts +17 -0
  122. package/dist/checks/consolidated/regression-hygiene.d.ts.map +1 -0
  123. package/dist/checks/consolidated/regression-hygiene.js +242 -0
  124. package/dist/checks/consolidated/regression-hygiene.js.map +1 -0
  125. package/dist/checks/consolidated/regression.d.ts +20 -0
  126. package/dist/checks/consolidated/regression.d.ts.map +1 -0
  127. package/dist/checks/consolidated/regression.js +121 -0
  128. package/dist/checks/consolidated/regression.js.map +1 -0
  129. package/dist/checks/consolidated/runtime.d.ts +53 -0
  130. package/dist/checks/consolidated/runtime.d.ts.map +1 -0
  131. package/dist/checks/consolidated/runtime.js +160 -0
  132. package/dist/checks/consolidated/runtime.js.map +1 -0
  133. package/dist/checks/consolidated/script-performance.d.ts +17 -0
  134. package/dist/checks/consolidated/script-performance.d.ts.map +1 -0
  135. package/dist/checks/consolidated/script-performance.js +137 -0
  136. package/dist/checks/consolidated/script-performance.js.map +1 -0
  137. package/dist/checks/consolidated/security.d.ts +78 -0
  138. package/dist/checks/consolidated/security.d.ts.map +1 -0
  139. package/dist/checks/consolidated/security.js +404 -0
  140. package/dist/checks/consolidated/security.js.map +1 -0
  141. package/dist/checks/consolidated/seo.d.ts +31 -0
  142. package/dist/checks/consolidated/seo.d.ts.map +1 -0
  143. package/dist/checks/consolidated/seo.js +1438 -0
  144. package/dist/checks/consolidated/seo.js.map +1 -0
  145. package/dist/checks/consolidated/sx-prop-deprecation.d.ts +22 -0
  146. package/dist/checks/consolidated/sx-prop-deprecation.d.ts.map +1 -0
  147. package/dist/checks/consolidated/sx-prop-deprecation.js +280 -0
  148. package/dist/checks/consolidated/sx-prop-deprecation.js.map +1 -0
  149. package/dist/checks/consolidated/tailwind-class-validation.d.ts +25 -0
  150. package/dist/checks/consolidated/tailwind-class-validation.d.ts.map +1 -0
  151. package/dist/checks/consolidated/tailwind-class-validation.js +533 -0
  152. package/dist/checks/consolidated/tailwind-class-validation.js.map +1 -0
  153. package/dist/checks/consolidated/testing.d.ts +54 -0
  154. package/dist/checks/consolidated/testing.d.ts.map +1 -0
  155. package/dist/checks/consolidated/testing.js +163 -0
  156. package/dist/checks/consolidated/testing.js.map +1 -0
  157. package/dist/checks/consolidated/typescript.d.ts +3 -0
  158. package/dist/checks/consolidated/typescript.d.ts.map +1 -0
  159. package/dist/checks/consolidated/typescript.js +31 -0
  160. package/dist/checks/consolidated/typescript.js.map +1 -0
  161. package/dist/checks/consolidated/ui-accessibility-advanced.d.ts +104 -0
  162. package/dist/checks/consolidated/ui-accessibility-advanced.d.ts.map +1 -0
  163. package/dist/checks/consolidated/ui-accessibility-advanced.js +689 -0
  164. package/dist/checks/consolidated/ui-accessibility-advanced.js.map +1 -0
  165. package/dist/checks/consolidated/ui-accessibility.d.ts +121 -0
  166. package/dist/checks/consolidated/ui-accessibility.d.ts.map +1 -0
  167. package/dist/checks/consolidated/ui-accessibility.js +776 -0
  168. package/dist/checks/consolidated/ui-accessibility.js.map +1 -0
  169. package/dist/checks/consolidated/ui-advanced-spacing.d.ts +142 -0
  170. package/dist/checks/consolidated/ui-advanced-spacing.d.ts.map +1 -0
  171. package/dist/checks/consolidated/ui-advanced-spacing.js +1220 -0
  172. package/dist/checks/consolidated/ui-advanced-spacing.js.map +1 -0
  173. package/dist/checks/consolidated/ui-animation-duration.d.ts +108 -0
  174. package/dist/checks/consolidated/ui-animation-duration.d.ts.map +1 -0
  175. package/dist/checks/consolidated/ui-animation-duration.js +531 -0
  176. package/dist/checks/consolidated/ui-animation-duration.js.map +1 -0
  177. package/dist/checks/consolidated/ui-border-radius.d.ts +90 -0
  178. package/dist/checks/consolidated/ui-border-radius.d.ts.map +1 -0
  179. package/dist/checks/consolidated/ui-border-radius.js +519 -0
  180. package/dist/checks/consolidated/ui-border-radius.js.map +1 -0
  181. package/dist/checks/consolidated/ui-buttons.d.ts +32 -0
  182. package/dist/checks/consolidated/ui-buttons.d.ts.map +1 -0
  183. package/dist/checks/consolidated/ui-buttons.js +481 -0
  184. package/dist/checks/consolidated/ui-buttons.js.map +1 -0
  185. package/dist/checks/consolidated/ui-cards.d.ts +29 -0
  186. package/dist/checks/consolidated/ui-cards.d.ts.map +1 -0
  187. package/dist/checks/consolidated/ui-cards.js +504 -0
  188. package/dist/checks/consolidated/ui-cards.js.map +1 -0
  189. package/dist/checks/consolidated/ui-checks.d.ts +48 -0
  190. package/dist/checks/consolidated/ui-checks.d.ts.map +1 -0
  191. package/dist/checks/consolidated/ui-checks.js +264 -0
  192. package/dist/checks/consolidated/ui-checks.js.map +1 -0
  193. package/dist/checks/consolidated/ui-cleanup.d.ts +81 -0
  194. package/dist/checks/consolidated/ui-cleanup.d.ts.map +1 -0
  195. package/dist/checks/consolidated/ui-cleanup.js +650 -0
  196. package/dist/checks/consolidated/ui-cleanup.js.map +1 -0
  197. package/dist/checks/consolidated/ui-components.d.ts +255 -0
  198. package/dist/checks/consolidated/ui-components.d.ts.map +1 -0
  199. package/dist/checks/consolidated/ui-components.js +2008 -0
  200. package/dist/checks/consolidated/ui-components.js.map +1 -0
  201. package/dist/checks/consolidated/ui-consistency-advanced.d.ts +130 -0
  202. package/dist/checks/consolidated/ui-consistency-advanced.d.ts.map +1 -0
  203. package/dist/checks/consolidated/ui-consistency-advanced.js +982 -0
  204. package/dist/checks/consolidated/ui-consistency-advanced.js.map +1 -0
  205. package/dist/checks/consolidated/ui-consistency-comprehensive.d.ts +30 -0
  206. package/dist/checks/consolidated/ui-consistency-comprehensive.d.ts.map +1 -0
  207. package/dist/checks/consolidated/ui-consistency-comprehensive.js +1018 -0
  208. package/dist/checks/consolidated/ui-consistency-comprehensive.js.map +1 -0
  209. package/dist/checks/consolidated/ui-consistency-extended.d.ts +26 -0
  210. package/dist/checks/consolidated/ui-consistency-extended.d.ts.map +1 -0
  211. package/dist/checks/consolidated/ui-consistency-extended.js +606 -0
  212. package/dist/checks/consolidated/ui-consistency-extended.js.map +1 -0
  213. package/dist/checks/consolidated/ui-data-display.d.ts +103 -0
  214. package/dist/checks/consolidated/ui-data-display.d.ts.map +1 -0
  215. package/dist/checks/consolidated/ui-data-display.js +740 -0
  216. package/dist/checks/consolidated/ui-data-display.js.map +1 -0
  217. package/dist/checks/consolidated/ui-deprecated.d.ts +22 -0
  218. package/dist/checks/consolidated/ui-deprecated.d.ts.map +1 -0
  219. package/dist/checks/consolidated/ui-deprecated.js +336 -0
  220. package/dist/checks/consolidated/ui-deprecated.js.map +1 -0
  221. package/dist/checks/consolidated/ui-empty-null-states.d.ts +90 -0
  222. package/dist/checks/consolidated/ui-empty-null-states.d.ts.map +1 -0
  223. package/dist/checks/consolidated/ui-empty-null-states.js +511 -0
  224. package/dist/checks/consolidated/ui-empty-null-states.js.map +1 -0
  225. package/dist/checks/consolidated/ui-error-states.d.ts +99 -0
  226. package/dist/checks/consolidated/ui-error-states.d.ts.map +1 -0
  227. package/dist/checks/consolidated/ui-error-states.js +694 -0
  228. package/dist/checks/consolidated/ui-error-states.js.map +1 -0
  229. package/dist/checks/consolidated/ui-feedback-confirmations.d.ts +90 -0
  230. package/dist/checks/consolidated/ui-feedback-confirmations.d.ts.map +1 -0
  231. package/dist/checks/consolidated/ui-feedback-confirmations.js +596 -0
  232. package/dist/checks/consolidated/ui-feedback-confirmations.js.map +1 -0
  233. package/dist/checks/consolidated/ui-forms.d.ts +32 -0
  234. package/dist/checks/consolidated/ui-forms.d.ts.map +1 -0
  235. package/dist/checks/consolidated/ui-forms.js +568 -0
  236. package/dist/checks/consolidated/ui-forms.js.map +1 -0
  237. package/dist/checks/consolidated/ui-gradient-shadow.d.ts +90 -0
  238. package/dist/checks/consolidated/ui-gradient-shadow.d.ts.map +1 -0
  239. package/dist/checks/consolidated/ui-gradient-shadow.js +568 -0
  240. package/dist/checks/consolidated/ui-gradient-shadow.js.map +1 -0
  241. package/dist/checks/consolidated/ui-grid-responsive.d.ts +27 -0
  242. package/dist/checks/consolidated/ui-grid-responsive.d.ts.map +1 -0
  243. package/dist/checks/consolidated/ui-grid-responsive.js +441 -0
  244. package/dist/checks/consolidated/ui-grid-responsive.js.map +1 -0
  245. package/dist/checks/consolidated/ui-icon-size-tokens.d.ts +104 -0
  246. package/dist/checks/consolidated/ui-icon-size-tokens.d.ts.map +1 -0
  247. package/dist/checks/consolidated/ui-icon-size-tokens.js +514 -0
  248. package/dist/checks/consolidated/ui-icon-size-tokens.js.map +1 -0
  249. package/dist/checks/consolidated/ui-iconography.d.ts +90 -0
  250. package/dist/checks/consolidated/ui-iconography.d.ts.map +1 -0
  251. package/dist/checks/consolidated/ui-iconography.js +565 -0
  252. package/dist/checks/consolidated/ui-iconography.js.map +1 -0
  253. package/dist/checks/consolidated/ui-interactive-states.d.ts +240 -0
  254. package/dist/checks/consolidated/ui-interactive-states.d.ts.map +1 -0
  255. package/dist/checks/consolidated/ui-interactive-states.js +2474 -0
  256. package/dist/checks/consolidated/ui-interactive-states.js.map +1 -0
  257. package/dist/checks/consolidated/ui-layout.d.ts +256 -0
  258. package/dist/checks/consolidated/ui-layout.d.ts.map +1 -0
  259. package/dist/checks/consolidated/ui-layout.js +1371 -0
  260. package/dist/checks/consolidated/ui-layout.js.map +1 -0
  261. package/dist/checks/consolidated/ui-loading-skeletons.d.ts +11 -0
  262. package/dist/checks/consolidated/ui-loading-skeletons.d.ts.map +1 -0
  263. package/dist/checks/consolidated/ui-loading-skeletons.js +145 -0
  264. package/dist/checks/consolidated/ui-loading-skeletons.js.map +1 -0
  265. package/dist/checks/consolidated/ui-loading-state-skeletons.d.ts +9 -0
  266. package/dist/checks/consolidated/ui-loading-state-skeletons.d.ts.map +1 -0
  267. package/dist/checks/consolidated/ui-loading-state-skeletons.js +125 -0
  268. package/dist/checks/consolidated/ui-loading-state-skeletons.js.map +1 -0
  269. package/dist/checks/consolidated/ui-media.d.ts +74 -0
  270. package/dist/checks/consolidated/ui-media.d.ts.map +1 -0
  271. package/dist/checks/consolidated/ui-media.js +408 -0
  272. package/dist/checks/consolidated/ui-media.js.map +1 -0
  273. package/dist/checks/consolidated/ui-micro-interactions.d.ts +107 -0
  274. package/dist/checks/consolidated/ui-micro-interactions.d.ts.map +1 -0
  275. package/dist/checks/consolidated/ui-micro-interactions.js +825 -0
  276. package/dist/checks/consolidated/ui-micro-interactions.js.map +1 -0
  277. package/dist/checks/consolidated/ui-microcopy-consistency.d.ts +114 -0
  278. package/dist/checks/consolidated/ui-microcopy-consistency.d.ts.map +1 -0
  279. package/dist/checks/consolidated/ui-microcopy-consistency.js +566 -0
  280. package/dist/checks/consolidated/ui-microcopy-consistency.js.map +1 -0
  281. package/dist/checks/consolidated/ui-mobile-ux.d.ts +251 -0
  282. package/dist/checks/consolidated/ui-mobile-ux.d.ts.map +1 -0
  283. package/dist/checks/consolidated/ui-mobile-ux.js +2212 -0
  284. package/dist/checks/consolidated/ui-mobile-ux.js.map +1 -0
  285. package/dist/checks/consolidated/ui-motion-accessibility.d.ts +93 -0
  286. package/dist/checks/consolidated/ui-motion-accessibility.d.ts.map +1 -0
  287. package/dist/checks/consolidated/ui-motion-accessibility.js +450 -0
  288. package/dist/checks/consolidated/ui-motion-accessibility.js.map +1 -0
  289. package/dist/checks/consolidated/ui-navigation.d.ts +85 -0
  290. package/dist/checks/consolidated/ui-navigation.d.ts.map +1 -0
  291. package/dist/checks/consolidated/ui-navigation.js +673 -0
  292. package/dist/checks/consolidated/ui-navigation.js.map +1 -0
  293. package/dist/checks/consolidated/ui-patterns.d.ts +174 -0
  294. package/dist/checks/consolidated/ui-patterns.d.ts.map +1 -0
  295. package/dist/checks/consolidated/ui-patterns.js +1532 -0
  296. package/dist/checks/consolidated/ui-patterns.js.map +1 -0
  297. package/dist/checks/consolidated/ui-responsive.d.ts +89 -0
  298. package/dist/checks/consolidated/ui-responsive.d.ts.map +1 -0
  299. package/dist/checks/consolidated/ui-responsive.js +588 -0
  300. package/dist/checks/consolidated/ui-responsive.js.map +1 -0
  301. package/dist/checks/consolidated/ui-spacing-standards.d.ts +43 -0
  302. package/dist/checks/consolidated/ui-spacing-standards.d.ts.map +1 -0
  303. package/dist/checks/consolidated/ui-spacing-standards.js +874 -0
  304. package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -0
  305. package/dist/checks/consolidated/ui-spacing.d.ts +751 -0
  306. package/dist/checks/consolidated/ui-spacing.d.ts.map +1 -0
  307. package/dist/checks/consolidated/ui-spacing.js +4996 -0
  308. package/dist/checks/consolidated/ui-spacing.js.map +1 -0
  309. package/dist/checks/consolidated/ui-standards-auto-fixer.d.ts +70 -0
  310. package/dist/checks/consolidated/ui-standards-auto-fixer.d.ts.map +1 -0
  311. package/dist/checks/consolidated/ui-standards-auto-fixer.js +429 -0
  312. package/dist/checks/consolidated/ui-standards-auto-fixer.js.map +1 -0
  313. package/dist/checks/consolidated/ui-standards-enforcement.d.ts +100 -0
  314. package/dist/checks/consolidated/ui-standards-enforcement.d.ts.map +1 -0
  315. package/dist/checks/consolidated/ui-standards-enforcement.js +935 -0
  316. package/dist/checks/consolidated/ui-standards-enforcement.js.map +1 -0
  317. package/dist/checks/consolidated/ui-state-consistency.d.ts +90 -0
  318. package/dist/checks/consolidated/ui-state-consistency.d.ts.map +1 -0
  319. package/dist/checks/consolidated/ui-state-consistency.js +659 -0
  320. package/dist/checks/consolidated/ui-state-consistency.js.map +1 -0
  321. package/dist/checks/consolidated/ui-style-validation.d.ts +74 -0
  322. package/dist/checks/consolidated/ui-style-validation.d.ts.map +1 -0
  323. package/dist/checks/consolidated/ui-style-validation.js +403 -0
  324. package/dist/checks/consolidated/ui-style-validation.js.map +1 -0
  325. package/dist/checks/consolidated/ui-tokens.d.ts +110 -0
  326. package/dist/checks/consolidated/ui-tokens.d.ts.map +1 -0
  327. package/dist/checks/consolidated/ui-tokens.js +990 -0
  328. package/dist/checks/consolidated/ui-tokens.js.map +1 -0
  329. package/dist/checks/consolidated/ui-typography.d.ts +77 -0
  330. package/dist/checks/consolidated/ui-typography.d.ts.map +1 -0
  331. package/dist/checks/consolidated/ui-typography.js +416 -0
  332. package/dist/checks/consolidated/ui-typography.js.map +1 -0
  333. package/dist/checks/consolidated/ui-visual-hierarchy.d.ts +90 -0
  334. package/dist/checks/consolidated/ui-visual-hierarchy.d.ts.map +1 -0
  335. package/dist/checks/consolidated/ui-visual-hierarchy.js +562 -0
  336. package/dist/checks/consolidated/ui-visual-hierarchy.js.map +1 -0
  337. package/dist/checks/consolidated/woocommerce.d.ts +50 -0
  338. package/dist/checks/consolidated/woocommerce.d.ts.map +1 -0
  339. package/dist/checks/consolidated/woocommerce.js +198 -0
  340. package/dist/checks/consolidated/woocommerce.js.map +1 -0
  341. package/dist/checks/core/api-route-protection.d.ts +2 -0
  342. package/dist/checks/core/api-route-protection.d.ts.map +1 -0
  343. package/dist/checks/core/api-route-protection.js +101 -0
  344. package/dist/checks/core/api-route-protection.js.map +1 -0
  345. package/dist/checks/core/critical.d.ts +8 -0
  346. package/dist/checks/core/critical.d.ts.map +1 -0
  347. package/dist/checks/core/critical.js +200 -0
  348. package/dist/checks/core/critical.js.map +1 -0
  349. package/dist/checks/core/database.d.ts +8 -0
  350. package/dist/checks/core/database.d.ts.map +1 -0
  351. package/dist/checks/core/database.js +699 -0
  352. package/dist/checks/core/database.js.map +1 -0
  353. package/dist/checks/core/development.d.ts +8 -0
  354. package/dist/checks/core/development.d.ts.map +1 -0
  355. package/dist/checks/core/development.js +417 -0
  356. package/dist/checks/core/development.js.map +1 -0
  357. package/dist/checks/core/hydration-mismatch-check.d.ts +38 -0
  358. package/dist/checks/core/hydration-mismatch-check.d.ts.map +1 -0
  359. package/dist/checks/core/hydration-mismatch-check.js +411 -0
  360. package/dist/checks/core/hydration-mismatch-check.js.map +1 -0
  361. package/dist/checks/core/performance.d.ts +8 -0
  362. package/dist/checks/core/performance.d.ts.map +1 -0
  363. package/dist/checks/core/performance.js +474 -0
  364. package/dist/checks/core/performance.js.map +1 -0
  365. package/dist/checks/core/security.d.ts +8 -0
  366. package/dist/checks/core/security.d.ts.map +1 -0
  367. package/dist/checks/core/security.js +275 -0
  368. package/dist/checks/core/security.js.map +1 -0
  369. package/dist/checks/core/standardized-error-handling.d.ts +43 -0
  370. package/dist/checks/core/standardized-error-handling.d.ts.map +1 -0
  371. package/dist/checks/core/standardized-error-handling.js +384 -0
  372. package/dist/checks/core/standardized-error-handling.js.map +1 -0
  373. package/dist/checks/core/supercatch.d.ts +8 -0
  374. package/dist/checks/core/supercatch.d.ts.map +1 -0
  375. package/dist/checks/core/supercatch.js +750 -0
  376. package/dist/checks/core/supercatch.js.map +1 -0
  377. package/dist/checks/core/suppression-check.d.ts +2 -0
  378. package/dist/checks/core/suppression-check.d.ts.map +1 -0
  379. package/dist/checks/core/suppression-check.js +129 -0
  380. package/dist/checks/core/suppression-check.js.map +1 -0
  381. package/dist/checks/core/ui-quality.d.ts +8 -0
  382. package/dist/checks/core/ui-quality.d.ts.map +1 -0
  383. package/dist/checks/core/ui-quality.js +1736 -0
  384. package/dist/checks/core/ui-quality.js.map +1 -0
  385. package/dist/checks/core/unused-assets-check.d.ts +2 -0
  386. package/dist/checks/core/unused-assets-check.d.ts.map +1 -0
  387. package/dist/checks/core/unused-assets-check.js +112 -0
  388. package/dist/checks/core/unused-assets-check.js.map +1 -0
  389. package/dist/checks/core/use-status-ssr-safety.d.ts +34 -0
  390. package/dist/checks/core/use-status-ssr-safety.d.ts.map +1 -0
  391. package/dist/checks/core/use-status-ssr-safety.js +283 -0
  392. package/dist/checks/core/use-status-ssr-safety.js.map +1 -0
  393. package/dist/checks/email/email-flow-validation.d.ts +23 -0
  394. package/dist/checks/email/email-flow-validation.d.ts.map +1 -0
  395. package/dist/checks/email/email-flow-validation.js +468 -0
  396. package/dist/checks/email/email-flow-validation.js.map +1 -0
  397. package/dist/checks/email/email-template-db-verification.d.ts +20 -0
  398. package/dist/checks/email/email-template-db-verification.d.ts.map +1 -0
  399. package/dist/checks/email/email-template-db-verification.js +46 -0
  400. package/dist/checks/email/email-template-db-verification.js.map +1 -0
  401. package/dist/checks/email/email-template-validation.d.ts +24 -0
  402. package/dist/checks/email/email-template-validation.d.ts.map +1 -0
  403. package/dist/checks/email/email-template-validation.js +688 -0
  404. package/dist/checks/email/email-template-validation.js.map +1 -0
  405. package/dist/checks/jsx/comment-placement.d.ts +45 -0
  406. package/dist/checks/jsx/comment-placement.d.ts.map +1 -0
  407. package/dist/checks/jsx/comment-placement.js +316 -0
  408. package/dist/checks/jsx/comment-placement.js.map +1 -0
  409. package/dist/checks/specialized/admin-layout-check.d.ts +19 -0
  410. package/dist/checks/specialized/admin-layout-check.d.ts.map +1 -0
  411. package/dist/checks/specialized/admin-layout-check.js +166 -0
  412. package/dist/checks/specialized/admin-layout-check.js.map +1 -0
  413. package/dist/checks/specialized/client-server-separation.d.ts +14 -0
  414. package/dist/checks/specialized/client-server-separation.d.ts.map +1 -0
  415. package/dist/checks/specialized/client-server-separation.js +197 -0
  416. package/dist/checks/specialized/client-server-separation.js.map +1 -0
  417. package/dist/checks/specialized/cost-optimization.d.ts +18 -0
  418. package/dist/checks/specialized/cost-optimization.d.ts.map +1 -0
  419. package/dist/checks/specialized/cost-optimization.js +78 -0
  420. package/dist/checks/specialized/cost-optimization.js.map +1 -0
  421. package/dist/checks/specialized/database-migration-sync.d.ts +21 -0
  422. package/dist/checks/specialized/database-migration-sync.d.ts.map +1 -0
  423. package/dist/checks/specialized/database-migration-sync.js +150 -0
  424. package/dist/checks/specialized/database-migration-sync.js.map +1 -0
  425. package/dist/checks/specialized/database-model-validation.d.ts +15 -0
  426. package/dist/checks/specialized/database-model-validation.d.ts.map +1 -0
  427. package/dist/checks/specialized/database-model-validation.js +35 -0
  428. package/dist/checks/specialized/database-model-validation.js.map +1 -0
  429. package/dist/checks/specialized/database-schema-migrations-diff.d.ts +27 -0
  430. package/dist/checks/specialized/database-schema-migrations-diff.d.ts.map +1 -0
  431. package/dist/checks/specialized/database-schema-migrations-diff.js +177 -0
  432. package/dist/checks/specialized/database-schema-migrations-diff.js.map +1 -0
  433. package/dist/checks/specialized/database-schema-sync.d.ts +23 -0
  434. package/dist/checks/specialized/database-schema-sync.d.ts.map +1 -0
  435. package/dist/checks/specialized/database-schema-sync.js +77 -0
  436. package/dist/checks/specialized/database-schema-sync.js.map +1 -0
  437. package/dist/checks/specialized/decimal-serialization.d.ts +24 -0
  438. package/dist/checks/specialized/decimal-serialization.d.ts.map +1 -0
  439. package/dist/checks/specialized/decimal-serialization.js +400 -0
  440. package/dist/checks/specialized/decimal-serialization.js.map +1 -0
  441. package/dist/checks/specialized/detect-router-issues.d.ts +14 -0
  442. package/dist/checks/specialized/detect-router-issues.d.ts.map +1 -0
  443. package/dist/checks/specialized/detect-router-issues.js +96 -0
  444. package/dist/checks/specialized/detect-router-issues.js.map +1 -0
  445. package/dist/checks/specialized/enum-validation.d.ts +15 -0
  446. package/dist/checks/specialized/enum-validation.d.ts.map +1 -0
  447. package/dist/checks/specialized/enum-validation.js +35 -0
  448. package/dist/checks/specialized/enum-validation.js.map +1 -0
  449. package/dist/checks/specialized/hash-collision.d.ts +18 -0
  450. package/dist/checks/specialized/hash-collision.d.ts.map +1 -0
  451. package/dist/checks/specialized/hash-collision.js +78 -0
  452. package/dist/checks/specialized/hash-collision.js.map +1 -0
  453. package/dist/checks/specialized/id-generation-enforcement.d.ts +16 -0
  454. package/dist/checks/specialized/id-generation-enforcement.d.ts.map +1 -0
  455. package/dist/checks/specialized/id-generation-enforcement.js +307 -0
  456. package/dist/checks/specialized/id-generation-enforcement.js.map +1 -0
  457. package/dist/checks/specialized/image-data-integrity.d.ts +15 -0
  458. package/dist/checks/specialized/image-data-integrity.d.ts.map +1 -0
  459. package/dist/checks/specialized/image-data-integrity.js +79 -0
  460. package/dist/checks/specialized/image-data-integrity.js.map +1 -0
  461. package/dist/checks/specialized/image-health.d.ts +14 -0
  462. package/dist/checks/specialized/image-health.d.ts.map +1 -0
  463. package/dist/checks/specialized/image-health.js +122 -0
  464. package/dist/checks/specialized/image-health.js.map +1 -0
  465. package/dist/checks/specialized/image-metadata-validation.d.ts +14 -0
  466. package/dist/checks/specialized/image-metadata-validation.d.ts.map +1 -0
  467. package/dist/checks/specialized/image-metadata-validation.js +95 -0
  468. package/dist/checks/specialized/image-metadata-validation.js.map +1 -0
  469. package/dist/checks/specialized/image-optimization.d.ts +16 -0
  470. package/dist/checks/specialized/image-optimization.d.ts.map +1 -0
  471. package/dist/checks/specialized/image-optimization.js +86 -0
  472. package/dist/checks/specialized/image-optimization.js.map +1 -0
  473. package/dist/checks/specialized/invalid-module-imports.d.ts +24 -0
  474. package/dist/checks/specialized/invalid-module-imports.d.ts.map +1 -0
  475. package/dist/checks/specialized/invalid-module-imports.js +209 -0
  476. package/dist/checks/specialized/invalid-module-imports.js.map +1 -0
  477. package/dist/checks/specialized/lint-validation.d.ts +26 -0
  478. package/dist/checks/specialized/lint-validation.d.ts.map +1 -0
  479. package/dist/checks/specialized/lint-validation.js +193 -0
  480. package/dist/checks/specialized/lint-validation.js.map +1 -0
  481. package/dist/checks/specialized/listing-workflow.d.ts +19 -0
  482. package/dist/checks/specialized/listing-workflow.d.ts.map +1 -0
  483. package/dist/checks/specialized/listing-workflow.js +89 -0
  484. package/dist/checks/specialized/listing-workflow.js.map +1 -0
  485. package/dist/checks/specialized/mui-imports-validation.d.ts +18 -0
  486. package/dist/checks/specialized/mui-imports-validation.d.ts.map +1 -0
  487. package/dist/checks/specialized/mui-imports-validation.js +134 -0
  488. package/dist/checks/specialized/mui-imports-validation.js.map +1 -0
  489. package/dist/checks/specialized/nextauth-v5-compliance.d.ts +16 -0
  490. package/dist/checks/specialized/nextauth-v5-compliance.d.ts.map +1 -0
  491. package/dist/checks/specialized/nextauth-v5-compliance.js +164 -0
  492. package/dist/checks/specialized/nextauth-v5-compliance.js.map +1 -0
  493. package/dist/checks/specialized/nextjs-params-check.d.ts +14 -0
  494. package/dist/checks/specialized/nextjs-params-check.d.ts.map +1 -0
  495. package/dist/checks/specialized/nextjs-params-check.js +140 -0
  496. package/dist/checks/specialized/nextjs-params-check.js.map +1 -0
  497. package/dist/checks/specialized/no-legacy-catalog-aliases-validation.d.ts +16 -0
  498. package/dist/checks/specialized/no-legacy-catalog-aliases-validation.d.ts.map +1 -0
  499. package/dist/checks/specialized/no-legacy-catalog-aliases-validation.js +36 -0
  500. package/dist/checks/specialized/no-legacy-catalog-aliases-validation.js.map +1 -0
  501. package/dist/checks/specialized/no-wata-cardgraded-validation.d.ts +22 -0
  502. package/dist/checks/specialized/no-wata-cardgraded-validation.d.ts.map +1 -0
  503. package/dist/checks/specialized/no-wata-cardgraded-validation.js +97 -0
  504. package/dist/checks/specialized/no-wata-cardgraded-validation.js.map +1 -0
  505. package/dist/checks/specialized/parameter-consistency-check.d.ts +20 -0
  506. package/dist/checks/specialized/parameter-consistency-check.d.ts.map +1 -0
  507. package/dist/checks/specialized/parameter-consistency-check.js +115 -0
  508. package/dist/checks/specialized/parameter-consistency-check.js.map +1 -0
  509. package/dist/checks/specialized/prisma-field-names-validation.d.ts +15 -0
  510. package/dist/checks/specialized/prisma-field-names-validation.d.ts.map +1 -0
  511. package/dist/checks/specialized/prisma-field-names-validation.js +35 -0
  512. package/dist/checks/specialized/prisma-field-names-validation.js.map +1 -0
  513. package/dist/checks/specialized/prisma-null-syntax.d.ts +34 -0
  514. package/dist/checks/specialized/prisma-null-syntax.d.ts.map +1 -0
  515. package/dist/checks/specialized/prisma-null-syntax.js +330 -0
  516. package/dist/checks/specialized/prisma-null-syntax.js.map +1 -0
  517. package/dist/checks/specialized/prisma-query-validation.d.ts +15 -0
  518. package/dist/checks/specialized/prisma-query-validation.d.ts.map +1 -0
  519. package/dist/checks/specialized/prisma-query-validation.js +35 -0
  520. package/dist/checks/specialized/prisma-query-validation.js.map +1 -0
  521. package/dist/checks/specialized/product-type-validation.d.ts +17 -0
  522. package/dist/checks/specialized/product-type-validation.d.ts.map +1 -0
  523. package/dist/checks/specialized/product-type-validation.js +129 -0
  524. package/dist/checks/specialized/product-type-validation.js.map +1 -0
  525. package/dist/checks/specialized/responsive-image-validation.d.ts +14 -0
  526. package/dist/checks/specialized/responsive-image-validation.d.ts.map +1 -0
  527. package/dist/checks/specialized/responsive-image-validation.js +101 -0
  528. package/dist/checks/specialized/responsive-image-validation.js.map +1 -0
  529. package/dist/checks/specialized/root-cleanliness.d.ts +21 -0
  530. package/dist/checks/specialized/root-cleanliness.d.ts.map +1 -0
  531. package/dist/checks/specialized/root-cleanliness.js +251 -0
  532. package/dist/checks/specialized/root-cleanliness.js.map +1 -0
  533. package/dist/checks/specialized/rotation-detection-validation.d.ts +16 -0
  534. package/dist/checks/specialized/rotation-detection-validation.d.ts.map +1 -0
  535. package/dist/checks/specialized/rotation-detection-validation.js +113 -0
  536. package/dist/checks/specialized/rotation-detection-validation.js.map +1 -0
  537. package/dist/checks/specialized/script-organization.d.ts +17 -0
  538. package/dist/checks/specialized/script-organization.d.ts.map +1 -0
  539. package/dist/checks/specialized/script-organization.js +487 -0
  540. package/dist/checks/specialized/script-organization.js.map +1 -0
  541. package/dist/checks/specialized/shared-components-migration.d.ts +137 -0
  542. package/dist/checks/specialized/shared-components-migration.d.ts.map +1 -0
  543. package/dist/checks/specialized/shared-components-migration.js +1288 -0
  544. package/dist/checks/specialized/shared-components-migration.js.map +1 -0
  545. package/dist/checks/specialized/store-specialties-normalization.d.ts +10 -0
  546. package/dist/checks/specialized/store-specialties-normalization.d.ts.map +1 -0
  547. package/dist/checks/specialized/store-specialties-normalization.js +126 -0
  548. package/dist/checks/specialized/store-specialties-normalization.js.map +1 -0
  549. package/dist/checks/specialized/two-stage-trim-validation.d.ts +16 -0
  550. package/dist/checks/specialized/two-stage-trim-validation.d.ts.map +1 -0
  551. package/dist/checks/specialized/two-stage-trim-validation.js +115 -0
  552. package/dist/checks/specialized/two-stage-trim-validation.js.map +1 -0
  553. package/dist/checks/specialized/underscore-variable-audit.d.ts +26 -0
  554. package/dist/checks/specialized/underscore-variable-audit.d.ts.map +1 -0
  555. package/dist/checks/specialized/underscore-variable-audit.js +219 -0
  556. package/dist/checks/specialized/underscore-variable-audit.js.map +1 -0
  557. package/dist/checks/specialized/unified-badge-consistency.d.ts +16 -0
  558. package/dist/checks/specialized/unified-badge-consistency.d.ts.map +1 -0
  559. package/dist/checks/specialized/unified-badge-consistency.js +284 -0
  560. package/dist/checks/specialized/unified-badge-consistency.js.map +1 -0
  561. package/dist/checks/specialized/validate-integration-enums.d.ts +15 -0
  562. package/dist/checks/specialized/validate-integration-enums.d.ts.map +1 -0
  563. package/dist/checks/specialized/validate-integration-enums.js +131 -0
  564. package/dist/checks/specialized/validate-integration-enums.js.map +1 -0
  565. package/dist/checks/testing/action-regression.d.ts +23 -0
  566. package/dist/checks/testing/action-regression.d.ts.map +1 -0
  567. package/dist/checks/testing/action-regression.js +192 -0
  568. package/dist/checks/testing/action-regression.js.map +1 -0
  569. package/dist/checks/testing/critical-api-coverage.d.ts +21 -0
  570. package/dist/checks/testing/critical-api-coverage.d.ts.map +1 -0
  571. package/dist/checks/testing/critical-api-coverage.js +158 -0
  572. package/dist/checks/testing/critical-api-coverage.js.map +1 -0
  573. package/dist/checks/testing/data-entry-regression-required.d.ts +24 -0
  574. package/dist/checks/testing/data-entry-regression-required.d.ts.map +1 -0
  575. package/dist/checks/testing/data-entry-regression-required.js +378 -0
  576. package/dist/checks/testing/data-entry-regression-required.js.map +1 -0
  577. package/dist/checks/testing/e2e-best-practices.d.ts +24 -0
  578. package/dist/checks/testing/e2e-best-practices.d.ts.map +1 -0
  579. package/dist/checks/testing/e2e-best-practices.js +791 -0
  580. package/dist/checks/testing/e2e-best-practices.js.map +1 -0
  581. package/dist/checks/testing/e2e-flake-patterns.d.ts +26 -0
  582. package/dist/checks/testing/e2e-flake-patterns.d.ts.map +1 -0
  583. package/dist/checks/testing/e2e-flake-patterns.js +305 -0
  584. package/dist/checks/testing/e2e-flake-patterns.js.map +1 -0
  585. package/dist/checks/testing/e2e-redundant-visibility-checks.d.ts +25 -0
  586. package/dist/checks/testing/e2e-redundant-visibility-checks.d.ts.map +1 -0
  587. package/dist/checks/testing/e2e-redundant-visibility-checks.js +613 -0
  588. package/dist/checks/testing/e2e-redundant-visibility-checks.js.map +1 -0
  589. package/dist/checks/testing/e2e-slow-tests.d.ts +9 -0
  590. package/dist/checks/testing/e2e-slow-tests.d.ts.map +1 -0
  591. package/dist/checks/testing/e2e-slow-tests.js +142 -0
  592. package/dist/checks/testing/e2e-slow-tests.js.map +1 -0
  593. package/dist/checks/testing/e2e-timeouts.d.ts +9 -0
  594. package/dist/checks/testing/e2e-timeouts.d.ts.map +1 -0
  595. package/dist/checks/testing/e2e-timeouts.js +82 -0
  596. package/dist/checks/testing/e2e-timeouts.js.map +1 -0
  597. package/dist/checks/testing/integration-e2e-depth.d.ts +20 -0
  598. package/dist/checks/testing/integration-e2e-depth.d.ts.map +1 -0
  599. package/dist/checks/testing/integration-e2e-depth.js +575 -0
  600. package/dist/checks/testing/integration-e2e-depth.js.map +1 -0
  601. package/dist/checks/testing/playwright-feature-coverage-gaps.d.ts +31 -0
  602. package/dist/checks/testing/playwright-feature-coverage-gaps.d.ts.map +1 -0
  603. package/dist/checks/testing/playwright-feature-coverage-gaps.js +1582 -0
  604. package/dist/checks/testing/playwright-feature-coverage-gaps.js.map +1 -0
  605. package/dist/checks/testing/playwright-mock-inventory.d.ts +24 -0
  606. package/dist/checks/testing/playwright-mock-inventory.d.ts.map +1 -0
  607. package/dist/checks/testing/playwright-mock-inventory.js +380 -0
  608. package/dist/checks/testing/playwright-mock-inventory.js.map +1 -0
  609. package/dist/checks/testing/test-coverage-threshold.d.ts +25 -0
  610. package/dist/checks/testing/test-coverage-threshold.d.ts.map +1 -0
  611. package/dist/checks/testing/test-coverage-threshold.js +166 -0
  612. package/dist/checks/testing/test-coverage-threshold.js.map +1 -0
  613. package/dist/checks/testing/test-flakiness-score.d.ts +27 -0
  614. package/dist/checks/testing/test-flakiness-score.d.ts.map +1 -0
  615. package/dist/checks/testing/test-flakiness-score.js +358 -0
  616. package/dist/checks/testing/test-flakiness-score.js.map +1 -0
  617. package/dist/checks/testing/test-patterns.d.ts +16 -0
  618. package/dist/checks/testing/test-patterns.d.ts.map +1 -0
  619. package/dist/checks/testing/test-patterns.js +156 -0
  620. package/dist/checks/testing/test-patterns.js.map +1 -0
  621. package/dist/checks/workflows/a-plus-rating-validation.d.ts +42 -0
  622. package/dist/checks/workflows/a-plus-rating-validation.d.ts.map +1 -0
  623. package/dist/checks/workflows/a-plus-rating-validation.js +527 -0
  624. package/dist/checks/workflows/a-plus-rating-validation.js.map +1 -0
  625. package/dist/checks/workflows/affected.d.ts +14 -0
  626. package/dist/checks/workflows/affected.d.ts.map +1 -0
  627. package/dist/checks/workflows/affected.js +126 -0
  628. package/dist/checks/workflows/affected.js.map +1 -0
  629. package/dist/checks/workflows/ai.d.ts +6 -0
  630. package/dist/checks/workflows/ai.d.ts.map +1 -0
  631. package/dist/checks/workflows/ai.js +42 -0
  632. package/dist/checks/workflows/ai.js.map +1 -0
  633. package/dist/checks/workflows/all.d.ts +31 -0
  634. package/dist/checks/workflows/all.d.ts.map +1 -0
  635. package/dist/checks/workflows/all.js +2688 -0
  636. package/dist/checks/workflows/all.js.map +1 -0
  637. package/dist/checks/workflows/commit.d.ts +19 -0
  638. package/dist/checks/workflows/commit.d.ts.map +1 -0
  639. package/dist/checks/workflows/commit.js +207 -0
  640. package/dist/checks/workflows/commit.js.map +1 -0
  641. package/dist/checks/workflows/critical.d.ts +9 -0
  642. package/dist/checks/workflows/critical.d.ts.map +1 -0
  643. package/dist/checks/workflows/critical.js +213 -0
  644. package/dist/checks/workflows/critical.js.map +1 -0
  645. package/dist/checks/workflows/database-id-validation.d.ts +9 -0
  646. package/dist/checks/workflows/database-id-validation.d.ts.map +1 -0
  647. package/dist/checks/workflows/database-id-validation.js +13 -0
  648. package/dist/checks/workflows/database-id-validation.js.map +1 -0
  649. package/dist/checks/workflows/deploy.d.ts +20 -0
  650. package/dist/checks/workflows/deploy.d.ts.map +1 -0
  651. package/dist/checks/workflows/deploy.js +107 -0
  652. package/dist/checks/workflows/deploy.js.map +1 -0
  653. package/dist/checks/workflows/deployment-readiness.d.ts +12 -0
  654. package/dist/checks/workflows/deployment-readiness.d.ts.map +1 -0
  655. package/dist/checks/workflows/deployment-readiness.js +403 -0
  656. package/dist/checks/workflows/deployment-readiness.js.map +1 -0
  657. package/dist/checks/workflows/dev.d.ts +19 -0
  658. package/dist/checks/workflows/dev.d.ts.map +1 -0
  659. package/dist/checks/workflows/dev.js +88 -0
  660. package/dist/checks/workflows/dev.js.map +1 -0
  661. package/dist/checks/workflows/development.d.ts +9 -0
  662. package/dist/checks/workflows/development.d.ts.map +1 -0
  663. package/dist/checks/workflows/development.js +65 -0
  664. package/dist/checks/workflows/development.js.map +1 -0
  665. package/dist/checks/workflows/enterprise.d.ts +10 -0
  666. package/dist/checks/workflows/enterprise.d.ts.map +1 -0
  667. package/dist/checks/workflows/enterprise.js +359 -0
  668. package/dist/checks/workflows/enterprise.js.map +1 -0
  669. package/dist/checks/workflows/images.d.ts +6 -0
  670. package/dist/checks/workflows/images.d.ts.map +1 -0
  671. package/dist/checks/workflows/images.js +58 -0
  672. package/dist/checks/workflows/images.js.map +1 -0
  673. package/dist/checks/workflows/naming.d.ts +19 -0
  674. package/dist/checks/workflows/naming.d.ts.map +1 -0
  675. package/dist/checks/workflows/naming.js +42 -0
  676. package/dist/checks/workflows/naming.js.map +1 -0
  677. package/dist/checks/workflows/performance.d.ts +8 -0
  678. package/dist/checks/workflows/performance.d.ts.map +1 -0
  679. package/dist/checks/workflows/performance.js +77 -0
  680. package/dist/checks/workflows/performance.js.map +1 -0
  681. package/dist/checks/workflows/pre-deploy.d.ts +6 -0
  682. package/dist/checks/workflows/pre-deploy.d.ts.map +1 -0
  683. package/dist/checks/workflows/pre-deploy.js +41 -0
  684. package/dist/checks/workflows/pre-deploy.js.map +1 -0
  685. package/dist/checks/workflows/security.d.ts +8 -0
  686. package/dist/checks/workflows/security.d.ts.map +1 -0
  687. package/dist/checks/workflows/security.js +71 -0
  688. package/dist/checks/workflows/security.js.map +1 -0
  689. package/dist/checks/workflows/supercatch.d.ts +8 -0
  690. package/dist/checks/workflows/supercatch.d.ts.map +1 -0
  691. package/dist/checks/workflows/supercatch.js +127 -0
  692. package/dist/checks/workflows/supercatch.js.map +1 -0
  693. package/dist/checks/workflows/ui-quality.d.ts +9 -0
  694. package/dist/checks/workflows/ui-quality.d.ts.map +1 -0
  695. package/dist/checks/workflows/ui-quality.js +264 -0
  696. package/dist/checks/workflows/ui-quality.js.map +1 -0
  697. package/dist/checks/workflows/ui-uniformity.d.ts +18 -0
  698. package/dist/checks/workflows/ui-uniformity.d.ts.map +1 -0
  699. package/dist/checks/workflows/ui-uniformity.js +265 -0
  700. package/dist/checks/workflows/ui-uniformity.js.map +1 -0
  701. package/dist/checks/workflows/vercel.d.ts +16 -0
  702. package/dist/checks/workflows/vercel.d.ts.map +1 -0
  703. package/dist/checks/workflows/vercel.js +173 -0
  704. package/dist/checks/workflows/vercel.js.map +1 -0
  705. package/dist/utils/validation-helpers.d.ts +43 -0
  706. package/dist/utils/validation-helpers.d.ts.map +1 -0
  707. package/dist/utils/validation-helpers.js +370 -0
  708. package/dist/utils/validation-helpers.js.map +1 -0
  709. 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