@jmruthers/pace-core 0.6.6 → 0.6.8

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 (292) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +240 -0
  4. package/audit-tool/audits/03-architecture.cjs +224 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +554 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +355 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +295 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +380 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-6RMSCQJ6.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
  28. package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
  29. package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
  30. package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
  31. package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
  32. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  33. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  34. package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
  35. package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
  36. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  37. package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
  38. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  39. package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
  40. package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
  41. package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
  42. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  43. package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
  44. package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
  45. package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
  46. package/dist/components.d.ts +5 -4
  47. package/dist/components.js +29 -34
  48. package/dist/eslint-rules/index.cjs +22 -9
  49. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  50. package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
  51. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  52. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
  53. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
  54. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  55. package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
  56. package/dist/hooks.d.ts +5 -5
  57. package/dist/hooks.js +8 -8
  58. package/dist/index.d.ts +7 -7
  59. package/dist/index.js +21 -20
  60. package/dist/providers.js +2 -2
  61. package/dist/rbac/index.d.ts +1 -1
  62. package/dist/rbac/index.js +8 -8
  63. package/dist/theming/runtime.d.ts +61 -1
  64. package/dist/theming/runtime.js +1 -1
  65. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  66. package/dist/types.d.ts +2 -2
  67. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  68. package/dist/utils.d.ts +2 -2
  69. package/dist/utils.js +8 -8
  70. package/docs/README.md +1 -1
  71. package/docs/api/modules.md +106 -41
  72. package/docs/api-reference/components.md +18 -20
  73. package/docs/api-reference/hooks.md +80 -80
  74. package/docs/api-reference/types.md +1 -1
  75. package/docs/api-reference/utilities.md +1 -1
  76. package/docs/architecture/README.md +1 -1
  77. package/docs/core-concepts/events.md +3 -3
  78. package/docs/core-concepts/organisations.md +6 -6
  79. package/docs/core-concepts/permissions.md +6 -6
  80. package/docs/documentation-index.md +12 -18
  81. package/docs/getting-started/dependencies.md +23 -0
  82. package/docs/getting-started/documentation-index.md +1 -1
  83. package/docs/getting-started/examples/README.md +4 -4
  84. package/docs/getting-started/examples/full-featured-app.md +1 -1
  85. package/docs/getting-started/faq.md +2 -2
  86. package/docs/getting-started/quick-reference.md +4 -4
  87. package/docs/implementation-guides/app-layout.md +1 -1
  88. package/docs/implementation-guides/authentication.md +15 -15
  89. package/docs/implementation-guides/component-styling.md +1 -1
  90. package/docs/implementation-guides/data-tables.md +127 -34
  91. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  92. package/docs/implementation-guides/dynamic-colors.md +3 -3
  93. package/docs/implementation-guides/file-upload-storage.md +2 -2
  94. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  95. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  96. package/docs/implementation-guides/large-datasets.md +3 -2
  97. package/docs/implementation-guides/organisation-security.md +2 -2
  98. package/docs/implementation-guides/performance.md +2 -2
  99. package/docs/implementation-guides/permission-enforcement.md +1 -1
  100. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  101. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  102. package/docs/rbac/README.md +5 -5
  103. package/docs/rbac/advanced-patterns.md +6 -6
  104. package/docs/rbac/api-reference.md +20 -20
  105. package/docs/rbac/event-based-apps.md +3 -3
  106. package/docs/rbac/examples.md +41 -41
  107. package/docs/rbac/getting-started.md +37 -37
  108. package/docs/rbac/performance.md +1 -1
  109. package/docs/rbac/quick-start.md +52 -52
  110. package/docs/rbac/secure-client-protection.md +1 -1
  111. package/docs/rbac/troubleshooting.md +1 -1
  112. package/docs/security/README.md +5 -5
  113. package/docs/standards/0-standards-overview.md +220 -0
  114. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
  115. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  116. package/docs/standards/3-architecture-standards.md +606 -0
  117. package/docs/standards/4-code-quality-standards.md +728 -0
  118. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  119. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  120. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  121. package/docs/standards/8-testing-documentation-standards.md +401 -0
  122. package/docs/standards/9-operations-standards.md +1102 -0
  123. package/docs/standards/README.md +203 -104
  124. package/docs/troubleshooting/README.md +4 -4
  125. package/docs/troubleshooting/common-issues.md +2 -2
  126. package/docs/troubleshooting/debugging.md +9 -9
  127. package/docs/troubleshooting/migration.md +4 -4
  128. package/eslint-config-pace-core.cjs +50 -20
  129. package/package.json +50 -19
  130. package/scripts/eslint-audit.cjs +123 -0
  131. package/scripts/install-cursor-rules.cjs +11 -243
  132. package/scripts/install-eslint-config.cjs +349 -0
  133. package/scripts/validate-dependencies.cjs +248 -0
  134. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  135. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  136. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
  137. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  138. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  139. package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
  140. package/src/__tests__/templates/component.test.template.tsx +18 -15
  141. package/src/components/AddressField/AddressField.tsx +26 -1
  142. package/src/components/Alert/Alert.test.tsx +86 -22
  143. package/src/components/Alert/Alert.tsx +19 -11
  144. package/src/components/Badge/Badge.tsx +1 -1
  145. package/src/components/Calendar/Calendar.tsx +201 -47
  146. package/src/components/Checkbox/Checkbox.test.tsx +2 -1
  147. package/src/components/ContextSelector/ContextSelector.tsx +108 -126
  148. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  149. package/src/components/DataTable/DataTable.tsx +1 -19
  150. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
  151. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
  152. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
  153. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  154. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  155. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  156. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  157. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  158. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  159. package/src/components/DataTable/components/EmptyState.tsx +11 -10
  160. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  161. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  162. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  163. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  164. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  165. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  167. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  168. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  169. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +45 -27
  170. package/src/components/DataTable/components/index.ts +2 -1
  171. package/src/components/DataTable/types.ts +0 -18
  172. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  173. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  174. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  175. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  176. package/src/components/Dialog/Dialog.test.tsx +1 -0
  177. package/src/components/Dialog/Dialog.tsx +25 -8
  178. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  179. package/src/components/FileUpload/FileUpload.test.tsx +45 -16
  180. package/src/components/FileUpload/FileUpload.tsx +141 -130
  181. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
  182. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
  183. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
  184. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
  186. package/src/components/Progress/Progress.tsx +2 -4
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  188. package/src/components/Select/Select.tsx +86 -77
  189. package/src/components/Select/types.ts +3 -0
  190. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  191. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  192. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
  193. package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
  194. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
  195. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
  196. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
  197. package/src/hooks/public/usePublicEvent.ts +5 -5
  198. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  199. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  200. package/src/hooks/public/usePublicRouteParams.ts +13 -9
  201. package/src/hooks/useAddressAutocomplete.test.ts +18 -18
  202. package/src/hooks/useAppConfig.ts +2 -2
  203. package/src/hooks/useEventTheme.test.ts +7 -7
  204. package/src/hooks/useEventTheme.ts +2 -1
  205. package/src/hooks/useFileDisplay.ts +2 -2
  206. package/src/hooks/useFileUrl.ts +52 -8
  207. package/src/hooks/useOrganisationSecurity.test.ts +2 -1
  208. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  209. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  210. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  211. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  212. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  213. package/src/providers/__tests__/ProviderLifecycle.test.tsx +38 -38
  214. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  215. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  216. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  217. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
  218. package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
  219. package/src/rbac/api.test.ts +104 -0
  220. package/src/rbac/engine.ts +1 -1
  221. package/src/rbac/hooks/useCan.test.ts +2 -2
  222. package/src/rbac/secureClient.ts +1 -1
  223. package/src/rbac/types/functions.ts +1 -1
  224. package/src/styles/core.css +7 -0
  225. package/src/theming/__tests__/parseEventColours.test.ts +118 -3
  226. package/src/theming/parseEventColours.ts +77 -11
  227. package/src/types/supabase.ts +2 -3
  228. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
  229. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  230. package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
  231. package/src/utils/formatting/formatDate.test.ts +3 -2
  232. package/src/utils/formatting/formatDateTime.test.ts +2 -2
  233. package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
  234. package/src/utils/storage/README.md +1 -1
  235. package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
  236. package/src/utils/storage/helpers.test.ts +69 -3
  237. package/cursor-rules/01-standards-compliance.mdc +0 -285
  238. package/cursor-rules/04-testing-standards.mdc +0 -270
  239. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  240. package/cursor-rules/06-code-quality.mdc +0 -311
  241. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  242. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  243. package/cursor-rules/11-performance-optimization.mdc +0 -169
  244. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  245. package/dist/DataTable-LRJL4IRV.js +0 -15
  246. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  247. package/dist/eslint-rules/rules/components.cjs +0 -113
  248. package/dist/eslint-rules/rules/imports.cjs +0 -102
  249. package/docs/best-practices/README.md +0 -472
  250. package/docs/best-practices/accessibility.md +0 -604
  251. package/docs/best-practices/common-patterns.md +0 -516
  252. package/docs/best-practices/deployment.md +0 -1103
  253. package/docs/best-practices/performance.md +0 -1328
  254. package/docs/best-practices/security.md +0 -940
  255. package/docs/best-practices/testing.md +0 -1034
  256. package/docs/rbac/compliance/compliance-guide.md +0 -544
  257. package/docs/standards/01-standards-compliance.md +0 -188
  258. package/docs/standards/03-solid-principles.md +0 -39
  259. package/docs/standards/04-testing-standards.md +0 -36
  260. package/docs/standards/05-bug-reports-and-features.md +0 -27
  261. package/docs/standards/06-code-quality.md +0 -34
  262. package/docs/standards/07-tech-stack-compliance.md +0 -30
  263. package/docs/standards/10-error-handling-patterns.md +0 -401
  264. package/docs/standards/11-performance-optimization.md +0 -348
  265. package/docs/standards/12-ci-cd-integration.md +0 -370
  266. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  267. package/scripts/audit/audit-compliance.cjs +0 -1295
  268. package/scripts/audit/audit-components.cjs +0 -260
  269. package/scripts/audit/audit-rbac.cjs +0 -954
  270. package/scripts/audit/audit-standards.cjs +0 -1268
  271. package/scripts/audit/index.cjs +0 -1927
  272. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  273. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  274. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  275. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  276. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  277. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  278. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  279. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  280. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  281. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  282. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  283. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  284. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  285. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  286. package/src/components/DataTable/utils/debugTools.ts +0 -514
  287. package/src/eslint-rules/index.cjs +0 -22
  288. package/src/eslint-rules/rules/components.cjs +0 -113
  289. package/src/eslint-rules/rules/imports.cjs +0 -102
  290. package/src/eslint-rules/rules/rbac.cjs +0 -790
  291. package/src/eslint-rules/utils/helpers.cjs +0 -42
  292. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -0,0 +1,365 @@
1
+ ---
2
+ description: Enforce error handling patterns, performance optimization, and CI/CD integration patterns
3
+ globs: ["src/**/*.{ts,tsx,js,jsx}", "supabase/migrations/**/*.sql", ".github/workflows/**/*.{yml,yaml}", "package.json"]
4
+ alwaysApply: false
5
+ paceCoreVersion: "0.6.x"
6
+ rulesVersion: "2025-01-28"
7
+ ---
8
+ # Operations Standards Guide
9
+
10
+ **📚 Human-Readable Standard**: See [9-operations-standards.md](../../packages/core/docs/standards/9-operations-standards.md) for complete documentation.
11
+
12
+ This guide enforces error handling patterns, performance optimization strategies, and CI/CD integration patterns.
13
+
14
+ ## AI Agent Instructions
15
+
16
+ **When writing or modifying code, ALWAYS:**
17
+ 1. **Use type-safe errors** - Never use `any` for errors, always use type guards or Result types
18
+ 2. **Never expose internals** - User-facing errors must be friendly, never show SQL, stack traces, or file paths
19
+ 3. **Log with context** - Always log errors with context, but never log sensitive data (passwords, tokens, PII)
20
+ 4. **Memoize expensive operations** - Use `useMemo` for expensive computations, `useCallback` for stable references
21
+ 5. **Avoid new objects in render** - Never create new objects/arrays in render, memoize them with `useMemo`
22
+ 6. **Use helper functions in RLS** - Always use STABLE SECURITY DEFINER helper functions, never subqueries
23
+ 7. **Provide recovery paths** - When possible, provide retry logic or fallback values
24
+
25
+ **Decision Tree: Error Handling**
26
+ ```
27
+ 1. What type of error is this?
28
+ ├─ API Error → Use ApiResult shape, user-friendly message
29
+ ├─ Validation Error → Use Zod errors, field-specific messages
30
+ ├─ Network Error → Retry logic, connection message
31
+ └─ Unknown Error → Generic user message, detailed log
32
+
33
+ 2. Should user see this error?
34
+ ├─ YES → User-friendly message (no internals)
35
+ └─ NO → Log only, show generic message
36
+
37
+ 3. Can we recover?
38
+ ├─ YES → Retry logic or fallback value
39
+ └─ NO → Show error, allow user to retry
40
+ ```
41
+
42
+ **Decision Tree: Performance**
43
+ ```
44
+ 1. Is this expensive computation?
45
+ ├─ YES → Use useMemo
46
+ └─ NO → Don't memoize (overhead not worth it)
47
+
48
+ 2. Is this function passed as prop?
49
+ ├─ YES → Use useCallback
50
+ └─ NO → Regular function is fine
51
+
52
+ 3. Is this creating new object/array in render?
53
+ ├─ YES → Memoize with useMemo
54
+ └─ NO → Continue
55
+ ```
56
+
57
+ ## Error Handling Patterns
58
+
59
+ ### MUST: Use Type-Safe Error Handling
60
+
61
+ **MUST use type guards or Result types, NEVER use `any`:**
62
+
63
+ ```tsx
64
+ // ❌ WRONG: Using any
65
+ catch (error: any) {
66
+ console.log(error.message);
67
+ }
68
+
69
+ // ✅ CORRECT: Type guard
70
+ function isApiError(error: unknown): error is ApiError {
71
+ return typeof error === 'object' && error !== null && 'ok' in error && (error as ApiError).ok === false;
72
+ }
73
+ catch (error) {
74
+ if (isApiError(error)) {
75
+ handleApiError(error);
76
+ } else {
77
+ handleUnknownError(error);
78
+ }
79
+ }
80
+
81
+ // ✅ CORRECT: Result type
82
+ type Result<T> = { ok: true; data: T } | { ok: false; error: ApiError };
83
+ const result = await fetchData();
84
+ if (result.ok) {
85
+ useData(result.data);
86
+ } else {
87
+ showError(result.error.message);
88
+ }
89
+ ```
90
+
91
+ ### MUST: Never Expose Internal Details
92
+
93
+ **MUST NOT expose SQL, stack traces, file paths, or internal errors to users:**
94
+
95
+ ```tsx
96
+ // ❌ WRONG: Exposing internal details
97
+ toast.error(error.message); // May contain SQL, stack traces
98
+
99
+ // ✅ CORRECT: User-friendly message
100
+ toast.error('Unable to save changes. Please try again.');
101
+ logger.error('Save failed', { error: error.message, context: 'saveUser' });
102
+ ```
103
+
104
+ ### MUST: Use Consistent Error Shapes
105
+
106
+ **MUST use ApiResult shape for API errors:**
107
+
108
+ ```tsx
109
+ // ✅ CORRECT: Consistent error shape
110
+ type ApiError = {
111
+ ok: false;
112
+ error: {
113
+ code: string;
114
+ message: string; // User-friendly
115
+ details?: object; // Non-sensitive context
116
+ };
117
+ };
118
+ ```
119
+
120
+ ### MUST: Log Errors with Context
121
+
122
+ **MUST log errors with context, but NEVER log sensitive data:**
123
+
124
+ ```tsx
125
+ // ✅ CORRECT: Log with context, no sensitive data
126
+ logger.error('Failed to save user', {
127
+ userId: user.id,
128
+ operation: 'updateUser',
129
+ errorCode: error.code,
130
+ });
131
+
132
+ // ❌ WRONG: Logging sensitive data
133
+ logger.error('Failed to save user', {
134
+ password: user.password, // NEVER
135
+ token: authToken, // NEVER
136
+ });
137
+ ```
138
+
139
+ ### SHOULD: Provide Recovery Paths
140
+
141
+ **SHOULD provide retry logic or fallback values when appropriate:**
142
+
143
+ ```tsx
144
+ // ✅ CORRECT: Retry with exponential backoff
145
+ async function fetchWithRetry<T>(fn: () => Promise<Result<T>>, maxRetries = 3): Promise<Result<T>> {
146
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
147
+ const result = await fn();
148
+ if (result.ok) return result;
149
+ if (result.error.code?.startsWith('4')) return result; // Don't retry 4xx
150
+ await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));
151
+ }
152
+ return { ok: false, error: { code: 'MAX_RETRIES', message: 'Operation failed after retries' } };
153
+ }
154
+ ```
155
+
156
+ ## Performance Optimization Patterns
157
+
158
+ ### MUST: Optimize React Re-renders
159
+
160
+ **MUST use memoization for expensive computations and stable references:**
161
+
162
+ ```tsx
163
+ // ✅ CORRECT - Memoize expensive computation
164
+ const expensiveValue = useMemo(() => computeExpensiveValue(data), [data]);
165
+
166
+ // ✅ CORRECT - Stable callback reference
167
+ const handleClick = useCallback(() => doSomething(id), [id]);
168
+
169
+ // ✅ CORRECT - Memoize component
170
+ const ExpensiveComponent = React.memo(({ data }) => <div>{/* ... */}</div>);
171
+ ```
172
+
173
+ ### MUST: Avoid Creating New Objects in Render
174
+
175
+ **MUST NOT create new objects/arrays in render:**
176
+
177
+ ```tsx
178
+ // ❌ WRONG - New object on every render
179
+ function Component({ items }) {
180
+ const config = { items, enabled: true };
181
+ return <Child config={config} />;
182
+ }
183
+
184
+ // ✅ CORRECT - Memoize object
185
+ function Component({ items }) {
186
+ const config = useMemo(() => ({ items, enabled: true }), [items]);
187
+ return <Child config={config} />;
188
+ }
189
+ ```
190
+
191
+ ### MUST: Use Helper Functions in RLS Policies
192
+
193
+ **MUST use STABLE SECURITY DEFINER helper functions (never subqueries):**
194
+
195
+ ```sql
196
+ -- ✅ CORRECT - Helper function (evaluated once)
197
+ CREATE POLICY "rbac_select_users" ON users FOR SELECT USING (
198
+ check_user_organisation_access(organisation_id)
199
+ );
200
+
201
+ -- ❌ WRONG - Subquery (N+1 performance issue)
202
+ CREATE POLICY "rbac_select_users" ON users FOR SELECT USING (
203
+ organisation_id IN (SELECT organisation_id FROM organisation_memberships WHERE user_id = auth.uid())
204
+ );
205
+ ```
206
+
207
+ ### SHOULD: Lazy Load Heavy Components
208
+
209
+ **SHOULD lazy load heavy components:**
210
+
211
+ ```tsx
212
+ // ✅ CORRECT - Lazy load
213
+ import { lazy, Suspense } from 'react';
214
+ const HeavyComponent = lazy(() => import('./HeavyComponent'));
215
+ <Suspense fallback={<Loading />}><HeavyComponent /></Suspense>
216
+ ```
217
+
218
+ ### SHOULD: Configure TanStack Query Cache
219
+
220
+ **SHOULD configure appropriate cache times:**
221
+
222
+ ```tsx
223
+ // ✅ CORRECT - Configure cache
224
+ const queryClient = new QueryClient({
225
+ defaultOptions: {
226
+ queries: {
227
+ staleTime: 5 * 60 * 1000,
228
+ cacheTime: 10 * 60 * 1000,
229
+ retry: 1,
230
+ refetchOnWindowFocus: false,
231
+ },
232
+ },
233
+ });
234
+ ```
235
+
236
+ ## CI/CD Integration Patterns
237
+
238
+ ### MUST: Include Required CI Checks
239
+
240
+ **MUST run these checks in every CI pipeline:**
241
+
242
+ ```yaml
243
+ # ✅ CORRECT - Required checks
244
+ jobs:
245
+ quality-checks:
246
+ steps:
247
+ - name: Lint
248
+ run: npm run lint
249
+ - name: Type check
250
+ run: npx tsc --noEmit
251
+ - name: Run tests
252
+ run: npm run test
253
+ - name: Build
254
+ run: npm run build
255
+ ```
256
+
257
+ ### MUST: Have Required Scripts
258
+
259
+ **MUST have these scripts in package.json:**
260
+
261
+ ```json
262
+ // ✅ CORRECT - Required scripts
263
+ {
264
+ "scripts": {
265
+ "lint": "eslint .",
266
+ "type-check": "tsc --noEmit",
267
+ "test": "vitest run",
268
+ "build": "vite build"
269
+ }
270
+ }
271
+ ```
272
+
273
+ ### MUST: Use Secrets for Sensitive Data
274
+
275
+ **MUST NOT commit secrets to repository:**
276
+
277
+ ```yaml
278
+ # ✅ CORRECT - Use secrets
279
+ env:
280
+ SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
281
+ VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}
282
+
283
+ # ❌ WRONG - Hardcoded secrets
284
+ env:
285
+ SUPABASE_URL: "https://hardcoded-url.supabase.co"
286
+ ```
287
+
288
+ ### SHOULD: Deploy to Staging First
289
+
290
+ **SHOULD deploy to staging before production:**
291
+
292
+ ```yaml
293
+ # ✅ CORRECT - Staging first
294
+ deploy-staging:
295
+ if: github.ref == 'refs/heads/develop'
296
+ environment: staging
297
+
298
+ deploy-production:
299
+ needs: deploy-staging
300
+ if: github.ref == 'refs/heads/main'
301
+ environment: production
302
+ ```
303
+
304
+ ## Common Mistakes to Avoid
305
+
306
+ **When writing code, NEVER:**
307
+ 1. **Use `any` for errors** - Always use type guards or Result types
308
+ ```tsx
309
+ // ❌ WRONG
310
+ catch (error: any) {
311
+ toast.error(error.message);
312
+ }
313
+
314
+ // ✅ CORRECT
315
+ catch (error: unknown) {
316
+ if (isApiError(error)) {
317
+ toast.error(error.error.message);
318
+ } else {
319
+ toast.error('An unexpected error occurred');
320
+ }
321
+ }
322
+ ```
323
+
324
+ 2. **Expose internal details in errors** - Always use user-friendly messages
325
+ 3. **Create new objects in render** - Always memoize with useMemo
326
+ 4. **Skip memoization for expensive operations** - Always use useMemo/useCallback
327
+ 5. **Use subqueries in RLS policies** - Always use STABLE SECURITY DEFINER helper functions
328
+ 6. **Log sensitive data** - Never log passwords, tokens, or PII
329
+
330
+ ## Operations Checklist
331
+
332
+ Before committing, verify:
333
+
334
+ **Error Handling:**
335
+ - [ ] Type-safe error handling (no `any`)
336
+ - [ ] User-friendly error messages (no internals)
337
+ - [ ] Errors logged with context (no sensitive data)
338
+ - [ ] Recovery paths provided when possible
339
+ - [ ] Consistent error shapes used
340
+
341
+ **Performance:**
342
+ - [ ] Expensive computations memoized
343
+ - [ ] Callbacks stable with useCallback
344
+ - [ ] Components memoized when appropriate
345
+ - [ ] No new objects/arrays in render
346
+ - [ ] Heavy components lazy loaded
347
+ - [ ] RLS policies use helper functions
348
+ - [ ] TanStack Query configured properly
349
+
350
+ **CI/CD:**
351
+ - [ ] Lint check configured
352
+ - [ ] Type check configured
353
+ - [ ] Tests run in CI
354
+ - [ ] Build succeeds in CI
355
+ - [ ] Environment variables set as secrets
356
+ - [ ] Staging deployment configured
357
+ - [ ] Production deployment configured
358
+
359
+ ## Reference
360
+
361
+ **Note**: CI/CD configuration validation and performance metric thresholds are handled by CI/audit tool. See [9-operations-standards.md](../../packages/core/docs/standards/9-operations-standards.md) for complete enforcement details.
362
+
363
+ - Error Handling: [9-operations-standards.md](../../packages/core/docs/standards/9-operations-standards.md#error-handling-patterns)
364
+ - Performance: [9-operations-standards.md](../../packages/core/docs/standards/9-operations-standards.md#performance-optimization)
365
+ - CI/CD: [9-operations-standards.md](../../packages/core/docs/standards/9-operations-standards.md#cicd-integration)
@@ -0,0 +1,15 @@
1
+ export { ActionButtons, BulkOperationsDropdown, ColumnFactory, ColumnVisibilityDropdown, DataTable, DataTableCore, DataTableErrorBoundary, DataTableModals, DataTableToolbar, EditableRow, EmptyState, EnhancedPaginationControls, GroupingDropdown, ImportModal, LoadingState, PaginationControls, SortIndicator, UnifiedTableBody, announce, announceBulkOperation, announceFilterChange, announceLoadingState, announcePaginationChange, announceSearchResults, announceSelectionChange, announceSortChange, average, calculateAllDepths, calculateAllIndentation, calculateIndentation, calculateOptimalPageSize, cleanupLiveRegion, count, createHierarchicalStructure, defaultDataTableFeatures, exportToCSV, exportToCSVWithTableRows, generateCSVContent, getAriaSortState, getAriaSortValue, getCellRenderer, getColumnHeaderText, getHierarchicalSortConfig, getPageSizeOptions, getPaginationBinding, getRowDepth, getRowDescription, getRowIdSafe, getSortButtonLabel, groupHierarchicalData, hasValidRowId, initializeLiveRegion, isHierarchicalSortableColumn, max, min, normalizeDataTableFeatures, shouldShowColumnForRow, sortHierarchicalDataByStructure, sortHierarchicalDataWithSorting, sum, validateHierarchicalData, validatePaginationConfig } from './chunk-NKHKXPI4.js';
2
+ import './chunk-GS5672WG.js';
3
+ export { CircuitBreaker, DEFAULT_FALLBACK_CONFIG, DataChunkManager, DataTableError, DataTableErrorType, ErrorRecoveryManager, MemoryMonitor, SearchIndex, VisibilityTracker, chunkData, debounce, determinePaginationMode, getOptimalPageSizeOptions, safeExecute, throttle, useDataTablePerformance } from './chunk-S7DKJPLT.js';
4
+ import './chunk-EF2UGZWY.js';
5
+ import './chunk-C7NSAPTL.js';
6
+ import './chunk-T5CVK4R3.js';
7
+ import './chunk-LX6U42O3.js';
8
+ import './chunk-AHU7G2R5.js';
9
+ import './chunk-4SXLQIZO.js';
10
+ import './chunk-A3W6LW53.js';
11
+ import './chunk-OJ4SKRSV.js';
12
+ import './chunk-7ILTDCL2.js';
13
+ import './chunk-HF6O3O37.js';
14
+ import './chunk-TTRFSOKR.js';
15
+ import './chunk-3RG5ZIWI.js';
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { d as DataRecord, D as DataTableColumn, e as DataTableRBACConfig, f as DataTableFeatureConfig, H as HierarchicalConfig, g as PerformanceConfig, S as ServerSideConfig, h as PaginationMode, C as ChunkingConfig, i as SearchIndexConfig, j as ExportOptions, G as GetRowId, E as EmptyStateConfig, c as AggregateConfig, a as DataTableAction } from './types-B-K_5VnO.js';
2
+ import { d as DataRecord, D as DataTableColumn, e as DataTableRBACConfig, f as DataTableFeatureConfig, H as HierarchicalConfig, g as PerformanceConfig, S as ServerSideConfig, h as PaginationMode, C as ChunkingConfig, i as SearchIndexConfig, j as ExportOptions, G as GetRowId, E as EmptyStateConfig, c as AggregateConfig, a as DataTableAction } from './types-DXstZpNI.js';
3
3
  import React__default from 'react';
4
4
 
5
5
  /**
@@ -1,7 +1,7 @@
1
1
  import * as React$1 from 'react';
2
2
  import React__default, { ReactNode, Component } from 'react';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
- import { P as ParsedAddress, A as AutocompleteOptions } from './types-B-K_5VnO.js';
4
+ import { P as ParsedAddress, A as AutocompleteOptions } from './types-DXstZpNI.js';
5
5
  import * as LabelPrimitive from '@radix-ui/react-label';
6
6
  import { F as FileCategory, e as FileUploadResult, U as UploadProgress, c as FileUploadOptions, a as FileReference } from './file-reference-BavO2eQj.js';
7
7
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
@@ -473,27 +473,32 @@ declare namespace Textarea {
473
473
  * Features:
474
474
  * - Multiple visual variants (default, destructive, inline)
475
475
  * - Title and description support
476
- * - Semantic HTML: renders as `<aside>` element
477
- * - ARIA role="alert" for accessibility
476
+ * - Semantic HTML: renders as `<p>` element with `role="alert"` (default) or custom role
478
477
  * - Keyboard and screen reader accessible
479
478
  * - Composable with icons and actions
480
479
  * - Inline variant for lightweight text formatting
481
480
  *
482
481
  * @example
483
482
  * ```tsx
484
- * // Basic alert (renders as <aside> with <h5> title and <p> description)
483
+ * // Basic alert (renders as <p role="alert"> with <h5> title and <p> description)
485
484
  * <Alert>
486
485
  * <AlertTitle>Success</AlertTitle>
487
486
  * <AlertDescription>Your changes have been saved.</AlertDescription>
488
487
  * </Alert>
489
488
  *
490
- * // Destructive alert with icon (renders as <aside> with <h5> title and <p> description)
489
+ * // Destructive alert with icon (renders as <p role="alert"> with <h5> title and <p> description)
491
490
  * <Alert variant="destructive">
492
491
  * <ErrorIcon />
493
492
  * <AlertTitle>Error</AlertTitle>
494
493
  * <AlertDescription>Something went wrong.</AlertDescription>
495
494
  * </Alert>
496
495
  *
496
+ * // Status message (renders as <p role="status"> for informational messages)
497
+ * <Alert role="status" aria-live="polite">
498
+ * <AlertTitle>No data available</AlertTitle>
499
+ * <AlertDescription>Get started by adding your first entry.</AlertDescription>
500
+ * </Alert>
501
+ *
497
502
  * // Inline alert (renders as React.Fragment with <strong> title and <span> description)
498
503
  * <Alert variant="inline">
499
504
  * <AlertTitle>Note:</AlertTitle>
@@ -502,15 +507,16 @@ declare namespace Textarea {
502
507
  * ```
503
508
  *
504
509
  * @accessibility
505
- * - Uses semantic HTML: `<aside>` element for better semantic meaning
506
- * - Uses role="alert" for screen reader announcement
510
+ * - Uses semantic HTML: `<p>` element with `role="alert"` (default) for screen reader announcements
511
+ * - Can be customized with `role="status"` for informational messages
507
512
  * - Title and description are semantically structured
508
513
  * - Supports keyboard navigation and focus
509
514
  */
510
515
 
511
- declare const Alert: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLElement> & {
516
+ declare const Alert: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLParagraphElement> & {
512
517
  variant?: "default" | "destructive" | "inline";
513
- } & React$1.RefAttributes<HTMLElement>>;
518
+ role?: string;
519
+ } & React$1.RefAttributes<HTMLParagraphElement>>;
514
520
  declare const AlertTitle: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLHeadingElement> & React$1.RefAttributes<HTMLHeadingElement>>;
515
521
  declare const AlertDescription: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLParagraphElement> & React$1.RefAttributes<HTMLParagraphElement>>;
516
522
 
@@ -912,9 +918,9 @@ interface DialogContentProps extends React$1.HTMLAttributes<HTMLDialogElement> {
912
918
  minHeight?: string;
913
919
  /** Minimum width in CSS units */
914
920
  minWidth?: string;
915
- /** Dialog title for accessibility (sets native title attribute) */
921
+ /** Dialog title - sets native title attribute and aria-labelledby */
916
922
  title?: string;
917
- /** Dialog description for accessibility (sets aria-description attribute) */
923
+ /** Dialog description - sets native aria-description attribute */
918
924
  description?: string;
919
925
  /** Whether to persist open state across tab switches */
920
926
  persistOpenState?: boolean;
@@ -926,12 +932,6 @@ interface DialogContentProps extends React$1.HTMLAttributes<HTMLDialogElement> {
926
932
  interface DialogPortalProps {
927
933
  children: React$1.ReactNode;
928
934
  }
929
- /**
930
- * Props for the DialogClose component
931
- * @public
932
- */
933
- interface DialogCloseProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
934
- }
935
935
  /**
936
936
  * Props for the DialogHeader component (semantic header element)
937
937
  * @public
@@ -1008,6 +1008,20 @@ declare const DialogPortal: React$1.FC<DialogPortalProps>;
1008
1008
  * @returns JSX.Element - The semantic dialog content with overlay and optional close button
1009
1009
  */
1010
1010
  declare const DialogContent: React$1.ForwardRefExoticComponent<DialogContentProps & React$1.RefAttributes<HTMLDialogElement>>;
1011
+ /**
1012
+ * Props for the DialogClose component
1013
+ * @public
1014
+ */
1015
+ interface DialogCloseProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
1016
+ }
1017
+ /**
1018
+ * Props for the DialogClose component
1019
+ * @public
1020
+ */
1021
+ interface DialogCloseProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement> {
1022
+ /** Whether to merge props with child element instead of rendering a button */
1023
+ asChild?: boolean;
1024
+ }
1011
1025
  /**
1012
1026
  * DialogClose component
1013
1027
  * Button to close the dialog
@@ -1073,6 +1087,7 @@ interface SelectProps extends Omit<React$1.HTMLAttributes<HTMLFieldSetElement>,
1073
1087
  children: React$1.ReactNode;
1074
1088
  className?: string;
1075
1089
  direction?: SelectDirection;
1090
+ showCheckmark?: boolean;
1076
1091
  }
1077
1092
  /**
1078
1093
  * Props for the SelectTrigger component.
@@ -1108,6 +1123,7 @@ interface SelectItemProps {
1108
1123
  disabled?: boolean;
1109
1124
  className?: string;
1110
1125
  onClick?: (e: React$1.MouseEvent) => void;
1126
+ showCheckmark?: boolean;
1111
1127
  }
1112
1128
 
1113
1129
  /**
@@ -1171,39 +1187,39 @@ declare const SelectContent: React$1.ForwardRefExoticComponent<SelectContentProp
1171
1187
  declare const SelectItem: React$1.ForwardRefExoticComponent<SelectItemProps & React$1.RefAttributes<HTMLLIElement>>;
1172
1188
  /**
1173
1189
  * Select group component.
1174
- * Groups related select items together.
1190
+ * Groups related select items together using a nested list structure.
1175
1191
  *
1176
1192
  * @param props - Select group configuration
1177
- * @param ref - Forwarded ref to the div element
1193
+ * @param ref - Forwarded ref to the ul element
1178
1194
  * @returns The rendered select group
1179
1195
  */
1180
1196
  declare const SelectGroup: React$1.ForwardRefExoticComponent<{
1181
1197
  children: React$1.ReactNode;
1182
1198
  className?: string;
1183
- } & React$1.RefAttributes<HTMLDivElement>>;
1199
+ } & React$1.RefAttributes<HTMLUListElement>>;
1184
1200
  /**
1185
1201
  * Select label component.
1186
1202
  * Provides a label for a group of select items.
1187
1203
  *
1188
1204
  * @param props - Select label configuration
1189
- * @param ref - Forwarded ref to the div element
1205
+ * @param ref - Forwarded ref to the li element
1190
1206
  * @returns The rendered select label
1191
1207
  */
1192
1208
  declare const SelectLabel: React$1.ForwardRefExoticComponent<{
1193
1209
  children: React$1.ReactNode;
1194
1210
  className?: string;
1195
- } & React$1.RefAttributes<HTMLDivElement>>;
1211
+ } & React$1.RefAttributes<HTMLLIElement>>;
1196
1212
  /**
1197
1213
  * Select separator component.
1198
1214
  * Provides visual separation between groups of select items.
1199
1215
  *
1200
1216
  * @param props - Select separator configuration
1201
- * @param ref - Forwarded ref to the div element
1217
+ * @param ref - Forwarded ref to the hr element
1202
1218
  * @returns The rendered select separator
1203
1219
  */
1204
1220
  declare const SelectSeparator: React$1.ForwardRefExoticComponent<{
1205
1221
  className?: string;
1206
- } & React$1.RefAttributes<HTMLDivElement>>;
1222
+ } & React$1.RefAttributes<HTMLHRElement>>;
1207
1223
 
1208
1224
  /**
1209
1225
  * @file Tabs Component System
@@ -1,5 +1,5 @@
1
- export { UnifiedAuthContext, UnifiedAuthProvider, useUnifiedAuth } from './chunk-FTCRZOG2.js';
2
- import './chunk-ZFYPMX46.js';
1
+ export { UnifiedAuthContext, UnifiedAuthProvider, useUnifiedAuth } from './chunk-T5CVK4R3.js';
2
+ import './chunk-LX6U42O3.js';
3
3
  import './chunk-AHU7G2R5.js';
4
4
  import './chunk-4SXLQIZO.js';
5
5
  import './chunk-HF6O3O37.js';
@@ -1,4 +1,4 @@
1
- export { OrganisationContextRequiredError, clearCache, getAccessLevel, getPageScopeType, getPermissionMap, getRoleContext, hasAllPermissions, hasAnyPermission, invalidateAppCache, invalidateEventCache, invalidateOrganisationCache, invalidateUserCache, isEventAdmin, isOrganisationAdmin, isPermitted, isPermittedCached, isRBACInitialized, isSuperAdmin, resolveAppContext, setupRBAC } from './chunk-ZFYPMX46.js';
1
+ export { OrganisationContextRequiredError, clearCache, getAccessLevel, getPageScopeType, getPermissionMap, getRoleContext, hasAllPermissions, hasAnyPermission, invalidateAppCache, invalidateEventCache, invalidateOrganisationCache, invalidateUserCache, isEventAdmin, isOrganisationAdmin, isPermitted, isPermittedCached, isRBACInitialized, isSuperAdmin, resolveAppContext, setupRBAC } from './chunk-LX6U42O3.js';
2
2
  import './chunk-AHU7G2R5.js';
3
3
  import './chunk-TTRFSOKR.js';
4
4
  import './chunk-3RG5ZIWI.js';
@@ -1,6 +1,6 @@
1
- import { generateFilePath, generateUniqueFileName, extractFileMetadata, uploadFile, getPublicUrl, getSignedUrl, deleteFile, downloadFile, listFiles, archiveFile } from './chunk-FENMYN2U.js';
2
- import { useOrganisationSecurity, usePublicPageContext } from './chunk-3O3WHILE.js';
3
- import { useOrganisations } from './chunk-FTCRZOG2.js';
1
+ import { generateFilePath, generateUniqueFileName, extractFileMetadata, uploadFile, getPublicUrl, getSignedUrl, deleteFile, downloadFile, listFiles, archiveFile } from './chunk-MPBLMWVR.js';
2
+ import { useOrganisationSecurity, usePublicPageContext } from './chunk-EF2UGZWY.js';
3
+ import { useOrganisations } from './chunk-T5CVK4R3.js';
4
4
  import { assertOrganisationId } from './chunk-4SXLQIZO.js';
5
5
  import { createLogger, logger } from './chunk-TTRFSOKR.js';
6
6
  import { useForm } from 'react-hook-form';
@@ -481,13 +481,14 @@ function usePublicRouteParams(options = {}) {
481
481
  }, [fetchEventData, eventLoading]);
482
482
  const finalError = useMemo(() => {
483
483
  if (error) return error;
484
- if (eventError) return eventError;
484
+ if (!validateEventCode) return null;
485
+ if (fetchEventData && eventError) return eventError;
485
486
  return null;
486
- }, [error, eventError]);
487
+ }, [error, eventError, fetchEventData, validateEventCode]);
487
488
  const eventId = useMemo(() => {
488
- if (!event) return null;
489
+ if (!fetchEventData || !event) return null;
489
490
  return event.event_id || event.id;
490
- }, [event]);
491
+ }, [fetchEventData, event]);
491
492
  const refetch = useCallback(async () => {
492
493
  if (!fetchEventData) return;
493
494
  await refetchEvent();
@@ -1,7 +1,6 @@
1
1
  import { createLogger } from './chunk-TTRFSOKR.js';
2
2
 
3
3
  // src/theming/parseEventColours.ts
4
- var log = createLogger("ParseEventColours");
5
4
  function parseAndNormalizeEventColours(input) {
6
5
  try {
7
6
  if (!input) return null;
@@ -15,17 +14,20 @@ function parseAndNormalizeEventColours(input) {
15
14
  } else if (typeof input !== "object") {
16
15
  return null;
17
16
  }
18
- const main = obj?.main || null;
19
- const sec = obj?.sec || null;
20
- const acc = obj?.acc || null;
21
- if (!main && !sec && !acc) return null;
17
+ const main = obj?.main || obj?.["ev-main"] || null;
18
+ const sec = obj?.sec || obj?.["ev-sec"] || null;
19
+ const acc = obj?.acc || obj?.["ev-acc"] || null;
20
+ if (!main && !sec && !acc) {
21
+ return null;
22
+ }
22
23
  const fill = (p) => {
23
24
  if (!p || typeof p !== "object") return {};
24
25
  const out = {};
25
26
  for (const key in p) {
26
27
  const value = p[key];
27
28
  if (value !== null && value !== void 0 && value !== "") {
28
- out[key] = value;
29
+ const normalizedKey = typeof key === "string" && key.startsWith("ev-") ? key.substring(3) : key;
30
+ out[normalizedKey] = value;
29
31
  }
30
32
  }
31
33
  return out;
@@ -36,19 +38,18 @@ function parseAndNormalizeEventColours(input) {
36
38
  acc: fill(acc)
37
39
  };
38
40
  } catch (error) {
39
- log.warn("Failed to parse/normalize event colours:", error);
40
41
  return null;
41
42
  }
42
43
  }
43
44
 
44
45
  // src/theming/runtime.ts
45
- var log2 = createLogger("ThemingRuntime");
46
+ var log = createLogger("ThemingRuntime");
46
47
  function formatOklchCss(color) {
47
48
  return `oklch(${color.L} ${color.C} ${color.H})`;
48
49
  }
49
50
  function applyPalette(palette) {
50
51
  if (typeof document === "undefined" || document === null) {
51
- log2.warn("Document not available (SSR) - palette not applied");
52
+ log.warn("Document not available (SSR) - palette not applied");
52
53
  return;
53
54
  }
54
55
  const root = document.documentElement;
@@ -1,3 +1,11 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ // src/utils/core/cn.ts
5
+ function cn(...inputs) {
6
+ return twMerge(clsx(inputs));
7
+ }
8
+
1
9
  // src/utils/performance/performanceBudgets.ts
2
10
  var PERFORMANCE_BUDGETS = {
3
11
  COMPONENT_RENDER: { threshold: 50 },
@@ -69,4 +77,4 @@ performanceBudgetMonitor.setBudget("CHUNK_COUNT", 10, "warning");
69
77
  performanceBudgetMonitor.setBudget("TREESHAKING_SCORE", 70, "warning");
70
78
  performanceBudgetMonitor.setBudget("ERROR_BOUNDARY_TRIGGER", 5, "error");
71
79
 
72
- export { PERFORMANCE_BUDGETS, performanceBudgetMonitor };
80
+ export { PERFORMANCE_BUDGETS, cn, performanceBudgetMonitor };