@jmruthers/pace-core 0.5.54 → 0.5.55

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 (396) hide show
  1. package/README.md +0 -4
  2. package/dist/{DataTable-7FMFXA7A.js → DataTable-4T627QFJ.js} +11 -11
  3. package/dist/{PublicLoadingSpinner-Bq_-BeK-.d.ts → PublicLoadingSpinner-SL8WaQN7.d.ts} +2 -21
  4. package/dist/{api-H5A3H4IR.js → api-LUNF5O6M.js} +3 -3
  5. package/dist/{appConfig-BVGyuvI7.d.ts → appConfig-DjpeG6P-.d.ts} +9 -1
  6. package/dist/{appNameResolver-7GHF5ED2.js → appNameResolver-UURKN7NF.js} +2 -2
  7. package/dist/{audit-BUW3LMJB.js → audit-6TOCAMKO.js} +2 -2
  8. package/dist/{chunk-MZBUOP4P.js → chunk-5BSLGBYI.js} +4 -3
  9. package/dist/chunk-5BSLGBYI.js.map +1 -0
  10. package/dist/{chunk-I5Z3QH5X.js → chunk-66C4BSAY.js} +2 -2
  11. package/dist/{chunk-I5Z3QH5X.js.map → chunk-66C4BSAY.js.map} +1 -1
  12. package/dist/{chunk-MYP2EGHX.js → chunk-AJ2KMES7.js} +21 -14
  13. package/dist/chunk-AJ2KMES7.js.map +1 -0
  14. package/dist/{chunk-EL2O4IUX.js → chunk-AQFRLC7K.js} +16 -24
  15. package/dist/{chunk-EL2O4IUX.js.map → chunk-AQFRLC7K.js.map} +1 -1
  16. package/dist/{chunk-7BNPOCLL.js → chunk-B2WTCLCV.js} +6 -2
  17. package/dist/chunk-B2WTCLCV.js.map +1 -0
  18. package/dist/{chunk-WJARTBCT.js → chunk-D7ARGIA3.js} +16 -7
  19. package/dist/chunk-D7ARGIA3.js.map +1 -0
  20. package/dist/{chunk-NRK4AIHQ.js → chunk-KBRACSJI.js} +3 -3
  21. package/dist/{chunk-NYUJ4FJR.js → chunk-KJDPSM64.js} +7 -7
  22. package/dist/chunk-KJDPSM64.js.map +1 -0
  23. package/dist/{chunk-GWSBHC4J.js → chunk-KLPVOPRI.js} +261 -38
  24. package/dist/chunk-KLPVOPRI.js.map +1 -0
  25. package/dist/{chunk-TRIZ7IB7.js → chunk-MPQDF75X.js} +148 -288
  26. package/dist/chunk-MPQDF75X.js.map +1 -0
  27. package/dist/{chunk-MSFACPQQ.js → chunk-PAEM3OWN.js} +11 -11
  28. package/dist/{chunk-MSFACPQQ.js.map → chunk-PAEM3OWN.js.map} +1 -1
  29. package/dist/{chunk-GIO7BFE7.js → chunk-RQD3D2CO.js} +66 -169
  30. package/dist/{chunk-GIO7BFE7.js.map → chunk-RQD3D2CO.js.map} +1 -1
  31. package/dist/{chunk-YDJW5XTN.js → chunk-STT7INZR.js} +25 -1
  32. package/dist/chunk-STT7INZR.js.map +1 -0
  33. package/dist/{chunk-6MTY77WU.js → chunk-TNMXZLDR.js} +3 -3
  34. package/dist/{chunk-BC3S53OZ.js → chunk-UQE2Y64H.js} +30 -14
  35. package/dist/chunk-UQE2Y64H.js.map +1 -0
  36. package/dist/{chunk-22KLBHPS.js → chunk-W66AZIOH.js} +2 -2
  37. package/dist/chunk-W66AZIOH.js.map +1 -0
  38. package/dist/{chunk-SS3E6QLB.js → chunk-YNUBMSMV.js} +2 -2
  39. package/dist/chunk-YNUBMSMV.js.map +1 -0
  40. package/dist/{chunk-NZ655MWE.js → chunk-ZOD2ZY6X.js} +5 -4
  41. package/dist/chunk-ZOD2ZY6X.js.map +1 -0
  42. package/dist/{chunk-74C6SNEC.js → chunk-ZPK5656W.js} +3 -3
  43. package/dist/{chunk-74C6SNEC.js.map → chunk-ZPK5656W.js.map} +1 -1
  44. package/dist/components.d.ts +22 -899
  45. package/dist/components.js +436 -3118
  46. package/dist/components.js.map +1 -1
  47. package/dist/file-reference-9xUOnwyt.d.ts +70 -0
  48. package/dist/hooks.d.ts +2 -2
  49. package/dist/hooks.js +10 -10
  50. package/dist/hooks.js.map +1 -1
  51. package/dist/index.d.ts +49 -9
  52. package/dist/index.js +190 -25
  53. package/dist/index.js.map +1 -1
  54. package/dist/{organisation-CO3Sh3_D.d.ts → organisation-t-vvQC3g.d.ts} +1 -8
  55. package/dist/providers.d.ts +2 -2
  56. package/dist/providers.js +5 -5
  57. package/dist/rbac/index.d.ts +65 -46
  58. package/dist/rbac/index.js +10 -12
  59. package/dist/styles/core.css +0 -125
  60. package/dist/types.d.ts +2 -1
  61. package/dist/types.js +3 -1
  62. package/dist/types.js.map +1 -1
  63. package/dist/{usePublicRouteParams-B2OcAsur.d.ts → usePublicRouteParams-CdoFxnJK.d.ts} +1 -1
  64. package/dist/utils.d.ts +3 -4
  65. package/dist/utils.js +44 -13
  66. package/dist/utils.js.map +1 -1
  67. package/docs/FILE_REFERENCE_SYSTEM.md +440 -0
  68. package/docs/INDEX.md +7 -5
  69. package/docs/README.md +0 -1
  70. package/docs/api/README.md +0 -4
  71. package/docs/api/classes/ErrorBoundary.md +1 -1
  72. package/docs/api/classes/InvalidScopeError.md +1 -1
  73. package/docs/api/classes/MissingUserContextError.md +1 -1
  74. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  75. package/docs/api/classes/PermissionDeniedError.md +2 -2
  76. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  77. package/docs/api/classes/RBACAuditManager.md +12 -12
  78. package/docs/api/classes/RBACCache.md +1 -1
  79. package/docs/api/classes/RBACEngine.md +6 -6
  80. package/docs/api/classes/RBACError.md +1 -1
  81. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  82. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  83. package/docs/api/classes/StorageUtils.md +281 -0
  84. package/docs/api/interfaces/AggregateConfig.md +1 -1
  85. package/docs/api/interfaces/ButtonProps.md +1 -1
  86. package/docs/api/interfaces/CardProps.md +1 -1
  87. package/docs/api/interfaces/ColorPalette.md +1 -1
  88. package/docs/api/interfaces/ColorShade.md +1 -1
  89. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  90. package/docs/api/interfaces/DataTableAction.md +1 -1
  91. package/docs/api/interfaces/DataTableColumn.md +1 -1
  92. package/docs/api/interfaces/DataTableProps.md +1 -1
  93. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  94. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  95. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  96. package/docs/api/interfaces/EventContextType.md +1 -1
  97. package/docs/api/interfaces/EventLogoProps.md +1 -1
  98. package/docs/api/interfaces/EventProviderProps.md +1 -1
  99. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  100. package/docs/api/interfaces/FileUploadProps.md +1 -1
  101. package/docs/api/interfaces/FooterProps.md +1 -1
  102. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  103. package/docs/api/interfaces/InputProps.md +1 -1
  104. package/docs/api/interfaces/LabelProps.md +1 -1
  105. package/docs/api/interfaces/LoginFormProps.md +1 -1
  106. package/docs/api/interfaces/NavigationAccessRecord.md +2 -2
  107. package/docs/api/interfaces/NavigationContextType.md +1 -1
  108. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  109. package/docs/api/interfaces/NavigationItem.md +1 -1
  110. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  111. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  112. package/docs/api/interfaces/Organisation.md +1 -1
  113. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  114. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  115. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  116. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  117. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  118. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  119. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  120. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  121. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  122. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  123. package/docs/api/interfaces/PaletteData.md +1 -1
  124. package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
  125. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  126. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  127. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  128. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  129. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  130. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  131. package/docs/api/interfaces/RBACConfig.md +1 -1
  132. package/docs/api/interfaces/RBACContextType.md +1 -1
  133. package/docs/api/interfaces/RBACLogger.md +1 -1
  134. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  135. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  136. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  137. package/docs/api/interfaces/RouteAccessRecord.md +2 -2
  138. package/docs/api/interfaces/RouteConfig.md +2 -2
  139. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  140. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  141. package/docs/api/interfaces/StorageConfig.md +1 -1
  142. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  143. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  144. package/docs/api/interfaces/StorageListOptions.md +1 -1
  145. package/docs/api/interfaces/StorageListResult.md +1 -1
  146. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  147. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  148. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  149. package/docs/api/interfaces/StyleImport.md +1 -1
  150. package/docs/api/interfaces/ToastActionElement.md +1 -1
  151. package/docs/api/interfaces/ToastProps.md +1 -1
  152. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  153. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  154. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  155. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  156. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  157. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  158. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  159. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  160. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  161. package/docs/api/interfaces/UserEventAccess.md +1 -1
  162. package/docs/api/interfaces/UserMenuProps.md +1 -1
  163. package/docs/api/interfaces/UserProfile.md +1 -1
  164. package/docs/api/modules.md +204 -200
  165. package/docs/api-reference/components.md +141 -163
  166. package/docs/api-reference/hooks.md +347 -0
  167. package/docs/core-concepts/rbac-system.md +69 -16
  168. package/docs/getting-started/examples/basic-auth-app.md +0 -1
  169. package/docs/implementation-guides/datatable-rbac-usage.md +12 -11
  170. package/docs/implementation-guides/file-upload-storage.md +733 -0
  171. package/docs/implementation-guides/inactivity-tracking.md +779 -0
  172. package/docs/implementation-guides/organisation-security.md +748 -0
  173. package/docs/implementation-guides/public-pages-advanced.md +1022 -0
  174. package/docs/migration/MIGRATION_GUIDE.md +684 -0
  175. package/docs/migration/README.md +13 -2
  176. package/docs/migration/rbac-migration.md +73 -0
  177. package/docs/rbac/examples/rbac-rls-integration-example.md +11 -13
  178. package/docs/style-guide.md +269 -1
  179. package/package.json +1 -1
  180. package/src/__tests__/TESTING_GUIDELINES.md +331 -18
  181. package/src/__tests__/helpers/supabaseMock.ts +99 -0
  182. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +10 -7
  183. package/src/__tests__/shared.ts +6 -0
  184. package/src/components/DataTable/components/ActionButtons.tsx +2 -2
  185. package/src/components/DataTable/components/DataTableCore.tsx +2 -2
  186. package/src/components/DataTable/components/UnifiedTableBody.tsx +1 -1
  187. package/src/components/DataTable/utils/debugTools.ts +2 -2
  188. package/src/components/Dialog/Dialog.test.tsx +12 -2
  189. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +6 -6
  190. package/src/components/ErrorBoundary/ErrorBoundary.tsx +2 -2
  191. package/src/components/FileDisplay.tsx +233 -0
  192. package/src/components/FileUpload.tsx +176 -0
  193. package/src/components/Footer/Footer.test.tsx +7 -7
  194. package/src/components/NavigationMenu/NavigationMenu.test.tsx +13 -6
  195. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +30 -3
  196. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  197. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +558 -0
  198. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  199. package/src/components/PublicLayout/PublicPageDebugger.tsx +2 -2
  200. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +2 -2
  201. package/src/components/PublicLayout/PublicPageProvider.tsx +2 -2
  202. package/src/components/Select/Select.test.tsx +50 -15
  203. package/src/components/SuperAdminGuard.tsx +2 -2
  204. package/src/components/__tests__/SuperAdminGuard.test.tsx +559 -0
  205. package/src/components/index.ts +0 -183
  206. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  207. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +1 -1
  208. package/src/hooks/__tests__/useRBAC.unit.test.ts +191 -138
  209. package/src/hooks/public/usePublicEvent.ts +2 -2
  210. package/src/hooks/useAppConfig.ts +3 -3
  211. package/src/hooks/useComponentPerformance.ts +1 -1
  212. package/src/hooks/useDataTablePerformance.ts +1 -1
  213. package/src/hooks/useFileReference.ts +232 -0
  214. package/src/hooks/useOrganisationPermissions.test.ts +254 -344
  215. package/src/hooks/useOrganisationPermissions.ts +15 -7
  216. package/src/hooks/useOrganisationSecurity.test.ts +390 -402
  217. package/src/hooks/usePerformanceMonitor.ts +1 -1
  218. package/src/hooks/usePermissionCache.test.ts +264 -395
  219. package/src/hooks/usePermissionCache.ts +34 -4
  220. package/src/hooks/useSecureDataAccess.test.ts +486 -0
  221. package/src/hooks/useSecureDataAccess.ts +4 -1
  222. package/src/providers/InactivityProvider.tsx +2 -2
  223. package/src/providers/OrganisationProvider.test.simple.tsx +168 -0
  224. package/src/providers/OrganisationProvider.test.tsx +168 -0
  225. package/src/providers/OrganisationProvider.tsx +18 -31
  226. package/src/providers/UnifiedAuthProvider.test.simple.tsx +205 -0
  227. package/src/providers/UnifiedAuthProvider.test.tsx +128 -0
  228. package/src/providers/__tests__/InactivityProvider.test.tsx +3 -4
  229. package/src/providers/__tests__/OrganisationProvider.test.tsx +19 -14
  230. package/src/rbac/__tests__/integration.authflow.test.tsx +123 -0
  231. package/src/rbac/__tests__/integration.navigation.test.tsx +72 -0
  232. package/src/rbac/__tests__/integration.securedata.test.tsx +92 -0
  233. package/src/rbac/__tests__/integration.smoke.test.tsx +73 -0
  234. package/src/rbac/__tests__/rbac-core.test.tsx +26 -22
  235. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +411 -0
  236. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +285 -0
  237. package/src/rbac/__tests__/rbac-functions.test.ts +655 -0
  238. package/src/rbac/__tests__/rbac-integration.test.ts +532 -0
  239. package/src/rbac/__tests__/scenarios.user-role.test.tsx +196 -0
  240. package/src/rbac/api.test.ts +6 -6
  241. package/src/rbac/api.ts +2 -2
  242. package/src/rbac/audit.test.ts +485 -0
  243. package/src/rbac/audit.ts +7 -1
  244. package/src/rbac/cache-invalidation.ts +318 -0
  245. package/src/rbac/cache.test.ts +286 -0
  246. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +559 -0
  247. package/src/rbac/components/EnhancedNavigationMenu.tsx +29 -23
  248. package/src/rbac/components/NavigationProvider.test.tsx +449 -0
  249. package/src/rbac/components/PagePermissionGuard.tsx +4 -4
  250. package/src/rbac/components/PagePermissionProvider.test.tsx +479 -0
  251. package/src/rbac/components/SecureDataProvider.test.tsx +511 -0
  252. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +159 -430
  253. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +4 -5
  254. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +112 -118
  255. package/src/rbac/config.test.ts +410 -0
  256. package/src/rbac/engine.test.simple.ts +237 -0
  257. package/src/rbac/engine.test.ts +233 -0
  258. package/src/rbac/engine.ts +37 -41
  259. package/src/rbac/examples/CompleteRBACExample.tsx +3 -3
  260. package/src/rbac/examples/EventBasedApp.tsx +4 -4
  261. package/src/rbac/hooks/useRBAC.simple.test.ts +16 -0
  262. package/src/rbac/hooks/useRBAC.test.ts +207 -455
  263. package/src/rbac/hooks/useRBAC.ts +30 -22
  264. package/src/rbac/permissions.test.ts +128 -0
  265. package/src/rbac/permissions.ts +56 -141
  266. package/src/rbac/providers/RBACProvider.tsx +1 -1
  267. package/src/rbac/secureClient.test.ts +444 -0
  268. package/src/rbac/security.test.ts +390 -0
  269. package/src/rbac/security.ts +1 -1
  270. package/src/rbac/types.test.ts +382 -0
  271. package/src/rbac/types.ts +2 -2
  272. package/src/styles/core.css +0 -125
  273. package/src/types/file-reference.ts +77 -0
  274. package/src/types/rbac-functions.ts +290 -0
  275. package/src/types/supabase.ts +10 -28
  276. package/src/types/unified.ts +4 -1
  277. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +81 -55
  278. package/src/utils/__tests__/lazyLoad.unit.test.tsx +21 -12
  279. package/src/utils/__tests__/organisationContext.unit.test.ts +13 -7
  280. package/src/utils/__tests__/performanceBudgets.unit.test.ts +3 -3
  281. package/src/utils/__tests__/sessionTracking.unit.test.ts +32 -12
  282. package/src/utils/appConfig.ts +1 -1
  283. package/src/utils/appIdResolver.test.ts +503 -0
  284. package/src/utils/appIdResolver.ts +1 -1
  285. package/src/utils/appNameResolver.test.ts +494 -0
  286. package/src/utils/appNameResolver.ts +3 -2
  287. package/src/utils/bundleAnalysis.ts +3 -3
  288. package/src/utils/debugLogger.ts +1 -1
  289. package/src/utils/file-reference.ts +263 -0
  290. package/src/utils/formatDate.test.ts +2 -2
  291. package/src/utils/organisationContext.test.ts +340 -0
  292. package/src/utils/organisationContext.ts +19 -6
  293. package/src/utils/performanceBudgets.ts +2 -2
  294. package/src/utils/permissionUtils.test.ts +393 -0
  295. package/src/utils/permissionUtils.ts +5 -2
  296. package/src/utils/secureDataAccess.test.ts +715 -0
  297. package/src/utils/secureDataAccess.ts +21 -5
  298. package/src/utils/sessionTracking.ts +34 -4
  299. package/src/utils/storage/__tests__/helpers.unit.test.ts +328 -0
  300. package/src/utils/storage/__tests__/index.unit.test.ts +16 -0
  301. package/src/utils/storage/helpers.ts +20 -25
  302. package/src/utils/storage/index.ts +29 -1
  303. package/src/vite-env.d.ts +17 -0
  304. package/dist/chunk-22KLBHPS.js.map +0 -1
  305. package/dist/chunk-7BNPOCLL.js.map +0 -1
  306. package/dist/chunk-BC3S53OZ.js.map +0 -1
  307. package/dist/chunk-GWSBHC4J.js.map +0 -1
  308. package/dist/chunk-MYP2EGHX.js.map +0 -1
  309. package/dist/chunk-MZBUOP4P.js.map +0 -1
  310. package/dist/chunk-NYUJ4FJR.js.map +0 -1
  311. package/dist/chunk-NZ655MWE.js.map +0 -1
  312. package/dist/chunk-SS3E6QLB.js.map +0 -1
  313. package/dist/chunk-TRIZ7IB7.js.map +0 -1
  314. package/dist/chunk-WJARTBCT.js.map +0 -1
  315. package/dist/chunk-YDJW5XTN.js.map +0 -1
  316. package/docs/print-components/README.md +0 -258
  317. package/docs/print-components/api-reference.md +0 -636
  318. package/docs/print-components/examples/README.md +0 -204
  319. package/docs/print-components/examples/basic-report.tsx +0 -92
  320. package/docs/print-components/examples/card-catalog.tsx +0 -149
  321. package/docs/print-components/examples/cover-page-report.tsx +0 -163
  322. package/docs/print-components/quick-start.md +0 -363
  323. package/src/components/PrintButton/PrintButton.tsx +0 -321
  324. package/src/components/PrintButton/PrintButtonGroup.tsx +0 -84
  325. package/src/components/PrintButton/PrintToolbar.tsx +0 -94
  326. package/src/components/PrintButton/__tests__/PrintButton.test.tsx +0 -271
  327. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +0 -438
  328. package/src/components/PrintButton/index.ts +0 -33
  329. package/src/components/PrintButton/types.ts +0 -173
  330. package/src/components/PrintCard/PrintCard.tsx +0 -154
  331. package/src/components/PrintCard/PrintCardContent.tsx +0 -57
  332. package/src/components/PrintCard/PrintCardFooter.tsx +0 -60
  333. package/src/components/PrintCard/PrintCardGrid.tsx +0 -91
  334. package/src/components/PrintCard/PrintCardHeader.tsx +0 -78
  335. package/src/components/PrintCard/PrintCardImage.tsx +0 -81
  336. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +0 -239
  337. package/src/components/PrintCard/index.ts +0 -34
  338. package/src/components/PrintCard/types.ts +0 -171
  339. package/src/components/PrintDataTable/PrintDataTable.tsx +0 -215
  340. package/src/components/PrintDataTable/PrintTableGroup.tsx +0 -90
  341. package/src/components/PrintDataTable/PrintTableRow.tsx +0 -76
  342. package/src/components/PrintDataTable/index.ts +0 -25
  343. package/src/components/PrintDataTable/types.ts +0 -67
  344. package/src/components/PrintFooter/PrintFooter.tsx +0 -183
  345. package/src/components/PrintFooter/PrintFooterContent.tsx +0 -71
  346. package/src/components/PrintFooter/PrintFooterInfo.tsx +0 -86
  347. package/src/components/PrintFooter/PrintPageNumber.tsx +0 -90
  348. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +0 -390
  349. package/src/components/PrintFooter/index.ts +0 -30
  350. package/src/components/PrintFooter/types.ts +0 -149
  351. package/src/components/PrintGrid/PrintGrid.tsx +0 -180
  352. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +0 -109
  353. package/src/components/PrintGrid/PrintGridContainer.tsx +0 -128
  354. package/src/components/PrintGrid/PrintGridItem.tsx +0 -220
  355. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +0 -359
  356. package/src/components/PrintGrid/index.ts +0 -31
  357. package/src/components/PrintGrid/types.ts +0 -159
  358. package/src/components/PrintHeader/PrintCoverHeader.tsx +0 -230
  359. package/src/components/PrintHeader/PrintHeader.tsx +0 -150
  360. package/src/components/PrintHeader/index.ts +0 -17
  361. package/src/components/PrintHeader/types.ts +0 -42
  362. package/src/components/PrintLayout/PrintLayout.tsx +0 -122
  363. package/src/components/PrintLayout/PrintLayoutContext.tsx +0 -66
  364. package/src/components/PrintLayout/PrintPageBreak.tsx +0 -52
  365. package/src/components/PrintLayout/examples/PrintShowcase.tsx +0 -230
  366. package/src/components/PrintLayout/index.ts +0 -19
  367. package/src/components/PrintLayout/types.ts +0 -37
  368. package/src/components/PrintPageBreak/PrintPageBreak.tsx +0 -120
  369. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +0 -90
  370. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +0 -112
  371. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +0 -279
  372. package/src/components/PrintPageBreak/index.ts +0 -23
  373. package/src/components/PrintPageBreak/types.ts +0 -94
  374. package/src/components/PrintSection/PrintColumn.tsx +0 -104
  375. package/src/components/PrintSection/PrintDivider.tsx +0 -101
  376. package/src/components/PrintSection/PrintSection.tsx +0 -129
  377. package/src/components/PrintSection/PrintSectionContent.tsx +0 -75
  378. package/src/components/PrintSection/PrintSectionHeader.tsx +0 -97
  379. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +0 -258
  380. package/src/components/PrintSection/index.ts +0 -33
  381. package/src/components/PrintSection/types.ts +0 -155
  382. package/src/components/PrintText/PrintText.tsx +0 -116
  383. package/src/components/PrintText/index.ts +0 -16
  384. package/src/components/PrintText/types.ts +0 -24
  385. package/src/rbac/__tests__/integration.test.tsx +0 -218
  386. package/src/utils/print/PrintDataProcessor.ts +0 -390
  387. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +0 -397
  388. package/src/utils/print/index.ts +0 -29
  389. package/src/utils/print/types.ts +0 -196
  390. package/src/utils/print/usePrintOptimization.ts +0 -272
  391. /package/dist/{DataTable-7FMFXA7A.js.map → DataTable-4T627QFJ.js.map} +0 -0
  392. /package/dist/{api-H5A3H4IR.js.map → api-LUNF5O6M.js.map} +0 -0
  393. /package/dist/{appNameResolver-7GHF5ED2.js.map → appNameResolver-UURKN7NF.js.map} +0 -0
  394. /package/dist/{audit-BUW3LMJB.js.map → audit-6TOCAMKO.js.map} +0 -0
  395. /package/dist/{chunk-NRK4AIHQ.js.map → chunk-KBRACSJI.js.map} +0 -0
  396. /package/dist/{chunk-6MTY77WU.js.map → chunk-TNMXZLDR.js.map} +0 -0
@@ -7,7 +7,6 @@ import {
7
7
  EventLogoCompact,
8
8
  EventLogoLarge,
9
9
  EventSelector,
10
- FileUpload,
11
10
  Footer,
12
11
  Form,
13
12
  Header,
@@ -45,11 +44,17 @@ import {
45
44
  ToastViewport,
46
45
  Toaster,
47
46
  UserMenu,
47
+ deleteFile,
48
+ extractFileMetadata,
49
+ generateFilePath,
50
+ getPublicUrl,
51
+ getSignedUrl,
52
+ uploadFile,
48
53
  useFileUpload,
49
54
  usePublicPageContext as usePublicPageContext2,
50
55
  useStorage,
51
56
  useToast
52
- } from "./chunk-TRIZ7IB7.js";
57
+ } from "./chunk-MPQDF75X.js";
53
58
  import {
54
59
  Alert,
55
60
  AlertDescription,
@@ -72,14 +77,14 @@ import {
72
77
  SelectSeparator,
73
78
  SelectTrigger,
74
79
  SelectValue
75
- } from "./chunk-MSFACPQQ.js";
80
+ } from "./chunk-PAEM3OWN.js";
76
81
  import {
77
82
  useRBAC
78
- } from "./chunk-BC3S53OZ.js";
79
- import "./chunk-GWSBHC4J.js";
80
- import "./chunk-7BNPOCLL.js";
81
- import "./chunk-6MTY77WU.js";
82
- import "./chunk-NRK4AIHQ.js";
83
+ } from "./chunk-UQE2Y64H.js";
84
+ import "./chunk-KLPVOPRI.js";
85
+ import "./chunk-B2WTCLCV.js";
86
+ import "./chunk-TNMXZLDR.js";
87
+ import "./chunk-KBRACSJI.js";
83
88
  import {
84
89
  DefaultPublicErrorFallback,
85
90
  PublicErrorBoundary,
@@ -87,8 +92,8 @@ import {
87
92
  useErrorBoundary,
88
93
  useIsPublicPage,
89
94
  usePublicPageContext
90
- } from "./chunk-NYUJ4FJR.js";
91
- import "./chunk-SS3E6QLB.js";
95
+ } from "./chunk-KJDPSM64.js";
96
+ import "./chunk-YNUBMSMV.js";
92
97
  import {
93
98
  Button,
94
99
  Dialog,
@@ -112,17 +117,17 @@ import {
112
117
  init_Tooltip2 as init_Tooltip,
113
118
  init_UnifiedAuthProvider,
114
119
  useUnifiedAuth
115
- } from "./chunk-EL2O4IUX.js";
116
- import "./chunk-YDJW5XTN.js";
120
+ } from "./chunk-AQFRLC7K.js";
121
+ import "./chunk-STT7INZR.js";
117
122
  import {
118
123
  LoadingSpinner
119
124
  } from "./chunk-CDQ3PX7L.js";
120
- import "./chunk-MZBUOP4P.js";
121
- import "./chunk-74C6SNEC.js";
125
+ import "./chunk-5BSLGBYI.js";
126
+ import "./chunk-ZPK5656W.js";
122
127
  import {
123
128
  cn,
124
129
  init_cn
125
- } from "./chunk-WJARTBCT.js";
130
+ } from "./chunk-D7ARGIA3.js";
126
131
  import "./chunk-PLDDJCW6.js";
127
132
 
128
133
  // src/components/index.ts
@@ -351,7 +356,7 @@ function SuperAdminBadge() {
351
356
  }
352
357
  function SuperAdminDebugPanel() {
353
358
  const { isSuperAdmin, isLoading } = useRBAC();
354
- if (!isSuperAdmin) {
359
+ if (import.meta.env.MODE !== "development" && !isSuperAdmin) {
355
360
  return null;
356
361
  }
357
362
  return /* @__PURE__ */ jsxs4("div", { className: "super-admin-debug-panel", children: [
@@ -370,3104 +375,451 @@ function SuperAdminDebugPanel() {
370
375
  /* @__PURE__ */ jsxs4("p", { children: [
371
376
  /* @__PURE__ */ jsx5("strong", { children: "Environment:" }),
372
377
  " ",
373
- "production"
378
+ import.meta.env.MODE
374
379
  ] })
375
380
  ] })
376
381
  ] });
377
382
  }
378
383
 
379
- // src/components/PrintLayout/PrintLayout.tsx
380
- init_cn();
381
-
382
- // src/components/PrintLayout/PrintLayoutContext.tsx
383
- import { createContext, useContext, useState as useState2, useEffect as useEffect2 } from "react";
384
- import { jsx as jsx6 } from "react/jsx-runtime";
385
- var PrintLayoutContext = createContext(void 0);
386
- function PrintLayoutProvider({
387
- children,
388
- pageSize,
389
- orientation,
390
- hasFirstPageHeader,
391
- hasSubsequentPageHeader
392
- }) {
393
- const [isFirstPage, setIsFirstPage] = useState2(true);
394
- useEffect2(() => {
395
- const handleResize = () => {
396
- setIsFirstPage(true);
397
- };
398
- window.addEventListener("resize", handleResize);
399
- return () => window.removeEventListener("resize", handleResize);
400
- }, []);
401
- const value = {
402
- isFirstPage,
403
- pageSize,
404
- orientation,
405
- hasFirstPageHeader,
406
- hasSubsequentPageHeader
407
- };
408
- return /* @__PURE__ */ jsx6(PrintLayoutContext.Provider, { value, children });
409
- }
410
- function usePrintLayout() {
411
- const context = useContext(PrintLayoutContext);
412
- if (context === void 0) {
413
- throw new Error("usePrintLayout must be used within a PrintLayoutProvider");
414
- }
415
- return context;
416
- }
417
-
418
- // src/components/PrintLayout/PrintLayout.tsx
419
- import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
420
- function PrintLayout({
421
- children,
422
- orientation = "portrait",
423
- pageSize = "A4",
424
- showHeader = true,
425
- showFooter = true,
426
- firstPageHeader,
427
- subsequentPageHeader,
428
- className,
429
- ...props
430
- }) {
431
- const hasFirstPageHeader = Boolean(firstPageHeader);
432
- const hasSubsequentPageHeader = Boolean(subsequentPageHeader);
433
- const getPageSizeClass = () => {
434
- if (pageSize === "A4") {
435
- return orientation === "landscape" ? "print-a4-landscape" : "print-a4-portrait";
436
- }
437
- return "print-a4-portrait";
438
- };
439
- const getHeaderClass = () => {
440
- if (hasFirstPageHeader && hasSubsequentPageHeader) {
441
- return "print-first-page-header print-subsequent-header";
442
- }
443
- if (hasFirstPageHeader) {
444
- return "print-first-page-header";
445
- }
446
- if (hasSubsequentPageHeader) {
447
- return "print-subsequent-header";
448
- }
449
- return "";
450
- };
451
- return /* @__PURE__ */ jsx7(
452
- PrintLayoutProvider,
453
- {
454
- pageSize,
455
- orientation,
456
- hasFirstPageHeader,
457
- hasSubsequentPageHeader,
458
- children: /* @__PURE__ */ jsxs5(
459
- "div",
460
- {
461
- className: cn(
462
- "print-layout",
463
- getPageSizeClass(),
464
- getHeaderClass(),
465
- className
466
- ),
467
- ...props,
468
- children: [
469
- hasFirstPageHeader && /* @__PURE__ */ jsx7("div", { className: "print-first-page-only", children: firstPageHeader }),
470
- hasSubsequentPageHeader && /* @__PURE__ */ jsx7("div", { className: "print-subsequent-pages-only", children: subsequentPageHeader }),
471
- /* @__PURE__ */ jsx7("div", { className: "print-text", children })
472
- ]
473
- }
474
- )
475
- }
476
- );
477
- }
478
-
479
- // src/components/PrintHeader/PrintHeader.tsx
480
- init_cn();
481
-
482
- // src/components/PrintText/PrintText.tsx
483
- init_cn();
484
- import { jsx as jsx8 } from "react/jsx-runtime";
485
- function PrintText({
486
- children,
487
- variant = "body",
488
- weight = "normal",
489
- color = "primary",
490
- printOptimized = true,
491
- className,
492
- as: Component = "p",
493
- ...props
494
- }) {
495
- const getVariantClasses = (variant2) => {
496
- const baseClasses = "print-text";
497
- switch (variant2) {
498
- case "heading":
499
- return cn(baseClasses, "text-2xl leading-tight");
500
- case "subheading":
501
- return cn(baseClasses, "text-xl leading-snug");
502
- case "body":
503
- return cn(baseClasses, "text-base leading-relaxed");
504
- case "caption":
505
- return cn(baseClasses, "text-sm leading-normal");
506
- case "small":
507
- return cn(baseClasses, "text-xs leading-tight");
508
- default:
509
- return baseClasses;
510
- }
511
- };
512
- const getWeightClasses = (weight2) => {
513
- switch (weight2) {
514
- case "normal":
515
- return "font-normal";
516
- case "medium":
517
- return "font-medium";
518
- case "semibold":
519
- return "font-semibold";
520
- case "bold":
521
- return "font-bold";
522
- default:
523
- return "font-normal";
524
- }
525
- };
526
- const getColorClasses = (color2) => {
527
- switch (color2) {
528
- case "primary":
529
- return "text-foreground";
530
- case "secondary":
531
- return "text-secondary-foreground";
532
- case "muted":
533
- return "text-muted-foreground";
534
- case "accent":
535
- return "text-accent-foreground";
536
- default:
537
- return "text-foreground";
538
- }
539
- };
540
- const getPrintOptimizedClasses = () => {
541
- if (!printOptimized) return "";
542
- return cn(
543
- "print-text",
544
- // Print-specific font sizing
545
- "print:text-sm print:leading-tight",
546
- // High contrast for print
547
- "print:text-black print:bg-white"
548
- );
549
- };
550
- return /* @__PURE__ */ jsx8(
551
- Component,
552
- {
553
- className: cn(
554
- getVariantClasses(variant),
555
- getWeightClasses(weight),
556
- getColorClasses(color),
557
- getPrintOptimizedClasses(),
558
- className
559
- ),
560
- ...props,
561
- children
562
- }
563
- );
564
- }
384
+ // src/components/FileUpload.tsx
385
+ import { useState as useState3, useCallback as useCallback2, useRef } from "react";
565
386
 
566
- // src/components/PrintHeader/PrintHeader.tsx
567
- import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
568
- function PrintHeader({
569
- title,
570
- subtitle,
571
- branding,
572
- metadata = [],
573
- printDate = true,
574
- className
575
- }) {
576
- const formatPrintDate = () => {
577
- return (/* @__PURE__ */ new Date()).toLocaleDateString("en-AU", {
578
- year: "numeric",
579
- month: "long",
580
- day: "numeric"
581
- });
582
- };
583
- const renderBranding = (branding2) => {
584
- const { logo, companyName, projectName, version, tagline } = branding2;
585
- return /* @__PURE__ */ jsxs6("div", { className: "flex items-center space-x-4 mb-4", children: [
586
- logo && /* @__PURE__ */ jsx9(
587
- "img",
588
- {
589
- src: logo,
590
- alt: companyName || "Company Logo",
591
- className: "h-8 w-auto print:h-6"
592
- }
593
- ),
594
- /* @__PURE__ */ jsxs6("div", { className: "flex-1", children: [
595
- companyName && /* @__PURE__ */ jsx9(PrintText, { variant: "subheading", weight: "semibold", className: "mb-1", children: companyName }),
596
- projectName && /* @__PURE__ */ jsx9(PrintText, { variant: "body", color: "muted", className: "mb-1", children: projectName }),
597
- version && /* @__PURE__ */ jsx9(PrintText, { variant: "small", color: "muted", children: version }),
598
- tagline && /* @__PURE__ */ jsx9(PrintText, { variant: "small", color: "muted", className: "italic", children: tagline })
599
- ] })
600
- ] });
601
- };
602
- const renderMetadata = (metadata2) => {
603
- if (metadata2.length === 0) return null;
604
- return /* @__PURE__ */ jsx9("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 mb-4", children: metadata2.map((item, index) => /* @__PURE__ */ jsxs6("div", { className: "flex items-center space-x-2", children: [
605
- item.icon && /* @__PURE__ */ jsx9(item.icon, { className: "h-4 w-4 text-muted-foreground print:h-3 print:w-3" }),
606
- /* @__PURE__ */ jsxs6("div", { children: [
607
- /* @__PURE__ */ jsx9(PrintText, { variant: "small", color: "muted", className: "block", children: item.label }),
608
- /* @__PURE__ */ jsx9(PrintText, { variant: "body", weight: "medium", className: "block", children: item.value })
609
- ] })
610
- ] }, index)) });
611
- };
612
- return /* @__PURE__ */ jsxs6("header", { className: cn("print-header border-b border-border pb-4 mb-6", className), children: [
613
- branding && renderBranding(branding),
614
- /* @__PURE__ */ jsxs6("div", { className: "mb-4", children: [
615
- /* @__PURE__ */ jsx9(PrintText, { variant: "heading", className: "mb-2", children: title }),
616
- subtitle && /* @__PURE__ */ jsx9(PrintText, { variant: "subheading", color: "muted", children: subtitle })
617
- ] }),
618
- metadata.length > 0 && renderMetadata(metadata),
619
- printDate && /* @__PURE__ */ jsx9("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxs6(PrintText, { variant: "small", color: "muted", children: [
620
- "Printed on ",
621
- formatPrintDate()
622
- ] }) })
623
- ] });
624
- }
387
+ // src/hooks/useFileReference.ts
388
+ import { useState as useState2, useCallback } from "react";
625
389
 
626
- // src/components/PrintHeader/PrintCoverHeader.tsx
627
- init_cn();
628
- import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
629
- function PrintCoverHeader({
630
- title,
631
- subtitle,
632
- branding,
633
- metadata = [],
634
- printDate = true,
635
- coverStyle = true,
636
- logoSize = "medium",
637
- titleSize = "large",
638
- showDivider = false,
639
- backgroundImage,
640
- backgroundColor,
641
- className
642
- }) {
643
- const formatPrintDate = () => {
644
- return (/* @__PURE__ */ new Date()).toLocaleDateString("en-AU", {
645
- year: "numeric",
646
- month: "long",
647
- day: "numeric"
648
- });
649
- };
650
- const getLogoSizeClasses = (size) => {
651
- switch (size) {
652
- case "small":
653
- return "h-16 w-auto print:h-12";
654
- case "medium":
655
- return "h-24 w-auto print:h-20";
656
- case "large":
657
- return "h-32 w-auto print:h-24";
658
- default:
659
- return "h-24 w-auto print:h-20";
660
- }
661
- };
662
- const getTitleSizeClasses = (size) => {
663
- switch (size) {
664
- case "small":
665
- return "text-3xl print:text-2xl";
666
- case "medium":
667
- return "text-4xl print:text-3xl";
668
- case "large":
669
- return "text-5xl print:text-4xl";
670
- case "xl":
671
- return "text-6xl print:text-5xl";
672
- default:
673
- return "text-4xl print:text-3xl";
674
- }
675
- };
676
- const getBackgroundStyle = () => {
677
- const style = {};
678
- if (backgroundImage) {
679
- style.backgroundImage = `url(${backgroundImage})`;
680
- style.backgroundSize = "cover";
681
- style.backgroundPosition = "center";
682
- style.backgroundRepeat = "no-repeat";
683
- }
684
- if (backgroundColor) {
685
- style.backgroundColor = backgroundColor;
390
+ // src/utils/file-reference.ts
391
+ var FileReferenceServiceImpl = class {
392
+ constructor(supabase) {
393
+ this.supabase = supabase;
394
+ }
395
+ async createFileReference(options, file) {
396
+ try {
397
+ const filePath = generateFilePath({
398
+ appName: "file-reference",
399
+ orgId: options.organisation_id,
400
+ isPublic: options.is_public || false
401
+ }, file.name);
402
+ const uploadResult = await uploadFile(this.supabase, file, {
403
+ appName: "file-reference",
404
+ orgId: options.organisation_id,
405
+ isPublic: options.is_public || false,
406
+ customPath: filePath
407
+ });
408
+ if (!uploadResult.success) {
409
+ throw new Error(`Failed to upload file: ${uploadResult.error}`);
410
+ }
411
+ const metadata = await extractFileMetadata(file, {
412
+ appName: "file-reference",
413
+ orgId: options.organisation_id,
414
+ isPublic: options.is_public || false
415
+ }, "system");
416
+ const { data, error } = await this.supabase.rpc("insert_file_reference", {
417
+ p_table_name: options.table_name,
418
+ p_record_id: options.record_id,
419
+ p_file_path: filePath,
420
+ p_organisation_id: options.organisation_id,
421
+ p_app_id: options.app_id,
422
+ p_file_metadata: {
423
+ fileName: file.name,
424
+ fileType: file.type,
425
+ fileSize: file.size,
426
+ category: options.category,
427
+ ...metadata,
428
+ ...options.custom_metadata
429
+ },
430
+ p_is_public: options.is_public || false
431
+ });
432
+ if (error) {
433
+ await deleteFile(this.supabase, filePath);
434
+ throw new Error(`Failed to create file reference: ${error.message}`);
435
+ }
436
+ const { data: fileRef, error: fetchError } = await this.supabase.from("file_references").select("*").eq("id", data).single();
437
+ if (fetchError || !fileRef) {
438
+ throw new Error(`Failed to fetch created file reference: ${fetchError?.message}`);
439
+ }
440
+ return fileRef;
441
+ } catch (error) {
442
+ console.error("Error creating file reference:", error);
443
+ throw error;
686
444
  }
687
- return style;
688
- };
689
- const renderBranding = () => {
690
- if (!branding) return null;
691
- const { logo, companyName, projectName, version, tagline } = branding;
692
- return /* @__PURE__ */ jsxs7("div", { className: "flex flex-col items-center text-center mb-8", children: [
693
- logo && /* @__PURE__ */ jsx10(
694
- "img",
695
- {
696
- src: logo,
697
- alt: companyName || "Company Logo",
698
- className: cn(
699
- getLogoSizeClasses(logoSize),
700
- "mb-4"
701
- )
445
+ }
446
+ async getFileReference(table_name, record_id, organisation_id) {
447
+ try {
448
+ const { data, error } = await this.supabase.from("file_references").select("*").eq("table_name", table_name).eq("record_id", record_id).eq("organisation_id", organisation_id).single();
449
+ if (error) {
450
+ if (error.code === "PGRST116") {
451
+ return null;
702
452
  }
703
- ),
704
- companyName && /* @__PURE__ */ jsx10(PrintText, { variant: "subheading", weight: "semibold", className: "mb-2", children: companyName }),
705
- projectName && /* @__PURE__ */ jsx10(PrintText, { variant: "body", color: "muted", className: "mb-2", children: projectName }),
706
- version && /* @__PURE__ */ jsx10(PrintText, { variant: "small", color: "muted", className: "mb-2", children: version }),
707
- tagline && /* @__PURE__ */ jsx10(PrintText, { variant: "small", color: "muted", className: "italic", children: tagline })
708
- ] });
709
- };
710
- const renderMetadata = () => {
711
- if (metadata.length === 0) return null;
712
- return /* @__PURE__ */ jsx10("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-6 mb-8", children: metadata.map((item, index) => /* @__PURE__ */ jsxs7("div", { className: "flex items-center space-x-3", children: [
713
- item.icon && /* @__PURE__ */ jsx10(item.icon, { className: "h-5 w-5 text-muted-foreground print:h-4 print:w-4" }),
714
- /* @__PURE__ */ jsxs7("div", { children: [
715
- /* @__PURE__ */ jsx10(PrintText, { variant: "small", color: "muted", className: "block", children: item.label }),
716
- /* @__PURE__ */ jsx10(PrintText, { variant: "body", weight: "medium", className: "block", children: item.value })
717
- ] })
718
- ] }, index)) });
719
- };
720
- return /* @__PURE__ */ jsxs7(
721
- "header",
722
- {
723
- className: cn(
724
- "print-cover-header min-h-[400px] flex flex-col justify-center px-8 py-12",
725
- "print:min-h-[300px] print:px-6 print:py-8",
726
- className
727
- ),
728
- style: getBackgroundStyle(),
729
- children: [
730
- renderBranding(),
731
- /* @__PURE__ */ jsxs7("div", { className: "text-center mb-8", children: [
732
- /* @__PURE__ */ jsx10(
733
- PrintText,
734
- {
735
- variant: "heading",
736
- className: cn(
737
- "mb-4",
738
- getTitleSizeClasses(titleSize)
739
- ),
740
- children: title
741
- }
742
- ),
743
- subtitle && /* @__PURE__ */ jsx10(PrintText, { variant: "subheading", color: "muted", className: "max-w-3xl mx-auto", children: subtitle })
744
- ] }),
745
- showDivider && /* @__PURE__ */ jsx10("div", { className: "w-24 h-1 bg-primary mx-auto mb-8" }),
746
- renderMetadata(),
747
- printDate && /* @__PURE__ */ jsx10("div", { className: "flex justify-center mt-auto", children: /* @__PURE__ */ jsxs7(PrintText, { variant: "small", color: "muted", children: [
748
- "Printed on ",
749
- formatPrintDate()
750
- ] }) })
751
- ]
752
- }
753
- );
754
- }
755
-
756
- // src/components/PrintDataTable/PrintDataTable.tsx
757
- init_cn();
758
-
759
- // src/components/PrintDataTable/PrintTableGroup.tsx
760
- init_cn();
761
-
762
- // src/components/PrintDataTable/PrintTableRow.tsx
763
- init_cn();
764
- import { jsx as jsx11 } from "react/jsx-runtime";
765
- function PrintTableRow({
766
- row,
767
- columns,
768
- styling = {
769
- headerStyle: "solid",
770
- rowStyle: "striped",
771
- cellPadding: "normal"
772
- },
773
- printOptimized = true,
774
- isEven = false
775
- }) {
776
- const getRowClasses = () => {
777
- const baseClasses = "border-b border-border";
778
- switch (styling.rowStyle) {
779
- case "striped":
780
- return cn(baseClasses, isEven ? "bg-muted/30" : "bg-background");
781
- case "solid":
782
- return cn(baseClasses, "bg-background");
783
- case "bordered":
784
- return cn(baseClasses, "border border-border bg-background");
785
- default:
786
- return baseClasses;
787
- }
788
- };
789
- const getCellPaddingClasses = () => {
790
- switch (styling.cellPadding) {
791
- case "compact":
792
- return "px-2 py-1 print:px-1 print:py-0.5";
793
- case "spacious":
794
- return "px-6 py-4 print:px-4 print:py-2";
795
- case "normal":
796
- default:
797
- return "px-4 py-2 print:px-2 print:py-1";
798
- }
799
- };
800
- return /* @__PURE__ */ jsx11("tr", { className: getRowClasses(), children: columns.map((column) => /* @__PURE__ */ jsx11(
801
- "td",
802
- {
803
- className: cn(
804
- getCellPaddingClasses(),
805
- "text-left",
806
- column.align === "center" && "text-center",
807
- column.align === "right" && "text-right",
808
- column.printBreak === "avoid" && "print-break-avoid"
809
- ),
810
- children: /* @__PURE__ */ jsx11(PrintText, { variant: "small", children: column.render ? column.render(row[column.key], row) : row[column.key] ?? "" })
811
- },
812
- column.key
813
- )) });
814
- }
815
-
816
- // src/components/PrintDataTable/PrintTableGroup.tsx
817
- import { Fragment as Fragment2, jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
818
- function PrintTableGroup({
819
- groupKey,
820
- groupData,
821
- columns,
822
- groupHeader,
823
- styling = {
824
- headerStyle: "solid",
825
- rowStyle: "striped",
826
- cellPadding: "normal"
827
- },
828
- printOptimized = true
829
- }) {
830
- const getGroupHeaderClasses = () => {
831
- const baseClasses = "bg-muted text-muted-foreground font-semibold";
832
- if (printOptimized) {
833
- return cn(
834
- baseClasses,
835
- "print:bg-gray-100 print:text-black print:font-bold"
836
- );
837
- }
838
- return baseClasses;
839
- };
840
- const getCellPaddingClasses = () => {
841
- switch (styling.cellPadding) {
842
- case "compact":
843
- return "px-2 py-1 print:px-1 print:py-0.5";
844
- case "spacious":
845
- return "px-6 py-4 print:px-4 print:py-2";
846
- case "normal":
847
- default:
848
- return "px-4 py-2 print:px-2 print:py-1";
849
- }
850
- };
851
- return /* @__PURE__ */ jsxs8(Fragment2, { children: [
852
- /* @__PURE__ */ jsx12("tr", { className: getGroupHeaderClasses(), children: /* @__PURE__ */ jsx12(
853
- "td",
854
- {
855
- colSpan: columns.length,
856
- className: cn(
857
- getCellPaddingClasses(),
858
- "print-break-avoid"
859
- ),
860
- children: groupHeader ? groupHeader(groupKey) : /* @__PURE__ */ jsx12(PrintText, { variant: "small", weight: "semibold", children: groupKey })
453
+ throw new Error(`Failed to get file reference: ${error.message}`);
861
454
  }
862
- ) }),
863
- groupData.map((row, index) => /* @__PURE__ */ jsx12(
864
- PrintTableRow,
865
- {
866
- row,
867
- columns,
868
- styling,
869
- printOptimized,
870
- isEven: index % 2 === 0
871
- },
872
- index
873
- ))
874
- ] });
875
- }
876
-
877
- // src/components/PrintDataTable/PrintDataTable.tsx
878
- import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
879
- function PrintDataTable({
880
- data,
881
- columns,
882
- title,
883
- showTitle = true,
884
- grouping,
885
- styling = {
886
- headerStyle: "solid",
887
- rowStyle: "striped",
888
- cellPadding: "normal"
889
- },
890
- printOptimized = true,
891
- className,
892
- ...props
893
- }) {
894
- const getTableClasses = () => {
895
- const baseClasses = "w-full border-collapse";
896
- if (printOptimized) {
897
- return cn(
898
- baseClasses,
899
- "print:text-xs print:leading-tight",
900
- "print:border-black print:border-solid"
901
- );
902
- }
903
- return baseClasses;
904
- };
905
- const getHeaderClasses = () => {
906
- const baseClasses = "text-left font-semibold";
907
- switch (styling.headerStyle) {
908
- case "solid":
909
- return cn(baseClasses, "bg-primary text-primary-foreground");
910
- case "outline":
911
- return cn(baseClasses, "border-2 border-primary text-primary");
912
- default:
913
- return baseClasses;
455
+ return data;
456
+ } catch (error) {
457
+ console.error("Error getting file reference:", error);
458
+ throw error;
914
459
  }
915
- };
916
- const getRowClasses = (isEven) => {
917
- const baseClasses = "border-b border-border";
918
- switch (styling.rowStyle) {
919
- case "striped":
920
- return cn(baseClasses, isEven ? "bg-muted/30" : "bg-background");
921
- case "solid":
922
- return cn(baseClasses, "bg-background");
923
- case "bordered":
924
- return cn(baseClasses, "border border-border bg-background");
925
- default:
926
- return baseClasses;
460
+ }
461
+ async getFileUrl(table_name, record_id, organisation_id) {
462
+ try {
463
+ const { data, error } = await this.supabase.rpc("get_file_url", {
464
+ p_table_name: table_name,
465
+ p_record_id: record_id,
466
+ p_organisation_id: organisation_id
467
+ });
468
+ if (error) {
469
+ throw new Error(`Failed to get file URL: ${error.message}`);
470
+ }
471
+ return data;
472
+ } catch (error) {
473
+ console.error("Error getting file URL:", error);
474
+ throw error;
927
475
  }
928
- };
929
- const getCellPaddingClasses = () => {
930
- switch (styling.cellPadding) {
931
- case "compact":
932
- return "px-2 py-1 print:px-1 print:py-0.5";
933
- case "spacious":
934
- return "px-6 py-4 print:px-4 print:py-2";
935
- case "normal":
936
- default:
937
- return "px-4 py-2 print:px-2 print:py-1";
476
+ }
477
+ async getSignedUrl(table_name, record_id, organisation_id, expires_in = 3600) {
478
+ try {
479
+ const { data, error } = await this.supabase.rpc("get_file_signed_url", {
480
+ p_table_name: table_name,
481
+ p_record_id: record_id,
482
+ p_organisation_id: organisation_id,
483
+ p_expires_in: expires_in
484
+ });
485
+ if (error) {
486
+ throw new Error(`Failed to get signed URL: ${error.message}`);
487
+ }
488
+ return data;
489
+ } catch (error) {
490
+ console.error("Error getting signed URL:", error);
491
+ throw error;
938
492
  }
939
- };
940
- const renderTableHeader = () => /* @__PURE__ */ jsx13("thead", { children: /* @__PURE__ */ jsx13("tr", { className: getHeaderClasses(), children: columns.map((column) => /* @__PURE__ */ jsx13(
941
- "th",
942
- {
943
- className: cn(
944
- getCellPaddingClasses(),
945
- "text-left",
946
- column.align === "center" && "text-center",
947
- column.align === "right" && "text-right",
948
- column.printBreak === "avoid" && "print-break-avoid",
949
- column.printBreak === "always" && "print-break-before"
950
- ),
951
- style: { width: column.width },
952
- children: /* @__PURE__ */ jsx13(PrintText, { variant: "small", weight: "semibold", children: column.header })
953
- },
954
- column.key
955
- )) }) });
956
- const renderTableBody = () => {
957
- if (grouping?.enabled) {
958
- const groupedData = groupDataByField(data, grouping.groupBy);
959
- return /* @__PURE__ */ jsx13("tbody", { children: Object.entries(groupedData).map(([groupKey, groupData], groupIndex) => /* @__PURE__ */ jsx13(
960
- PrintTableGroup,
961
- {
962
- groupKey,
963
- groupData,
964
- columns,
965
- groupHeader: grouping.groupHeader,
966
- styling,
967
- printOptimized
968
- },
969
- groupKey
970
- )) });
493
+ }
494
+ async updateFileReference(id, updates) {
495
+ try {
496
+ const { data, error } = await this.supabase.from("file_references").update(updates).eq("id", id).select().single();
497
+ if (error) {
498
+ throw new Error(`Failed to update file reference: ${error.message}`);
499
+ }
500
+ return data;
501
+ } catch (error) {
502
+ console.error("Error updating file reference:", error);
503
+ throw error;
971
504
  }
972
- return /* @__PURE__ */ jsx13("tbody", { children: data.map((row, index) => /* @__PURE__ */ jsx13(
973
- "tr",
974
- {
975
- className: getRowClasses(index % 2 === 0),
976
- children: columns.map((column) => /* @__PURE__ */ jsx13(
977
- "td",
978
- {
979
- className: cn(
980
- getCellPaddingClasses(),
981
- "text-left",
982
- column.align === "center" && "text-center",
983
- column.align === "right" && "text-right",
984
- column.printBreak === "avoid" && "print-break-avoid"
985
- ),
986
- children: /* @__PURE__ */ jsx13(PrintText, { variant: "small", children: column.render ? column.render(row[column.key], row) : row[column.key] })
987
- },
988
- column.key
989
- ))
990
- },
991
- index
992
- )) });
993
- };
994
- return /* @__PURE__ */ jsxs9("div", { className: cn("print-data-table", className), ...props, children: [
995
- title && showTitle && /* @__PURE__ */ jsx13("div", { className: "mb-4", children: /* @__PURE__ */ jsx13(PrintText, { variant: "subheading", weight: "semibold", children: title }) }),
996
- /* @__PURE__ */ jsx13("div", { className: "overflow-x-auto print:overflow-visible", children: /* @__PURE__ */ jsxs9("table", { className: getTableClasses(), children: [
997
- renderTableHeader(),
998
- renderTableBody()
999
- ] }) })
1000
- ] });
1001
- }
1002
- function groupDataByField(data, field) {
1003
- return data.reduce((groups, item) => {
1004
- const key = item[field] || "Unknown";
1005
- if (!groups[key]) {
1006
- groups[key] = [];
505
+ }
506
+ async deleteFileReference(table_name, record_id, organisation_id, delete_file = false) {
507
+ try {
508
+ const { error } = await this.supabase.rpc("delete_file_reference", {
509
+ p_table_name: table_name,
510
+ p_record_id: record_id,
511
+ p_organisation_id: organisation_id,
512
+ p_delete_file: delete_file
513
+ });
514
+ if (error) {
515
+ throw new Error(`Failed to delete file reference: ${error.message}`);
516
+ }
517
+ return true;
518
+ } catch (error) {
519
+ console.error("Error deleting file reference:", error);
520
+ throw error;
1007
521
  }
1008
- groups[key].push(item);
1009
- return groups;
1010
- }, {});
1011
- }
1012
-
1013
- // src/components/PrintCard/PrintCard.tsx
1014
- init_cn();
1015
- import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
1016
- function PrintCard({
1017
- children,
1018
- title,
1019
- subtitle,
1020
- variant = "default",
1021
- size = "md",
1022
- layout = "vertical",
1023
- showBorder = true,
1024
- backgroundColor = "white",
1025
- textColor = "primary",
1026
- printOptimized = true,
1027
- className,
1028
- ...props
1029
- }) {
1030
- const getVariantClasses = (variant2) => {
1031
- switch (variant2) {
1032
- case "outlined":
1033
- return "border-2 border-border bg-transparent";
1034
- case "filled":
1035
- return "border-0 bg-muted";
1036
- case "elevated":
1037
- return "shadow-lg border-0 bg-background";
1038
- default:
1039
- return "border border-border bg-background";
522
+ }
523
+ async listFileReferences(table_name, record_id, organisation_id) {
524
+ try {
525
+ const { data, error } = await this.supabase.rpc("get_record_files", {
526
+ p_table_name: table_name,
527
+ p_record_id: record_id,
528
+ p_organisation_id: organisation_id
529
+ });
530
+ if (error) {
531
+ throw new Error(`Failed to list file references: ${error.message}`);
532
+ }
533
+ return data;
534
+ } catch (error) {
535
+ console.error("Error listing file references:", error);
536
+ throw error;
1040
537
  }
1041
- };
1042
- const getSizeClasses = (size2) => {
1043
- switch (size2) {
1044
- case "sm":
1045
- return "p-3";
1046
- case "lg":
1047
- return "p-6";
1048
- case "xl":
1049
- return "p-8";
1050
- default:
1051
- return "p-4";
538
+ }
539
+ async getFileCount(table_name, record_id, organisation_id) {
540
+ try {
541
+ const { data, error } = await this.supabase.rpc("get_record_file_count", {
542
+ p_table_name: table_name,
543
+ p_record_id: record_id,
544
+ p_organisation_id: organisation_id
545
+ });
546
+ if (error) {
547
+ throw new Error(`Failed to get file count: ${error.message}`);
548
+ }
549
+ return data || 0;
550
+ } catch (error) {
551
+ console.error("Error getting file count:", error);
552
+ throw error;
1052
553
  }
1053
- };
1054
- const getLayoutClasses = (layout2) => {
1055
- switch (layout2) {
1056
- case "horizontal":
1057
- return "flex-row items-center";
1058
- case "compact":
1059
- return "p-2";
1060
- default:
1061
- return "flex-col";
554
+ }
555
+ };
556
+ function createFileReferenceService(supabase) {
557
+ return new FileReferenceServiceImpl(supabase);
558
+ }
559
+ async function uploadFileWithReference(supabase, options, file) {
560
+ const service = createFileReferenceService(supabase);
561
+ const fileReference = await service.createFileReference(options, file);
562
+ const fileUrl = options.is_public ? getPublicUrl(supabase, fileReference.file_path) : await getSignedUrl(supabase, fileReference.file_path, {
563
+ appName: "file-reference",
564
+ orgId: options.organisation_id,
565
+ expiresIn: 3600
566
+ });
567
+ const urlString = typeof fileUrl === "string" ? fileUrl : fileUrl?.url || "";
568
+ return {
569
+ file_reference: fileReference,
570
+ file_url: urlString,
571
+ signed_url: options.is_public ? void 0 : urlString || void 0
572
+ };
573
+ }
574
+
575
+ // src/hooks/useFileReference.ts
576
+ function useFileReference(supabase) {
577
+ const [isLoading, setIsLoading] = useState2(false);
578
+ const [error, setError] = useState2(null);
579
+ const service = createFileReferenceService(supabase);
580
+ const uploadFile2 = useCallback(async (options, file) => {
581
+ setIsLoading(true);
582
+ setError(null);
583
+ try {
584
+ const result = await uploadFileWithReference(supabase, options, file);
585
+ return result;
586
+ } catch (err) {
587
+ const errorMessage = err instanceof Error ? err.message : "Upload failed";
588
+ setError(errorMessage);
589
+ return null;
590
+ } finally {
591
+ setIsLoading(false);
1062
592
  }
1063
- };
1064
- const getBackgroundClasses = (backgroundColor2, variant2) => {
1065
- if (variant2 === "outlined" && backgroundColor2 === "white") {
1066
- return "bg-transparent";
593
+ }, [supabase]);
594
+ const getFileReference = useCallback(async (table_name, record_id, organisation_id) => {
595
+ setIsLoading(true);
596
+ setError(null);
597
+ try {
598
+ return await service.getFileReference(table_name, record_id, organisation_id);
599
+ } catch (err) {
600
+ const errorMessage = err instanceof Error ? err.message : "Failed to get file reference";
601
+ setError(errorMessage);
602
+ return null;
603
+ } finally {
604
+ setIsLoading(false);
1067
605
  }
1068
- switch (backgroundColor2) {
1069
- case "gray":
1070
- return "bg-muted";
1071
- case "primary":
1072
- return "bg-primary text-primary-foreground";
1073
- case "secondary":
1074
- return "bg-secondary text-secondary-foreground";
1075
- case "accent":
1076
- return "bg-accent text-accent-foreground";
1077
- default:
1078
- return "";
606
+ }, [service]);
607
+ const getFileUrl = useCallback(async (table_name, record_id, organisation_id) => {
608
+ setIsLoading(true);
609
+ setError(null);
610
+ try {
611
+ return await service.getFileUrl(table_name, record_id, organisation_id);
612
+ } catch (err) {
613
+ const errorMessage = err instanceof Error ? err.message : "Failed to get file URL";
614
+ setError(errorMessage);
615
+ return null;
616
+ } finally {
617
+ setIsLoading(false);
1079
618
  }
1080
- };
1081
- const getTextColorClasses = (textColor2, backgroundColor2) => {
1082
- if (backgroundColor2 === "primary") {
1083
- return "text-primary-foreground";
619
+ }, [service]);
620
+ const getSignedUrl2 = useCallback(async (table_name, record_id, organisation_id, expires_in) => {
621
+ setIsLoading(true);
622
+ setError(null);
623
+ try {
624
+ return await service.getSignedUrl(table_name, record_id, organisation_id, expires_in);
625
+ } catch (err) {
626
+ const errorMessage = err instanceof Error ? err.message : "Failed to get signed URL";
627
+ setError(errorMessage);
628
+ return null;
629
+ } finally {
630
+ setIsLoading(false);
1084
631
  }
1085
- if (backgroundColor2 === "secondary") {
1086
- return "text-secondary-foreground";
632
+ }, [service]);
633
+ const updateFileReference = useCallback(async (id, updates) => {
634
+ setIsLoading(true);
635
+ setError(null);
636
+ try {
637
+ return await service.updateFileReference(id, updates);
638
+ } catch (err) {
639
+ const errorMessage = err instanceof Error ? err.message : "Failed to update file reference";
640
+ setError(errorMessage);
641
+ return null;
642
+ } finally {
643
+ setIsLoading(false);
1087
644
  }
1088
- if (backgroundColor2 === "accent") {
1089
- return "text-accent-foreground";
645
+ }, [service]);
646
+ const deleteFileReference = useCallback(async (table_name, record_id, organisation_id, delete_file) => {
647
+ setIsLoading(true);
648
+ setError(null);
649
+ try {
650
+ return await service.deleteFileReference(table_name, record_id, organisation_id, delete_file);
651
+ } catch (err) {
652
+ const errorMessage = err instanceof Error ? err.message : "Failed to delete file reference";
653
+ setError(errorMessage);
654
+ return false;
655
+ } finally {
656
+ setIsLoading(false);
1090
657
  }
1091
- switch (textColor2) {
1092
- case "secondary":
1093
- return "text-secondary-foreground";
1094
- case "muted":
1095
- return "text-muted-foreground";
1096
- case "accent":
1097
- return "text-accent-foreground";
1098
- case "destructive":
1099
- return "text-destructive-foreground";
1100
- default:
1101
- return "text-foreground";
658
+ }, [service]);
659
+ const listFileReferences = useCallback(async (table_name, record_id, organisation_id) => {
660
+ setIsLoading(true);
661
+ setError(null);
662
+ try {
663
+ return await service.listFileReferences(table_name, record_id, organisation_id);
664
+ } catch (err) {
665
+ const errorMessage = err instanceof Error ? err.message : "Failed to list file references";
666
+ setError(errorMessage);
667
+ return [];
668
+ } finally {
669
+ setIsLoading(false);
1102
670
  }
1103
- };
1104
- const getPrintOptimizedClasses = () => {
1105
- if (!printOptimized) return "";
1106
- return cn(
1107
- "print:break-inside-avoid",
1108
- "print:shadow-none",
1109
- "print:border-black",
1110
- "print:bg-white",
1111
- "print:text-black"
1112
- );
1113
- };
1114
- return /* @__PURE__ */ jsxs10(
1115
- "div",
1116
- {
1117
- className: cn(
1118
- "print-card",
1119
- "flex",
1120
- "rounded-lg",
1121
- getVariantClasses(variant),
1122
- getBackgroundClasses(backgroundColor, variant),
1123
- getTextColorClasses(textColor, backgroundColor),
1124
- getSizeClasses(size),
1125
- getLayoutClasses(layout),
1126
- getPrintOptimizedClasses(),
1127
- className
1128
- ),
1129
- ...props,
1130
- children: [
1131
- title && /* @__PURE__ */ jsxs10("div", { className: "mb-2", children: [
1132
- /* @__PURE__ */ jsx14(PrintText, { variant: "heading", weight: "semibold", children: title }),
1133
- subtitle && /* @__PURE__ */ jsx14(PrintText, { variant: "caption", color: "muted", className: "mt-1", children: subtitle })
1134
- ] }),
1135
- children
1136
- ]
671
+ }, [service]);
672
+ const getFileCount = useCallback(async (table_name, record_id, organisation_id) => {
673
+ setIsLoading(true);
674
+ setError(null);
675
+ try {
676
+ return await service.getFileCount(table_name, record_id, organisation_id);
677
+ } catch (err) {
678
+ const errorMessage = err instanceof Error ? err.message : "Failed to get file count";
679
+ setError(errorMessage);
680
+ return 0;
681
+ } finally {
682
+ setIsLoading(false);
1137
683
  }
1138
- );
1139
- }
1140
-
1141
- // src/components/PrintCard/PrintCardHeader.tsx
1142
- init_cn();
1143
- import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
1144
- function PrintCardHeader({
1145
- children,
1146
- title,
1147
- subtitle,
1148
- actions,
1149
- align = "left",
1150
- printOptimized = true,
1151
- className,
1152
- ...props
1153
- }) {
1154
- const getAlignmentClasses = (align2) => {
1155
- switch (align2) {
1156
- case "center":
1157
- return "text-center";
1158
- case "right":
1159
- return "text-right";
1160
- default:
1161
- return "text-left";
684
+ }, [service]);
685
+ const clearError = useCallback(() => {
686
+ setError(null);
687
+ }, []);
688
+ return {
689
+ isLoading,
690
+ error,
691
+ uploadFile: uploadFile2,
692
+ getFileReference,
693
+ getFileUrl,
694
+ getSignedUrl: getSignedUrl2,
695
+ updateFileReference,
696
+ deleteFileReference,
697
+ listFileReferences,
698
+ getFileCount,
699
+ clearError
700
+ };
701
+ }
702
+
703
+ // src/components/FileUpload.tsx
704
+ import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
705
+ function FileUpload({
706
+ supabase,
707
+ table_name,
708
+ record_id,
709
+ organisation_id,
710
+ app_id,
711
+ category,
712
+ accept = "*/*",
713
+ maxSize = 10 * 1024 * 1024,
714
+ // 10MB default
715
+ multiple = false,
716
+ disabled = false,
717
+ className = "",
718
+ onUploadSuccess,
719
+ onUploadError,
720
+ children
721
+ }) {
722
+ const [isDragging, setIsDragging] = useState3(false);
723
+ const fileInputRef = useRef(null);
724
+ const { uploadFile: uploadFile2, isLoading, error } = useFileReference(supabase);
725
+ const handleFileSelect = useCallback2(async (files) => {
726
+ if (!files || files.length === 0) return;
727
+ const fileArray = Array.from(files);
728
+ const oversizedFiles = fileArray.filter((file) => file.size > maxSize);
729
+ if (oversizedFiles.length > 0) {
730
+ const errorMessage = `Files exceed maximum size of ${Math.round(maxSize / 1024 / 1024)}MB: ${oversizedFiles.map((f) => f.name).join(", ")}`;
731
+ onUploadError?.(errorMessage);
732
+ return;
733
+ }
734
+ for (const file of fileArray) {
735
+ try {
736
+ const result = await uploadFile2({
737
+ table_name,
738
+ record_id,
739
+ organisation_id,
740
+ app_id,
741
+ category,
742
+ is_public: false
743
+ }, file);
744
+ if (result) {
745
+ onUploadSuccess?.(result);
746
+ } else {
747
+ onUploadError?.("Upload failed");
748
+ }
749
+ } catch (err) {
750
+ const errorMessage = err instanceof Error ? err.message : "Upload failed";
751
+ onUploadError?.(errorMessage);
752
+ }
1162
753
  }
1163
- };
1164
- const getPrintOptimizedClasses = () => {
1165
- if (!printOptimized) return "";
1166
- return cn(
1167
- "print:break-after-avoid",
1168
- "print:mb-2"
1169
- );
1170
- };
1171
- return /* @__PURE__ */ jsxs11(
754
+ }, [uploadFile2, table_name, record_id, organisation_id, app_id, category, maxSize, onUploadSuccess, onUploadError]);
755
+ const handleDragOver = useCallback2((e) => {
756
+ e.preventDefault();
757
+ e.stopPropagation();
758
+ if (!disabled) {
759
+ setIsDragging(true);
760
+ }
761
+ }, [disabled]);
762
+ const handleDragLeave = useCallback2((e) => {
763
+ e.preventDefault();
764
+ e.stopPropagation();
765
+ setIsDragging(false);
766
+ }, []);
767
+ const handleDrop = useCallback2((e) => {
768
+ e.preventDefault();
769
+ e.stopPropagation();
770
+ setIsDragging(false);
771
+ if (disabled) return;
772
+ const files = e.dataTransfer.files;
773
+ handleFileSelect(files);
774
+ }, [disabled, handleFileSelect]);
775
+ const handleFileInputChange = useCallback2((e) => {
776
+ handleFileSelect(e.target.files);
777
+ if (e.target) {
778
+ e.target.value = "";
779
+ }
780
+ }, [handleFileSelect]);
781
+ const handleClick = useCallback2(() => {
782
+ if (!disabled && fileInputRef.current) {
783
+ fileInputRef.current.click();
784
+ }
785
+ }, [disabled]);
786
+ const dragClasses = isDragging ? "border-main-500 bg-main-50" : "border-sec-300 hover:border-sec-400";
787
+ const disabledClasses = disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer hover:bg-sec-50";
788
+ return /* @__PURE__ */ jsxs5(
1172
789
  "div",
1173
790
  {
1174
- className: cn(
1175
- "print-card-header",
1176
- "flex",
1177
- "items-center",
1178
- "justify-between",
1179
- "mb-4",
1180
- getAlignmentClasses(align),
1181
- getPrintOptimizedClasses(),
1182
- className
1183
- ),
1184
- ...props,
791
+ className: `relative border-2 border-dashed rounded-lg p-6 text-center transition-colors ${dragClasses} ${disabledClasses} ${className}`,
792
+ onDragOver: handleDragOver,
793
+ onDragLeave: handleDragLeave,
794
+ onDrop: handleDrop,
795
+ onClick: handleClick,
1185
796
  children: [
1186
- /* @__PURE__ */ jsxs11("div", { className: "flex-1", children: [
1187
- title && /* @__PURE__ */ jsx15(PrintText, { variant: "heading", weight: "semibold", children: title }),
1188
- subtitle && /* @__PURE__ */ jsx15(PrintText, { variant: "caption", color: "muted", className: "mt-1", children: subtitle }),
1189
- children
797
+ /* @__PURE__ */ jsx6(
798
+ "input",
799
+ {
800
+ ref: fileInputRef,
801
+ type: "file",
802
+ accept,
803
+ multiple,
804
+ onChange: handleFileInputChange,
805
+ className: "hidden",
806
+ disabled
807
+ }
808
+ ),
809
+ children || /* @__PURE__ */ jsxs5("div", { className: "space-y-2", children: [
810
+ /* @__PURE__ */ jsx6("div", { className: "text-sec-600", children: isDragging ? "Drop files here..." : /* @__PURE__ */ jsxs5(Fragment2, { children: [
811
+ /* @__PURE__ */ jsx6("span", { className: "font-medium", children: "Click to upload" }),
812
+ " ",
813
+ "or drag and drop"
814
+ ] }) }),
815
+ /* @__PURE__ */ jsxs5("div", { className: "text-sm text-sec-500", children: [
816
+ accept !== "*/*" && `Accepted formats: ${accept}`,
817
+ maxSize && ` \u2022 Max size: ${Math.round(maxSize / 1024 / 1024)}MB`,
818
+ multiple && " \u2022 Multiple files allowed"
819
+ ] })
1190
820
  ] }),
1191
- actions && /* @__PURE__ */ jsx15("div", { className: "ml-4 flex-shrink-0", children: actions })
1192
- ]
1193
- }
1194
- );
1195
- }
1196
-
1197
- // src/components/PrintCard/PrintCardContent.tsx
1198
- init_cn();
1199
- import { jsx as jsx16 } from "react/jsx-runtime";
1200
- function PrintCardContent({
1201
- children,
1202
- padding = "md",
1203
- printOptimized = true,
1204
- className,
1205
- ...props
1206
- }) {
1207
- const getPaddingClasses = (padding2) => {
1208
- switch (padding2) {
1209
- case "none":
1210
- return "p-0";
1211
- case "sm":
1212
- return "p-2";
1213
- case "lg":
1214
- return "p-6";
1215
- default:
1216
- return "p-4";
1217
- }
1218
- };
1219
- const getPrintOptimizedClasses = () => {
1220
- if (!printOptimized) return "";
1221
- return cn(
1222
- "print:break-inside-avoid",
1223
- "print:text-sm",
1224
- "print:leading-tight"
1225
- );
1226
- };
1227
- return /* @__PURE__ */ jsx16(
1228
- "div",
1229
- {
1230
- "data-testid": "print-card-content",
1231
- className: cn(
1232
- "print-card-content",
1233
- getPaddingClasses(padding),
1234
- getPrintOptimizedClasses(),
1235
- className
1236
- ),
1237
- ...props,
1238
- children
1239
- }
1240
- );
1241
- }
1242
-
1243
- // src/components/PrintCard/PrintCardFooter.tsx
1244
- init_cn();
1245
- import { jsx as jsx17 } from "react/jsx-runtime";
1246
- function PrintCardFooter({
1247
- children,
1248
- align = "left",
1249
- printOptimized = true,
1250
- className,
1251
- ...props
1252
- }) {
1253
- const getAlignmentClasses = (align2) => {
1254
- switch (align2) {
1255
- case "center":
1256
- return "text-center";
1257
- case "right":
1258
- return "text-right";
1259
- default:
1260
- return "text-left";
1261
- }
1262
- };
1263
- const getPrintOptimizedClasses = () => {
1264
- if (!printOptimized) return "";
1265
- return cn(
1266
- "print:break-before-avoid",
1267
- "print:mt-2",
1268
- "print:pt-2",
1269
- "print:border-t",
1270
- "print:border-gray-300"
1271
- );
1272
- };
1273
- return /* @__PURE__ */ jsx17(
1274
- "div",
1275
- {
1276
- className: cn(
1277
- "print-card-footer",
1278
- "mt-4",
1279
- "pt-4",
1280
- "border-t",
1281
- "border-border",
1282
- getAlignmentClasses(align),
1283
- getPrintOptimizedClasses(),
1284
- className
1285
- ),
1286
- ...props,
1287
- children
1288
- }
1289
- );
1290
- }
1291
-
1292
- // src/components/PrintCard/PrintCardImage.tsx
1293
- init_cn();
1294
- import { jsx as jsx18 } from "react/jsx-runtime";
1295
- function PrintCardImage({
1296
- src,
1297
- alt,
1298
- width,
1299
- height,
1300
- aspectRatio = "auto",
1301
- objectFit = "cover",
1302
- printOptimized = true,
1303
- className,
1304
- ...props
1305
- }) {
1306
- const getAspectRatioClasses = (aspectRatio2) => {
1307
- switch (aspectRatio2) {
1308
- case "square":
1309
- return "aspect-square";
1310
- case "portrait":
1311
- return "aspect-[3/4]";
1312
- case "landscape":
1313
- return "aspect-[4/3]";
1314
- default:
1315
- return "";
1316
- }
1317
- };
1318
- const getObjectFitClasses = (objectFit2) => {
1319
- switch (objectFit2) {
1320
- case "contain":
1321
- return "object-contain";
1322
- case "fill":
1323
- return "object-fill";
1324
- case "none":
1325
- return "object-none";
1326
- case "scale-down":
1327
- return "object-scale-down";
1328
- default:
1329
- return "object-cover";
1330
- }
1331
- };
1332
- const getPrintOptimizedClasses = () => {
1333
- if (!printOptimized) return "";
1334
- return cn(
1335
- "print:max-w-full",
1336
- "print:h-auto",
1337
- "print:break-inside-avoid"
1338
- );
1339
- };
1340
- return /* @__PURE__ */ jsx18(
1341
- "img",
1342
- {
1343
- src,
1344
- alt,
1345
- width,
1346
- height,
1347
- className: cn(
1348
- "print-card-image",
1349
- "w-full",
1350
- "h-auto",
1351
- "rounded-md",
1352
- getAspectRatioClasses(aspectRatio),
1353
- getObjectFitClasses(objectFit),
1354
- getPrintOptimizedClasses(),
1355
- className
1356
- ),
1357
- ...props
1358
- }
1359
- );
1360
- }
1361
-
1362
- // src/components/PrintCard/PrintCardGrid.tsx
1363
- init_cn();
1364
- import { jsx as jsx19 } from "react/jsx-runtime";
1365
- function PrintCardGrid({
1366
- children,
1367
- columns = 3,
1368
- gap = "md",
1369
- rowGap = "md",
1370
- printOptimized = true,
1371
- className,
1372
- ...props
1373
- }) {
1374
- const getColumnClasses = (columns2) => {
1375
- switch (columns2) {
1376
- case 1:
1377
- return "grid-cols-1";
1378
- case 2:
1379
- return "grid-cols-2";
1380
- case 4:
1381
- return "grid-cols-4";
1382
- case 5:
1383
- return "grid-cols-5";
1384
- case 6:
1385
- return "grid-cols-6";
1386
- default:
1387
- return "grid-cols-3";
1388
- }
1389
- };
1390
- const getGapClasses = (gap2) => {
1391
- switch (gap2) {
1392
- case "sm":
1393
- return "gap-2";
1394
- case "lg":
1395
- return "gap-6";
1396
- case "xl":
1397
- return "gap-8";
1398
- default:
1399
- return "gap-4";
1400
- }
1401
- };
1402
- const getRowGapClasses = (rowGap2) => {
1403
- switch (rowGap2) {
1404
- case "sm":
1405
- return "gap-y-2";
1406
- case "lg":
1407
- return "gap-y-6";
1408
- case "xl":
1409
- return "gap-y-8";
1410
- default:
1411
- return "gap-y-4";
1412
- }
1413
- };
1414
- const getPrintOptimizedClasses = () => {
1415
- if (!printOptimized) return "";
1416
- return cn(
1417
- "print:grid-cols-2",
1418
- "print:gap-2",
1419
- "print:break-inside-avoid"
1420
- );
1421
- };
1422
- return /* @__PURE__ */ jsx19(
1423
- "div",
1424
- {
1425
- className: cn(
1426
- "print-card-grid",
1427
- "grid",
1428
- getColumnClasses(columns),
1429
- getGapClasses(gap),
1430
- getRowGapClasses(rowGap),
1431
- getPrintOptimizedClasses(),
1432
- className
1433
- ),
1434
- ...props,
1435
- children
1436
- }
1437
- );
1438
- }
1439
-
1440
- // src/components/PrintSection/PrintSection.tsx
1441
- init_cn();
1442
- import { jsx as jsx20, jsxs as jsxs12 } from "react/jsx-runtime";
1443
- function PrintSection({
1444
- children,
1445
- title,
1446
- subtitle,
1447
- layout = "single",
1448
- gap = "md",
1449
- spacing = "md",
1450
- showBorder = false,
1451
- background = "transparent",
1452
- printOptimized = true,
1453
- className,
1454
- ...props
1455
- }) {
1456
- const getLayoutClasses = (layout2) => {
1457
- switch (layout2) {
1458
- case "two-column":
1459
- return "grid grid-cols-2";
1460
- case "three-column":
1461
- return "grid grid-cols-3";
1462
- case "four-column":
1463
- return "grid grid-cols-4";
1464
- default:
1465
- return "block";
1466
- }
1467
- };
1468
- const getGapClasses = (gap2) => {
1469
- switch (gap2) {
1470
- case "sm":
1471
- return "gap-2";
1472
- case "lg":
1473
- return "gap-6";
1474
- case "xl":
1475
- return "gap-8";
1476
- default:
1477
- return "gap-4";
1478
- }
1479
- };
1480
- const getSpacingClasses = (spacing2) => {
1481
- switch (spacing2) {
1482
- case "none":
1483
- return "py-0";
1484
- case "sm":
1485
- return "py-2";
1486
- case "lg":
1487
- return "py-6";
1488
- case "xl":
1489
- return "py-8";
1490
- default:
1491
- return "py-4";
1492
- }
1493
- };
1494
- const getBackgroundClasses = (background2) => {
1495
- switch (background2) {
1496
- case "white":
1497
- return "bg-background";
1498
- case "gray":
1499
- return "bg-muted";
1500
- case "primary":
1501
- return "bg-primary text-primary-foreground";
1502
- case "secondary":
1503
- return "bg-secondary text-secondary-foreground";
1504
- default:
1505
- return "bg-transparent";
1506
- }
1507
- };
1508
- const getBorderClasses = () => {
1509
- if (!showBorder) return "";
1510
- return "border border-border rounded-lg p-4";
1511
- };
1512
- const getPrintOptimizedClasses = () => {
1513
- if (!printOptimized) return "";
1514
- return cn(
1515
- "print:break-inside-avoid",
1516
- "print:mb-4",
1517
- "print:border-black",
1518
- "print:bg-white",
1519
- "print:text-black"
1520
- );
1521
- };
1522
- return /* @__PURE__ */ jsxs12(
1523
- "section",
1524
- {
1525
- className: cn(
1526
- "print-section",
1527
- getLayoutClasses(layout),
1528
- getGapClasses(gap),
1529
- getSpacingClasses(spacing),
1530
- getBackgroundClasses(background),
1531
- getBorderClasses(),
1532
- getPrintOptimizedClasses(),
1533
- className
1534
- ),
1535
- ...props,
1536
- children: [
1537
- title && /* @__PURE__ */ jsxs12("div", { className: "mb-4", children: [
1538
- /* @__PURE__ */ jsx20(PrintText, { variant: "heading", weight: "semibold", children: title }),
1539
- subtitle && /* @__PURE__ */ jsx20(PrintText, { variant: "caption", color: "muted", className: "mt-1", children: subtitle })
1540
- ] }),
1541
- children
1542
- ]
1543
- }
1544
- );
1545
- }
1546
-
1547
- // src/components/PrintSection/PrintSectionHeader.tsx
1548
- init_cn();
1549
- import { jsx as jsx21, jsxs as jsxs13 } from "react/jsx-runtime";
1550
- function PrintSectionHeader({
1551
- children,
1552
- title,
1553
- subtitle,
1554
- level = 2,
1555
- align = "left",
1556
- showDivider = false,
1557
- printOptimized = true,
1558
- className,
1559
- ...props
1560
- }) {
1561
- const getAlignmentClasses = (align2) => {
1562
- switch (align2) {
1563
- case "center":
1564
- return "text-center";
1565
- case "right":
1566
- return "text-right";
1567
- default:
1568
- return "text-left";
1569
- }
1570
- };
1571
- const getDividerClasses = () => {
1572
- if (!showDivider) return "";
1573
- return "border-b border-border pb-2 mb-4";
1574
- };
1575
- const getPrintOptimizedClasses = () => {
1576
- if (!printOptimized) return "";
1577
- return cn(
1578
- "print:break-after-avoid",
1579
- "print:mb-2",
1580
- "print:border-black"
1581
- );
1582
- };
1583
- const getHeadingVariant = (level2) => {
1584
- switch (level2) {
1585
- case 1:
1586
- return "heading";
1587
- case 2:
1588
- return "heading";
1589
- case 3:
1590
- return "subheading";
1591
- case 4:
1592
- return "subheading";
1593
- case 5:
1594
- return "body";
1595
- case 6:
1596
- return "body";
1597
- default:
1598
- return "heading";
1599
- }
1600
- };
1601
- const HeadingTag = `h${level}`;
1602
- return /* @__PURE__ */ jsxs13(
1603
- HeadingTag,
1604
- {
1605
- className: cn(
1606
- "print-section-header",
1607
- "mb-4",
1608
- getAlignmentClasses(align),
1609
- getDividerClasses(),
1610
- getPrintOptimizedClasses(),
1611
- className
1612
- ),
1613
- ...props,
1614
- children: [
1615
- title && /* @__PURE__ */ jsx21(PrintText, { variant: getHeadingVariant(level), weight: "semibold", children: title }),
1616
- subtitle && /* @__PURE__ */ jsx21(PrintText, { variant: "caption", color: "muted", className: "mt-1", children: subtitle }),
1617
- children
1618
- ]
1619
- }
1620
- );
1621
- }
1622
-
1623
- // src/components/PrintSection/PrintSectionContent.tsx
1624
- init_cn();
1625
- import { jsx as jsx22 } from "react/jsx-runtime";
1626
- function PrintSectionContent({
1627
- children,
1628
- padding = "md",
1629
- background = "transparent",
1630
- printOptimized = true,
1631
- className,
1632
- ...props
1633
- }) {
1634
- const getPaddingClasses = (padding2) => {
1635
- switch (padding2) {
1636
- case "none":
1637
- return "p-0";
1638
- case "sm":
1639
- return "p-2";
1640
- case "lg":
1641
- return "p-6";
1642
- default:
1643
- return "p-4";
1644
- }
1645
- };
1646
- const getBackgroundClasses = (background2) => {
1647
- switch (background2) {
1648
- case "white":
1649
- return "bg-background";
1650
- case "gray":
1651
- return "bg-muted";
1652
- case "primary":
1653
- return "bg-primary text-primary-foreground";
1654
- case "secondary":
1655
- return "bg-secondary text-secondary-foreground";
1656
- default:
1657
- return "bg-transparent";
1658
- }
1659
- };
1660
- const getPrintOptimizedClasses = () => {
1661
- if (!printOptimized) return "";
1662
- return cn(
1663
- "print:break-inside-avoid",
1664
- "print:text-sm",
1665
- "print:leading-tight",
1666
- "print:bg-white",
1667
- "print:text-black"
1668
- );
1669
- };
1670
- return /* @__PURE__ */ jsx22(
1671
- "div",
1672
- {
1673
- className: cn(
1674
- "print-section-content",
1675
- getPaddingClasses(padding),
1676
- getBackgroundClasses(background),
1677
- getPrintOptimizedClasses(),
1678
- className
1679
- ),
1680
- ...props,
1681
- children
1682
- }
1683
- );
1684
- }
1685
-
1686
- // src/components/PrintSection/PrintColumn.tsx
1687
- init_cn();
1688
- import { jsx as jsx23 } from "react/jsx-runtime";
1689
- function PrintColumn({
1690
- children,
1691
- width = "auto",
1692
- align = "left",
1693
- verticalAlign = "top",
1694
- padding = "md",
1695
- printOptimized = true,
1696
- className,
1697
- ...props
1698
- }) {
1699
- const getWidthClasses = (width2) => {
1700
- switch (width2) {
1701
- case "1/2":
1702
- return "col-span-1";
1703
- case "1/3":
1704
- return "col-span-1";
1705
- case "2/3":
1706
- return "col-span-2";
1707
- case "1/4":
1708
- return "col-span-1";
1709
- case "3/4":
1710
- return "col-span-3";
1711
- case "full":
1712
- return "col-span-full";
1713
- default:
1714
- return "";
1715
- }
1716
- };
1717
- const getAlignmentClasses = (align2) => {
1718
- switch (align2) {
1719
- case "center":
1720
- return "text-center";
1721
- case "right":
1722
- return "text-right";
1723
- default:
1724
- return "text-left";
1725
- }
1726
- };
1727
- const getVerticalAlignmentClasses = (verticalAlign2) => {
1728
- switch (verticalAlign2) {
1729
- case "middle":
1730
- return "flex items-center";
1731
- case "bottom":
1732
- return "flex items-end";
1733
- default:
1734
- return "flex items-start";
1735
- }
1736
- };
1737
- const getPaddingClasses = (padding2) => {
1738
- switch (padding2) {
1739
- case "none":
1740
- return "p-0";
1741
- case "sm":
1742
- return "p-2";
1743
- case "lg":
1744
- return "p-6";
1745
- default:
1746
- return "p-4";
1747
- }
1748
- };
1749
- const getPrintOptimizedClasses = () => {
1750
- if (!printOptimized) return "";
1751
- return cn(
1752
- "print:break-inside-avoid",
1753
- "print:mb-2",
1754
- "print:text-sm",
1755
- "print:leading-tight"
1756
- );
1757
- };
1758
- return /* @__PURE__ */ jsx23(
1759
- "div",
1760
- {
1761
- className: cn(
1762
- "print-column",
1763
- getWidthClasses(width),
1764
- getAlignmentClasses(align),
1765
- getVerticalAlignmentClasses(verticalAlign),
1766
- getPaddingClasses(padding),
1767
- getPrintOptimizedClasses(),
1768
- className
1769
- ),
1770
- ...props,
1771
- children
1772
- }
1773
- );
1774
- }
1775
-
1776
- // src/components/PrintSection/PrintDivider.tsx
1777
- init_cn();
1778
- import { jsx as jsx24 } from "react/jsx-runtime";
1779
- function PrintDivider({
1780
- style = "solid",
1781
- color = "default",
1782
- thickness = "thin",
1783
- spacing = "md",
1784
- printOptimized = true,
1785
- className,
1786
- ...props
1787
- }) {
1788
- const getStyleClasses = (style2) => {
1789
- switch (style2) {
1790
- case "dashed":
1791
- return "border-dashed";
1792
- case "dotted":
1793
- return "border-dotted";
1794
- case "thick":
1795
- return "border-solid border-4";
1796
- default:
1797
- return "border-solid";
1798
- }
1799
- };
1800
- const getColorClasses = (color2) => {
1801
- switch (color2) {
1802
- case "muted":
1803
- return "border-muted-foreground";
1804
- case "primary":
1805
- return "border-primary";
1806
- case "secondary":
1807
- return "border-secondary";
1808
- case "accent":
1809
- return "border-accent";
1810
- default:
1811
- return "border-border";
1812
- }
1813
- };
1814
- const getThicknessClasses = (thickness2, style2) => {
1815
- if (style2 === "thick") return "";
1816
- switch (thickness2) {
1817
- case "medium":
1818
- return "border-2";
1819
- case "thick":
1820
- return "border-4";
1821
- default:
1822
- return "border";
1823
- }
1824
- };
1825
- const getSpacingClasses = (spacing2) => {
1826
- switch (spacing2) {
1827
- case "none":
1828
- return "my-0";
1829
- case "sm":
1830
- return "my-2";
1831
- case "lg":
1832
- return "my-6";
1833
- default:
1834
- return "my-4";
1835
- }
1836
- };
1837
- const getPrintOptimizedClasses = () => {
1838
- if (!printOptimized) return "";
1839
- return cn(
1840
- "print:border-black",
1841
- "print:break-inside-avoid"
1842
- );
1843
- };
1844
- return /* @__PURE__ */ jsx24(
1845
- "hr",
1846
- {
1847
- className: cn(
1848
- "print-divider",
1849
- "border-t",
1850
- getStyleClasses(style),
1851
- getColorClasses(color),
1852
- getThicknessClasses(thickness, style),
1853
- getSpacingClasses(spacing),
1854
- getPrintOptimizedClasses(),
1855
- className
1856
- ),
1857
- ...props
1858
- }
1859
- );
1860
- }
1861
-
1862
- // src/components/PrintButton/PrintButton.tsx
1863
- init_cn();
1864
- import { useState as useState3 } from "react";
1865
- import { jsx as jsx25, jsxs as jsxs14 } from "react/jsx-runtime";
1866
- function PrintButton({
1867
- children,
1868
- variant = "primary",
1869
- size = "md",
1870
- shape = "default",
1871
- state = "default",
1872
- printFunction = "print",
1873
- printSelector,
1874
- printOptions = {},
1875
- onClick,
1876
- onPrint,
1877
- onPrintStart,
1878
- onPrintEnd,
1879
- showIcon = true,
1880
- icon,
1881
- iconPosition = "left",
1882
- fullWidth = false,
1883
- printOptimized = true,
1884
- className,
1885
- ...props
1886
- }) {
1887
- const [isPrinting, setIsPrinting] = useState3(false);
1888
- const getVariantClasses = (variant2) => {
1889
- switch (variant2) {
1890
- case "secondary":
1891
- return "bg-secondary text-secondary-foreground hover:bg-secondary/80";
1892
- case "outline":
1893
- return "border border-input bg-background hover:bg-accent hover:text-accent-foreground";
1894
- case "ghost":
1895
- return "hover:bg-accent hover:text-accent-foreground";
1896
- case "destructive":
1897
- return "bg-destructive text-destructive-foreground hover:bg-destructive/90";
1898
- default:
1899
- return "bg-primary text-primary-foreground hover:bg-primary/90";
1900
- }
1901
- };
1902
- const getSizeClasses = (size2) => {
1903
- switch (size2) {
1904
- case "sm":
1905
- return "h-8 px-3 text-xs";
1906
- case "lg":
1907
- return "h-12 px-8 text-base";
1908
- case "xl":
1909
- return "h-14 px-10 text-lg";
1910
- default:
1911
- return "h-10 px-4 text-sm";
1912
- }
1913
- };
1914
- const getShapeClasses = (shape2) => {
1915
- switch (shape2) {
1916
- case "rounded":
1917
- return "rounded-lg";
1918
- case "pill":
1919
- return "rounded-full";
1920
- case "square":
1921
- return "rounded-none";
1922
- default:
1923
- return "rounded-md";
1924
- }
1925
- };
1926
- const getStateClasses = (state2) => {
1927
- switch (state2) {
1928
- case "loading":
1929
- return "opacity-50 cursor-not-allowed";
1930
- case "disabled":
1931
- return "opacity-50 cursor-not-allowed pointer-events-none";
1932
- default:
1933
- return "cursor-pointer";
1934
- }
1935
- };
1936
- const getPrintOptimizedClasses = () => {
1937
- if (!printOptimized) return "";
1938
- return cn(
1939
- "print:hidden",
1940
- "print:opacity-0",
1941
- "print:pointer-events-none"
1942
- );
1943
- };
1944
- const getDefaultIcon = () => {
1945
- if (icon) return icon;
1946
- switch (printFunction) {
1947
- case "printSelection":
1948
- return "\u{1F4C4}";
1949
- case "printPage":
1950
- return "\u{1F4C3}";
1951
- case "printElement":
1952
- return "\u{1F3AF}";
1953
- default:
1954
- return "\u{1F5A8}\uFE0F";
1955
- }
1956
- };
1957
- const handlePrint = async () => {
1958
- if (isPrinting || state === "disabled" || state === "loading") return;
1959
- setIsPrinting(true);
1960
- onPrintStart?.();
1961
- try {
1962
- switch (printFunction) {
1963
- case "print":
1964
- await printDocument(printOptions);
1965
- break;
1966
- case "printSelection":
1967
- if (printSelector) {
1968
- await printSelection(printSelector, printOptions);
1969
- }
1970
- break;
1971
- case "printPage":
1972
- await printPage(printOptions);
1973
- break;
1974
- case "printElement":
1975
- if (printSelector) {
1976
- await printElement(printSelector, printOptions);
1977
- }
1978
- break;
1979
- }
1980
- onPrint?.(true);
1981
- } catch (error) {
1982
- onPrint?.(false, error);
1983
- } finally {
1984
- setIsPrinting(false);
1985
- onPrintEnd?.();
1986
- }
1987
- };
1988
- const handleClick = (event) => {
1989
- if (printFunction) {
1990
- event.preventDefault();
1991
- handlePrint();
1992
- }
1993
- onClick?.(event);
1994
- };
1995
- const isDisabled = state === "disabled" || state === "loading" || isPrinting;
1996
- return /* @__PURE__ */ jsxs14(
1997
- "button",
1998
- {
1999
- type: "button",
2000
- className: cn(
2001
- "print-button",
2002
- "inline-flex",
2003
- "items-center",
2004
- "justify-center",
2005
- "whitespace-nowrap",
2006
- "font-medium",
2007
- "ring-offset-background",
2008
- "transition-colors",
2009
- "focus-visible:outline-none",
2010
- "focus-visible:ring-2",
2011
- "focus-visible:ring-ring",
2012
- "focus-visible:ring-offset-2",
2013
- "disabled:pointer-events-none",
2014
- "disabled:opacity-50",
2015
- getVariantClasses(variant),
2016
- getSizeClasses(size),
2017
- getShapeClasses(shape),
2018
- getStateClasses(state),
2019
- fullWidth && "w-full",
2020
- getPrintOptimizedClasses(),
2021
- className
2022
- ),
2023
- disabled: isDisabled,
2024
- onClick: handleClick,
2025
- ...props,
2026
- children: [
2027
- showIcon && iconPosition === "left" && /* @__PURE__ */ jsx25("span", { className: "mr-2", children: getDefaultIcon() }),
2028
- children,
2029
- showIcon && iconPosition === "right" && /* @__PURE__ */ jsx25("span", { className: "ml-2", children: getDefaultIcon() })
2030
- ]
2031
- }
2032
- );
2033
- }
2034
- async function printDocument(options) {
2035
- return new Promise((resolve, reject) => {
2036
- try {
2037
- if (options.stylesheetUrl) {
2038
- const link = document.createElement("link");
2039
- link.rel = "stylesheet";
2040
- link.href = options.stylesheetUrl;
2041
- link.media = options.mediaQuery || "print";
2042
- document.head.appendChild(link);
2043
- }
2044
- const printWindow = window.open("", "_blank");
2045
- if (!printWindow) {
2046
- reject(new Error("Unable to open print window"));
2047
- return;
2048
- }
2049
- printWindow.document.write(`
2050
- <html>
2051
- <head>
2052
- <title>${options.title || "Print Document"}</title>
2053
- <style>
2054
- @page {
2055
- margin: ${options.margins?.top || "0.5in"} ${options.margins?.right || "0.5in"} ${options.margins?.bottom || "0.5in"} ${options.margins?.left || "0.5in"};
2056
- size: ${options.orientation === "landscape" ? "A4 landscape" : "A4 portrait"};
2057
- }
2058
- body {
2059
- font-family: Arial, sans-serif;
2060
- line-height: 1.4;
2061
- color: #000;
2062
- background: #fff;
2063
- }
2064
- @media print {
2065
- * { -webkit-print-color-adjust: ${options.colorAdjust || "exact"}; }
2066
- }
2067
- </style>
2068
- </head>
2069
- <body>
2070
- ${document.documentElement.outerHTML}
2071
- </body>
2072
- </html>
2073
- `);
2074
- printWindow.document.close();
2075
- printWindow.focus();
2076
- printWindow.print();
2077
- printWindow.close();
2078
- resolve();
2079
- } catch (error) {
2080
- reject(error);
2081
- }
2082
- });
2083
- }
2084
- async function printSelection(selector, options) {
2085
- const element = document.querySelector(selector);
2086
- if (!element) {
2087
- throw new Error(`Element with selector "${selector}" not found`);
2088
- }
2089
- return printElement(selector, options);
2090
- }
2091
- async function printPage(options) {
2092
- return printDocument(options);
2093
- }
2094
- async function printElement(selector, options) {
2095
- const element = document.querySelector(selector);
2096
- if (!element) {
2097
- throw new Error(`Element with selector "${selector}" not found`);
2098
- }
2099
- return new Promise((resolve, reject) => {
2100
- try {
2101
- const printWindow = window.open("", "_blank");
2102
- if (!printWindow) {
2103
- reject(new Error("Unable to open print window"));
2104
- return;
2105
- }
2106
- printWindow.document.write(`
2107
- <html>
2108
- <head>
2109
- <title>${options.title || "Print Element"}</title>
2110
- <style>
2111
- @page {
2112
- margin: ${options.margins?.top || "0.5in"} ${options.margins?.right || "0.5in"} ${options.margins?.bottom || "0.5in"} ${options.margins?.left || "0.5in"};
2113
- size: ${options.orientation === "landscape" ? "A4 landscape" : "A4 portrait"};
2114
- }
2115
- body {
2116
- font-family: Arial, sans-serif;
2117
- line-height: 1.4;
2118
- color: #000;
2119
- background: #fff;
2120
- }
2121
- @media print {
2122
- * { -webkit-print-color-adjust: ${options.colorAdjust || "exact"}; }
2123
- }
2124
- </style>
2125
- </head>
2126
- <body>
2127
- ${element.outerHTML}
2128
- </body>
2129
- </html>
2130
- `);
2131
- printWindow.document.close();
2132
- printWindow.focus();
2133
- printWindow.print();
2134
- printWindow.close();
2135
- resolve();
2136
- } catch (error) {
2137
- reject(error);
2138
- }
2139
- });
2140
- }
2141
-
2142
- // src/components/PrintButton/PrintButtonGroup.tsx
2143
- init_cn();
2144
- import { jsx as jsx26 } from "react/jsx-runtime";
2145
- function PrintButtonGroup({
2146
- children,
2147
- orientation = "horizontal",
2148
- spacing = "md",
2149
- align = "left",
2150
- printOptimized = true,
2151
- className,
2152
- ...props
2153
- }) {
2154
- const getOrientationClasses = (orientation2) => {
2155
- switch (orientation2) {
2156
- case "vertical":
2157
- return "flex-col";
2158
- default:
2159
- return "flex-row";
2160
- }
2161
- };
2162
- const getSpacingClasses = (spacing2) => {
2163
- switch (spacing2) {
2164
- case "none":
2165
- return "gap-0";
2166
- case "sm":
2167
- return "gap-2";
2168
- case "lg":
2169
- return "gap-6";
2170
- default:
2171
- return "gap-4";
2172
- }
2173
- };
2174
- const getAlignmentClasses = (align2) => {
2175
- switch (align2) {
2176
- case "center":
2177
- return "justify-center";
2178
- case "right":
2179
- return "justify-end";
2180
- case "stretch":
2181
- return "justify-stretch";
2182
- default:
2183
- return "justify-start";
2184
- }
2185
- };
2186
- const getPrintOptimizedClasses = () => {
2187
- if (!printOptimized) return "";
2188
- return cn(
2189
- "print:hidden",
2190
- "print:opacity-0",
2191
- "print:pointer-events-none"
2192
- );
2193
- };
2194
- return /* @__PURE__ */ jsx26(
2195
- "div",
2196
- {
2197
- className: cn(
2198
- "print-button-group",
2199
- "flex",
2200
- "items-center",
2201
- getOrientationClasses(orientation),
2202
- getSpacingClasses(spacing),
2203
- getAlignmentClasses(align),
2204
- getPrintOptimizedClasses(),
2205
- className
2206
- ),
2207
- ...props,
2208
- children
2209
- }
2210
- );
2211
- }
2212
-
2213
- // src/components/PrintButton/PrintToolbar.tsx
2214
- init_cn();
2215
- import { jsx as jsx27 } from "react/jsx-runtime";
2216
- function PrintToolbar({
2217
- children,
2218
- position = "top",
2219
- align = "left",
2220
- showOnPrint = false,
2221
- printOptimized = true,
2222
- className,
2223
- ...props
2224
- }) {
2225
- const getPositionClasses = (position2) => {
2226
- switch (position2) {
2227
- case "bottom":
2228
- return "fixed bottom-0 left-0 right-0";
2229
- case "fixed":
2230
- return "fixed top-4 right-4";
2231
- default:
2232
- return "relative";
2233
- }
2234
- };
2235
- const getAlignmentClasses = (align2) => {
2236
- switch (align2) {
2237
- case "center":
2238
- return "justify-center";
2239
- case "right":
2240
- return "justify-end";
2241
- default:
2242
- return "justify-start";
2243
- }
2244
- };
2245
- const getPrintOptimizedClasses = () => {
2246
- if (!printOptimized) return "";
2247
- if (showOnPrint) {
2248
- return cn(
2249
- "print:block",
2250
- "print:opacity-100",
2251
- "print:pointer-events-auto"
2252
- );
2253
- } else {
2254
- return cn(
2255
- "print:hidden",
2256
- "print:opacity-0",
2257
- "print:pointer-events-none"
2258
- );
2259
- }
2260
- };
2261
- const getZIndexClasses = () => {
2262
- if (position === "fixed" || position === "bottom") {
2263
- return "z-50";
2264
- }
2265
- return "";
2266
- };
2267
- return /* @__PURE__ */ jsx27(
2268
- "div",
2269
- {
2270
- className: cn(
2271
- "print-toolbar",
2272
- "flex",
2273
- "items-center",
2274
- "gap-2",
2275
- "p-4",
2276
- "bg-background",
2277
- "border",
2278
- "border-border",
2279
- "rounded-lg",
2280
- "shadow-lg",
2281
- getPositionClasses(position),
2282
- getAlignmentClasses(align),
2283
- getZIndexClasses(),
2284
- getPrintOptimizedClasses(),
2285
- className
2286
- ),
2287
- ...props,
2288
- children
2289
- }
2290
- );
2291
- }
2292
-
2293
- // src/components/PrintGrid/PrintGrid.tsx
2294
- init_cn();
2295
- import { jsx as jsx28 } from "react/jsx-runtime";
2296
- function PrintGrid({
2297
- children,
2298
- columns = 12,
2299
- gap = "md",
2300
- rowGap,
2301
- columnGap,
2302
- align = "stretch",
2303
- justify = "start",
2304
- printColumns,
2305
- printGap,
2306
- printRowGap,
2307
- printColumnGap,
2308
- printOptimized = true,
2309
- className,
2310
- ...props
2311
- }) {
2312
- const getColumnsClasses = (cols) => {
2313
- switch (cols) {
2314
- case 1:
2315
- return "grid-cols-1";
2316
- case 2:
2317
- return "grid-cols-2";
2318
- case 3:
2319
- return "grid-cols-3";
2320
- case 4:
2321
- return "grid-cols-4";
2322
- case 5:
2323
- return "grid-cols-5";
2324
- case 6:
2325
- return "grid-cols-6";
2326
- case 12:
2327
- return "grid-cols-12";
2328
- default:
2329
- return "grid-cols-12";
2330
- }
2331
- };
2332
- const getGapClasses = (gap2) => {
2333
- switch (gap2) {
2334
- case "none":
2335
- return "gap-0";
2336
- case "sm":
2337
- return "gap-2";
2338
- case "lg":
2339
- return "gap-6";
2340
- case "xl":
2341
- return "gap-8";
2342
- default:
2343
- return "gap-4";
2344
- }
2345
- };
2346
- const getRowGapClasses = (gap2) => {
2347
- switch (gap2) {
2348
- case "none":
2349
- return "gap-y-0";
2350
- case "sm":
2351
- return "gap-y-2";
2352
- case "lg":
2353
- return "gap-y-6";
2354
- case "xl":
2355
- return "gap-y-8";
2356
- default:
2357
- return "gap-y-4";
2358
- }
2359
- };
2360
- const getColumnGapClasses = (gap2) => {
2361
- switch (gap2) {
2362
- case "none":
2363
- return "gap-x-0";
2364
- case "sm":
2365
- return "gap-x-2";
2366
- case "lg":
2367
- return "gap-x-6";
2368
- case "xl":
2369
- return "gap-x-8";
2370
- default:
2371
- return "gap-x-4";
2372
- }
2373
- };
2374
- const getAlignmentClasses = (align2) => {
2375
- switch (align2) {
2376
- case "start":
2377
- return "items-start";
2378
- case "center":
2379
- return "items-center";
2380
- case "end":
2381
- return "items-end";
2382
- default:
2383
- return "items-stretch";
2384
- }
2385
- };
2386
- const getJustifyClasses = (justify2) => {
2387
- switch (justify2) {
2388
- case "center":
2389
- return "justify-center";
2390
- case "end":
2391
- return "justify-end";
2392
- case "between":
2393
- return "justify-between";
2394
- case "around":
2395
- return "justify-around";
2396
- case "evenly":
2397
- return "justify-evenly";
2398
- default:
2399
- return "justify-start";
2400
- }
2401
- };
2402
- const getPrintOptimizedClasses = () => {
2403
- if (!printOptimized) return "";
2404
- return cn(
2405
- "print:break-inside-avoid",
2406
- "print:mb-4"
2407
- );
2408
- };
2409
- const getPrintColumnsClasses = () => {
2410
- if (!printColumns) return "";
2411
- return cn(
2412
- "print:grid",
2413
- `print:${getColumnsClasses(printColumns)}`
2414
- );
2415
- };
2416
- const getPrintGapClasses = () => {
2417
- if (!printGap) return "";
2418
- return `print:${getGapClasses(printGap)}`;
2419
- };
2420
- const getPrintRowGapClasses = () => {
2421
- if (!printRowGap) return "";
2422
- return `print:${getRowGapClasses(printRowGap)}`;
2423
- };
2424
- const getPrintColumnGapClasses = () => {
2425
- if (!printColumnGap) return "";
2426
- return `print:${getColumnGapClasses(printColumnGap)}`;
2427
- };
2428
- return /* @__PURE__ */ jsx28(
2429
- "div",
2430
- {
2431
- className: cn(
2432
- "print-grid",
2433
- "grid",
2434
- getColumnsClasses(columns),
2435
- getGapClasses(gap),
2436
- rowGap && getRowGapClasses(rowGap),
2437
- columnGap && getColumnGapClasses(columnGap),
2438
- getAlignmentClasses(align),
2439
- getJustifyClasses(justify),
2440
- getPrintOptimizedClasses(),
2441
- getPrintColumnsClasses(),
2442
- getPrintGapClasses(),
2443
- getPrintRowGapClasses(),
2444
- getPrintColumnGapClasses(),
2445
- className
2446
- ),
2447
- ...props,
2448
- children
2449
- }
2450
- );
2451
- }
2452
-
2453
- // src/components/PrintGrid/PrintGridItem.tsx
2454
- init_cn();
2455
- import { jsx as jsx29 } from "react/jsx-runtime";
2456
- function PrintGridItem({
2457
- children,
2458
- colSpan = 1,
2459
- rowSpan = 1,
2460
- colStart,
2461
- rowStart,
2462
- align = "stretch",
2463
- justify = "start",
2464
- printColSpan,
2465
- printRowSpan,
2466
- printColStart,
2467
- printRowStart,
2468
- printOptimized = true,
2469
- className,
2470
- ...props
2471
- }) {
2472
- const getColSpanClasses = (span) => {
2473
- if (span === "full") return "col-span-full";
2474
- switch (span) {
2475
- case 1:
2476
- return "col-span-1";
2477
- case 2:
2478
- return "col-span-2";
2479
- case 3:
2480
- return "col-span-3";
2481
- case 4:
2482
- return "col-span-4";
2483
- case 5:
2484
- return "col-span-5";
2485
- case 6:
2486
- return "col-span-6";
2487
- case 12:
2488
- return "col-span-12";
2489
- default:
2490
- return "col-span-1";
2491
- }
2492
- };
2493
- const getRowSpanClasses = (span) => {
2494
- if (span === "full") return "row-span-full";
2495
- switch (span) {
2496
- case 1:
2497
- return "row-span-1";
2498
- case 2:
2499
- return "row-span-2";
2500
- case 3:
2501
- return "row-span-3";
2502
- case 4:
2503
- return "row-span-4";
2504
- case 5:
2505
- return "row-span-5";
2506
- case 6:
2507
- return "row-span-6";
2508
- default:
2509
- return "row-span-1";
2510
- }
2511
- };
2512
- const getColStartClasses = (start) => {
2513
- if (start === "auto") return "col-start-auto";
2514
- switch (start) {
2515
- case 1:
2516
- return "col-start-1";
2517
- case 2:
2518
- return "col-start-2";
2519
- case 3:
2520
- return "col-start-3";
2521
- case 4:
2522
- return "col-start-4";
2523
- case 5:
2524
- return "col-start-5";
2525
- case 6:
2526
- return "col-start-6";
2527
- case 7:
2528
- return "col-start-7";
2529
- case 8:
2530
- return "col-start-8";
2531
- case 9:
2532
- return "col-start-9";
2533
- case 10:
2534
- return "col-start-10";
2535
- case 11:
2536
- return "col-start-11";
2537
- case 12:
2538
- return "col-start-12";
2539
- case 13:
2540
- return "col-start-13";
2541
- default:
2542
- return "col-start-auto";
2543
- }
2544
- };
2545
- const getRowStartClasses = (start) => {
2546
- if (start === "auto") return "row-start-auto";
2547
- switch (start) {
2548
- case 1:
2549
- return "row-start-1";
2550
- case 2:
2551
- return "row-start-2";
2552
- case 3:
2553
- return "row-start-3";
2554
- case 4:
2555
- return "row-start-4";
2556
- case 5:
2557
- return "row-start-5";
2558
- case 6:
2559
- return "row-start-6";
2560
- case 7:
2561
- return "row-start-7";
2562
- case 8:
2563
- return "row-start-8";
2564
- case 9:
2565
- return "row-start-9";
2566
- case 10:
2567
- return "row-start-10";
2568
- case 11:
2569
- return "row-start-11";
2570
- case 12:
2571
- return "row-start-12";
2572
- case 13:
2573
- return "row-start-13";
2574
- default:
2575
- return "row-start-auto";
2576
- }
2577
- };
2578
- const getAlignmentClasses = (align2) => {
2579
- switch (align2) {
2580
- case "start":
2581
- return "self-start";
2582
- case "center":
2583
- return "self-center";
2584
- case "end":
2585
- return "self-end";
2586
- default:
2587
- return "self-stretch";
2588
- }
2589
- };
2590
- const getJustifyClasses = (justify2) => {
2591
- switch (justify2) {
2592
- case "center":
2593
- return "justify-self-center";
2594
- case "end":
2595
- return "justify-self-end";
2596
- case "stretch":
2597
- return "justify-self-stretch";
2598
- default:
2599
- return "justify-self-start";
2600
- }
2601
- };
2602
- const getPrintOptimizedClasses = () => {
2603
- if (!printOptimized) return "";
2604
- return cn(
2605
- "print:break-inside-avoid",
2606
- "print:mb-2"
2607
- );
2608
- };
2609
- const getPrintColSpanClasses = () => {
2610
- if (!printColSpan) return "";
2611
- return `print:${getColSpanClasses(printColSpan)}`;
2612
- };
2613
- const getPrintRowSpanClasses = () => {
2614
- if (!printRowSpan) return "";
2615
- return `print:${getRowSpanClasses(printRowSpan)}`;
2616
- };
2617
- const getPrintColStartClasses = () => {
2618
- if (!printColStart) return "";
2619
- return `print:${getColStartClasses(printColStart)}`;
2620
- };
2621
- const getPrintRowStartClasses = () => {
2622
- if (!printRowStart) return "";
2623
- return `print:${getRowStartClasses(printRowStart)}`;
2624
- };
2625
- return /* @__PURE__ */ jsx29(
2626
- "div",
2627
- {
2628
- className: cn(
2629
- "print-grid-item",
2630
- getColSpanClasses(colSpan),
2631
- getRowSpanClasses(rowSpan),
2632
- colStart && getColStartClasses(colStart),
2633
- rowStart && getRowStartClasses(rowStart),
2634
- getAlignmentClasses(align),
2635
- getJustifyClasses(justify),
2636
- getPrintOptimizedClasses(),
2637
- getPrintColSpanClasses(),
2638
- getPrintRowSpanClasses(),
2639
- getPrintColStartClasses(),
2640
- getPrintRowStartClasses(),
2641
- className
2642
- ),
2643
- ...props,
2644
- children
2645
- }
2646
- );
2647
- }
2648
-
2649
- // src/components/PrintGrid/PrintGridContainer.tsx
2650
- init_cn();
2651
- import { jsx as jsx30 } from "react/jsx-runtime";
2652
- function PrintGridContainer({
2653
- children,
2654
- maxWidth = "full",
2655
- padding = "md",
2656
- margin = "none",
2657
- background = "transparent",
2658
- printOptimized = true,
2659
- className,
2660
- ...props
2661
- }) {
2662
- const getMaxWidthClasses = (maxWidth2) => {
2663
- switch (maxWidth2) {
2664
- case "sm":
2665
- return "max-w-sm";
2666
- case "md":
2667
- return "max-w-md";
2668
- case "lg":
2669
- return "max-w-lg";
2670
- case "xl":
2671
- return "max-w-xl";
2672
- case "2xl":
2673
- return "max-w-2xl";
2674
- case "3xl":
2675
- return "max-w-3xl";
2676
- case "4xl":
2677
- return "max-w-4xl";
2678
- case "5xl":
2679
- return "max-w-5xl";
2680
- case "6xl":
2681
- return "max-w-6xl";
2682
- case "7xl":
2683
- return "max-w-7xl";
2684
- case "full":
2685
- return "max-w-full";
2686
- default:
2687
- return "max-w-full";
2688
- }
2689
- };
2690
- const getPaddingClasses = (padding2) => {
2691
- switch (padding2) {
2692
- case "none":
2693
- return "p-0";
2694
- case "sm":
2695
- return "p-2";
2696
- case "lg":
2697
- return "p-6";
2698
- case "xl":
2699
- return "p-8";
2700
- default:
2701
- return "p-4";
2702
- }
2703
- };
2704
- const getMarginClasses = (margin2) => {
2705
- switch (margin2) {
2706
- case "none":
2707
- return "m-0";
2708
- case "sm":
2709
- return "m-2";
2710
- case "md":
2711
- return "m-4";
2712
- case "lg":
2713
- return "m-6";
2714
- case "xl":
2715
- return "m-8";
2716
- case "auto":
2717
- return "mx-auto";
2718
- default:
2719
- return "m-0";
2720
- }
2721
- };
2722
- const getBackgroundClasses = (background2) => {
2723
- switch (background2) {
2724
- case "white":
2725
- return "bg-background";
2726
- case "gray":
2727
- return "bg-muted";
2728
- case "primary":
2729
- return "bg-primary text-primary-foreground";
2730
- case "secondary":
2731
- return "bg-secondary text-secondary-foreground";
2732
- default:
2733
- return "bg-transparent";
2734
- }
2735
- };
2736
- const getPrintOptimizedClasses = () => {
2737
- if (!printOptimized) return "";
2738
- return cn(
2739
- "print:max-w-full",
2740
- "print:break-inside-avoid",
2741
- "print:mb-4"
2742
- );
2743
- };
2744
- return /* @__PURE__ */ jsx30(
2745
- "div",
2746
- {
2747
- className: cn(
2748
- "print-grid-container",
2749
- "w-full",
2750
- getMaxWidthClasses(maxWidth),
2751
- getPaddingClasses(padding),
2752
- getMarginClasses(margin),
2753
- getBackgroundClasses(background),
2754
- getPrintOptimizedClasses(),
2755
- className
2756
- ),
2757
- ...props,
2758
- children
2759
- }
2760
- );
2761
- }
2762
-
2763
- // src/components/PrintGrid/PrintGridBreakpoint.tsx
2764
- init_cn();
2765
- import { jsx as jsx31 } from "react/jsx-runtime";
2766
- function PrintGridBreakpoint({
2767
- children,
2768
- size = "md",
2769
- columns = 12,
2770
- gap = "md",
2771
- printOptimized = true,
2772
- className,
2773
- ...props
2774
- }) {
2775
- const getSizeClasses = (size2) => {
2776
- switch (size2) {
2777
- case "sm":
2778
- return "sm:";
2779
- case "md":
2780
- return "md:";
2781
- case "lg":
2782
- return "lg:";
2783
- case "xl":
2784
- return "xl:";
2785
- case "2xl":
2786
- return "2xl:";
2787
- default:
2788
- return "md:";
2789
- }
2790
- };
2791
- const getColumnsClasses = (cols) => {
2792
- switch (cols) {
2793
- case 1:
2794
- return "grid-cols-1";
2795
- case 2:
2796
- return "grid-cols-2";
2797
- case 3:
2798
- return "grid-cols-3";
2799
- case 4:
2800
- return "grid-cols-4";
2801
- case 5:
2802
- return "grid-cols-5";
2803
- case 6:
2804
- return "grid-cols-6";
2805
- case 12:
2806
- return "grid-cols-12";
2807
- default:
2808
- return "grid-cols-12";
2809
- }
2810
- };
2811
- const getGapClasses = (gap2) => {
2812
- switch (gap2) {
2813
- case "none":
2814
- return "gap-0";
2815
- case "sm":
2816
- return "gap-2";
2817
- case "lg":
2818
- return "gap-6";
2819
- case "xl":
2820
- return "gap-8";
2821
- default:
2822
- return "gap-4";
2823
- }
2824
- };
2825
- const getPrintOptimizedClasses = () => {
2826
- if (!printOptimized) return "";
2827
- return cn(
2828
- "print:break-inside-avoid",
2829
- "print:mb-4"
2830
- );
2831
- };
2832
- const getResponsiveClasses = () => {
2833
- const sizePrefix = getSizeClasses(size);
2834
- const columnsClass = getColumnsClasses(columns);
2835
- const gapClass = getGapClasses(gap);
2836
- return cn(
2837
- `${sizePrefix}grid`,
2838
- `${sizePrefix}${columnsClass}`,
2839
- `${sizePrefix}${gapClass}`
2840
- );
2841
- };
2842
- return /* @__PURE__ */ jsx31(
2843
- "div",
2844
- {
2845
- className: cn(
2846
- "print-grid-breakpoint",
2847
- getResponsiveClasses(),
2848
- getPrintOptimizedClasses(),
2849
- className
2850
- ),
2851
- ...props,
2852
- children
2853
- }
2854
- );
2855
- }
2856
-
2857
- // src/components/PrintFooter/PrintFooter.tsx
2858
- init_cn();
2859
-
2860
- // src/components/PrintFooter/PrintPageNumber.tsx
2861
- init_cn();
2862
- import { jsx as jsx32 } from "react/jsx-runtime";
2863
- function PrintPageNumber({
2864
- children,
2865
- format = "1",
2866
- template,
2867
- position = "right",
2868
- showTotal = false,
2869
- currentPage = 1,
2870
- totalPages = 1,
2871
- printOptimized = true,
2872
- className,
2873
- ...props
2874
- }) {
2875
- const getPositionClasses = (position2) => {
2876
- switch (position2) {
2877
- case "left":
2878
- return "justify-start";
2879
- case "center":
2880
- return "justify-center";
2881
- default:
2882
- return "justify-end";
2883
- }
2884
- };
2885
- const getPrintOptimizedClasses = () => {
2886
- if (!printOptimized) return "";
2887
- return cn(
2888
- "print:break-inside-avoid",
2889
- "print:text-sm",
2890
- "print:font-medium"
2891
- );
2892
- };
2893
- const formatPageNumber = () => {
2894
- if (template) {
2895
- return template.replace("{current}", currentPage.toString()).replace("{total}", totalPages.toString()).replace("{page}", currentPage.toString());
2896
- }
2897
- switch (format) {
2898
- case "1 of 5":
2899
- return `${currentPage} of ${totalPages}`;
2900
- case "Page 1":
2901
- return `Page ${currentPage}`;
2902
- case "Page 1 of 5":
2903
- return `Page ${currentPage} of ${totalPages}`;
2904
- case "1/5":
2905
- return `${currentPage}/${totalPages}`;
2906
- case "custom":
2907
- return template || currentPage.toString();
2908
- default:
2909
- return currentPage.toString();
2910
- }
2911
- };
2912
- return /* @__PURE__ */ jsx32(
2913
- "div",
2914
- {
2915
- className: cn(
2916
- "print-page-number",
2917
- "flex",
2918
- "items-center",
2919
- getPositionClasses(position),
2920
- getPrintOptimizedClasses(),
2921
- className
2922
- ),
2923
- ...props,
2924
- children: children || /* @__PURE__ */ jsx32(PrintText, { variant: "small", color: "muted", children: formatPageNumber() })
2925
- }
2926
- );
2927
- }
2928
-
2929
- // src/components/PrintFooter/PrintFooter.tsx
2930
- import { jsx as jsx33, jsxs as jsxs15 } from "react/jsx-runtime";
2931
- function PrintFooter({
2932
- children,
2933
- text,
2934
- position = "relative",
2935
- align = "center",
2936
- showPageNumbers = false,
2937
- pageNumberFormat = "1",
2938
- pageNumberTemplate,
2939
- pageNumberPosition = "right",
2940
- showTotalPages = false,
2941
- background = "transparent",
2942
- showBorder = false,
2943
- padding = "md",
2944
- margin = "none",
2945
- height = "auto",
2946
- printOptimized = true,
2947
- className,
2948
- ...props
2949
- }) {
2950
- const getPositionClasses = (position2) => {
2951
- switch (position2) {
2952
- case "fixed":
2953
- return "fixed bottom-0 left-0 right-0";
2954
- case "absolute":
2955
- return "absolute bottom-0 left-0 right-0";
2956
- case "sticky":
2957
- return "sticky bottom-0";
2958
- default:
2959
- return "relative";
2960
- }
2961
- };
2962
- const getAlignmentClasses = (align2) => {
2963
- switch (align2) {
2964
- case "left":
2965
- return "justify-start";
2966
- case "center":
2967
- return "justify-center";
2968
- case "right":
2969
- return "justify-end";
2970
- case "between":
2971
- return "justify-between";
2972
- case "around":
2973
- return "justify-around";
2974
- case "evenly":
2975
- return "justify-evenly";
2976
- default:
2977
- return "justify-center";
2978
- }
2979
- };
2980
- const getBackgroundClasses = (background2) => {
2981
- switch (background2) {
2982
- case "white":
2983
- return "bg-background";
2984
- case "gray":
2985
- return "bg-muted";
2986
- case "primary":
2987
- return "bg-primary text-primary-foreground";
2988
- case "secondary":
2989
- return "bg-secondary text-secondary-foreground";
2990
- default:
2991
- return "bg-transparent";
2992
- }
2993
- };
2994
- const getPaddingClasses = (padding2) => {
2995
- switch (padding2) {
2996
- case "none":
2997
- return "p-0";
2998
- case "sm":
2999
- return "p-2";
3000
- case "lg":
3001
- return "p-6";
3002
- case "xl":
3003
- return "p-8";
3004
- default:
3005
- return "p-4";
3006
- }
3007
- };
3008
- const getMarginClasses = (margin2) => {
3009
- switch (margin2) {
3010
- case "none":
3011
- return "m-0";
3012
- case "sm":
3013
- return "m-2";
3014
- case "md":
3015
- return "m-4";
3016
- case "lg":
3017
- return "m-6";
3018
- case "xl":
3019
- return "m-8";
3020
- default:
3021
- return "m-0";
3022
- }
3023
- };
3024
- const getHeightClasses = (height2) => {
3025
- switch (height2) {
3026
- case "sm":
3027
- return "h-8";
3028
- case "md":
3029
- return "h-12";
3030
- case "lg":
3031
- return "h-16";
3032
- case "xl":
3033
- return "h-20";
3034
- default:
3035
- return "h-auto";
3036
- }
3037
- };
3038
- const getPrintOptimizedClasses = () => {
3039
- if (!printOptimized) return "";
3040
- return cn(
3041
- "print:break-inside-avoid",
3042
- "print:mb-4",
3043
- "print:border-black",
3044
- "print:bg-white",
3045
- "print:text-black"
3046
- );
3047
- };
3048
- const getBorderClasses = () => {
3049
- if (!showBorder) return "";
3050
- return "border-t border-border";
3051
- };
3052
- return /* @__PURE__ */ jsxs15(
3053
- "footer",
3054
- {
3055
- className: cn(
3056
- "print-footer",
3057
- "flex",
3058
- "items-center",
3059
- "w-full",
3060
- getPositionClasses(position),
3061
- getAlignmentClasses(align),
3062
- getBackgroundClasses(background),
3063
- getPaddingClasses(padding),
3064
- getMarginClasses(margin),
3065
- getHeightClasses(height),
3066
- getBorderClasses(),
3067
- getPrintOptimizedClasses(),
3068
- className
3069
- ),
3070
- ...props,
3071
- children: [
3072
- text && /* @__PURE__ */ jsx33(PrintText, { variant: "small", color: "muted", children: text }),
3073
- children,
3074
- showPageNumbers && /* @__PURE__ */ jsx33(
3075
- PrintPageNumber,
3076
- {
3077
- format: pageNumberFormat,
3078
- template: pageNumberTemplate,
3079
- position: pageNumberPosition,
3080
- showTotal: showTotalPages,
3081
- printOptimized
3082
- }
3083
- )
3084
- ]
3085
- }
3086
- );
3087
- }
3088
-
3089
- // src/components/PrintFooter/PrintFooterContent.tsx
3090
- init_cn();
3091
- import { jsx as jsx34 } from "react/jsx-runtime";
3092
- function PrintFooterContent({
3093
- children,
3094
- align = "left",
3095
- padding = "none",
3096
- printOptimized = true,
3097
- className,
3098
- ...props
3099
- }) {
3100
- const getAlignmentClasses = (align2) => {
3101
- switch (align2) {
3102
- case "center":
3103
- return "text-center";
3104
- case "right":
3105
- return "text-right";
3106
- default:
3107
- return "text-left";
3108
- }
3109
- };
3110
- const getPaddingClasses = (padding2) => {
3111
- switch (padding2) {
3112
- case "none":
3113
- return "p-0";
3114
- case "sm":
3115
- return "p-2";
3116
- case "lg":
3117
- return "p-6";
3118
- case "xl":
3119
- return "p-8";
3120
- default:
3121
- return "p-4";
3122
- }
3123
- };
3124
- const getPrintOptimizedClasses = () => {
3125
- if (!printOptimized) return "";
3126
- return cn(
3127
- "print:break-inside-avoid",
3128
- "print:text-sm",
3129
- "print:leading-tight"
3130
- );
3131
- };
3132
- return /* @__PURE__ */ jsx34(
3133
- "div",
3134
- {
3135
- className: cn(
3136
- "print-footer-content",
3137
- getAlignmentClasses(align),
3138
- getPaddingClasses(padding),
3139
- getPrintOptimizedClasses(),
3140
- className
3141
- ),
3142
- ...props,
3143
- children
3144
- }
3145
- );
3146
- }
3147
-
3148
- // src/components/PrintFooter/PrintFooterInfo.tsx
3149
- init_cn();
3150
- import { jsx as jsx35 } from "react/jsx-runtime";
3151
- function PrintFooterInfo({
3152
- children,
3153
- align = "left",
3154
- background = "transparent",
3155
- showBorder = false,
3156
- printOptimized = true,
3157
- className,
3158
- ...props
3159
- }) {
3160
- const getAlignmentClasses = (align2) => {
3161
- switch (align2) {
3162
- case "center":
3163
- return "text-center";
3164
- case "right":
3165
- return "text-right";
3166
- default:
3167
- return "text-left";
3168
- }
3169
- };
3170
- const getBackgroundClasses = (background2) => {
3171
- switch (background2) {
3172
- case "white":
3173
- return "bg-background";
3174
- case "gray":
3175
- return "bg-muted";
3176
- case "primary":
3177
- return "bg-primary text-primary-foreground";
3178
- case "secondary":
3179
- return "bg-secondary text-secondary-foreground";
3180
- default:
3181
- return "bg-transparent";
3182
- }
3183
- };
3184
- const getBorderClasses = () => {
3185
- if (!showBorder) return "";
3186
- return "border border-border rounded";
3187
- };
3188
- const getPrintOptimizedClasses = () => {
3189
- if (!printOptimized) return "";
3190
- return cn(
3191
- "print:break-inside-avoid",
3192
- "print:text-sm",
3193
- "print:leading-tight",
3194
- "print:border-black",
3195
- "print:bg-white",
3196
- "print:text-black"
3197
- );
3198
- };
3199
- return /* @__PURE__ */ jsx35(
3200
- "div",
3201
- {
3202
- className: cn(
3203
- "print-footer-info",
3204
- "p-3",
3205
- "rounded",
3206
- getAlignmentClasses(align),
3207
- getBackgroundClasses(background),
3208
- getBorderClasses(),
3209
- getPrintOptimizedClasses(),
3210
- className
3211
- ),
3212
- ...props,
3213
- children: /* @__PURE__ */ jsx35(PrintText, { variant: "small", color: "muted", children })
3214
- }
3215
- );
3216
- }
3217
-
3218
- // src/components/PrintPageBreak/PrintPageBreak.tsx
3219
- init_cn();
3220
-
3221
- // src/components/PrintPageBreak/PrintPageBreakIndicator.tsx
3222
- init_cn();
3223
- import { jsx as jsx36 } from "react/jsx-runtime";
3224
- function PrintPageBreakIndicator({
3225
- children,
3226
- type = "line",
3227
- color = "default",
3228
- size = "md",
3229
- printOptimized = true,
3230
- className,
3231
- ...props
3232
- }) {
3233
- const getTypeClasses = () => {
3234
- switch (type) {
3235
- case "dotted":
3236
- return "border-dotted";
3237
- case "dashed":
3238
- return "border-dashed";
3239
- case "text":
3240
- return "text-center";
3241
- case "icon":
3242
- return "text-center";
3243
- default:
3244
- return "border-solid";
3245
- }
3246
- };
3247
- const getColorClasses = () => {
3248
- switch (color) {
3249
- case "primary":
3250
- return "border-primary text-primary";
3251
- case "secondary":
3252
- return "border-secondary text-secondary";
3253
- case "muted":
3254
- return "border-muted-foreground text-muted-foreground";
3255
- case "accent":
3256
- return "border-accent text-accent";
3257
- default:
3258
- return "border-border text-foreground";
3259
- }
3260
- };
3261
- const getSizeClasses = () => {
3262
- switch (size) {
3263
- case "sm":
3264
- return "h-1 text-xs";
3265
- case "lg":
3266
- return "h-3 text-lg";
3267
- default:
3268
- return "h-2 text-sm";
3269
- }
3270
- };
3271
- const getPrintOptimizedClasses = () => {
3272
- if (!printOptimized) return "";
3273
- return cn(
3274
- "print:border-black",
3275
- "print:text-black"
3276
- );
3277
- };
3278
- const renderContent = () => {
3279
- if (children) {
3280
- return children;
3281
- }
3282
- switch (type) {
3283
- case "text":
3284
- return "--- Page Break ---";
3285
- case "icon":
3286
- return "\u{1F4C4}";
3287
- case "line":
3288
- return "--- Page Break ---";
3289
- default:
3290
- return "--- Page Break ---";
3291
- }
3292
- };
3293
- const isLineType = type === "line" || type === "dotted" || type === "dashed";
3294
- return /* @__PURE__ */ jsx36(
3295
- "div",
3296
- {
3297
- className: cn(
3298
- "print-page-break-indicator",
3299
- "flex",
3300
- "items-center",
3301
- "justify-center",
3302
- "w-full",
3303
- getTypeClasses(),
3304
- getColorClasses(),
3305
- getSizeClasses(),
3306
- isLineType && "border-t",
3307
- getPrintOptimizedClasses(),
3308
- className
3309
- ),
3310
- ...props,
3311
- children: renderContent()
3312
- }
3313
- );
3314
- }
3315
-
3316
- // src/components/PrintPageBreak/PrintPageBreak.tsx
3317
- import { jsx as jsx37, jsxs as jsxs16 } from "react/jsx-runtime";
3318
- function PrintPageBreak({
3319
- type = "auto",
3320
- strength = "normal",
3321
- showIndicator = false,
3322
- indicator,
3323
- label,
3324
- description,
3325
- printOptimized = true,
3326
- className,
3327
- ...props
3328
- }) {
3329
- const getBreakClass = () => {
3330
- const baseClass = "print-page-break";
3331
- switch (type) {
3332
- case "before":
3333
- return cn(baseClass, "print-break-before");
3334
- case "after":
3335
- return cn(baseClass, "print-break-after");
3336
- case "avoid":
3337
- return cn(baseClass, "print-break-avoid");
3338
- case "always":
3339
- return cn(baseClass, "print-break-before print-break-after");
3340
- case "left":
3341
- return cn(baseClass, "print-break-before", "print:page-break-before:left");
3342
- case "right":
3343
- return cn(baseClass, "print-break-before", "print:page-break-before:right");
3344
- default:
3345
- return baseClass;
3346
- }
3347
- };
3348
- const getStrengthClass = () => {
3349
- switch (strength) {
3350
- case "weak":
3351
- return "print:page-break-inside:avoid";
3352
- case "strong":
3353
- return "print:page-break-inside:avoid print:break-inside-avoid";
3354
- default:
3355
- return "";
3356
- }
3357
- };
3358
- const getPrintOptimizedClasses = () => {
3359
- if (!printOptimized) return "";
3360
- return cn(
3361
- "print:break-inside-avoid",
3362
- "print:mb-4"
3363
- );
3364
- };
3365
- const renderIndicator = () => {
3366
- if (!showIndicator) return null;
3367
- if (indicator) {
3368
- return indicator;
3369
- }
3370
- return /* @__PURE__ */ jsx37(
3371
- PrintPageBreakIndicator,
3372
- {
3373
- type: "line",
3374
- color: "muted",
3375
- size: "md",
3376
- printOptimized
3377
- }
3378
- );
3379
- };
3380
- const renderLabel = () => {
3381
- if (!label) return null;
3382
- return /* @__PURE__ */ jsx37(PrintText, { variant: "small", color: "muted", className: "text-center", children: label });
3383
- };
3384
- const renderDescription = () => {
3385
- if (!description) return null;
3386
- return /* @__PURE__ */ jsx37(PrintText, { variant: "small", color: "muted", className: "text-center mt-1", children: description });
3387
- };
3388
- return /* @__PURE__ */ jsxs16(
3389
- "div",
3390
- {
3391
- className: cn(
3392
- getBreakClass(),
3393
- getStrengthClass(),
3394
- getPrintOptimizedClasses(),
3395
- className
3396
- ),
3397
- "aria-hidden": "true",
3398
- ...props,
3399
- children: [
3400
- renderIndicator(),
3401
- renderLabel(),
3402
- renderDescription()
3403
- ]
3404
- }
3405
- );
3406
- }
3407
-
3408
- // src/components/PrintPageBreak/PrintPageBreakGroup.tsx
3409
- init_cn();
3410
- import { jsx as jsx38, jsxs as jsxs17 } from "react/jsx-runtime";
3411
- function PrintPageBreakGroup({
3412
- children,
3413
- type = "auto",
3414
- strength = "normal",
3415
- label,
3416
- description,
3417
- printOptimized = true,
3418
- className,
3419
- ...props
3420
- }) {
3421
- const getBreakClass = () => {
3422
- const baseClass = "print-page-break-group";
3423
- switch (type) {
3424
- case "before":
3425
- return cn(baseClass, "print-break-before");
3426
- case "after":
3427
- return cn(baseClass, "print-break-after");
3428
- case "avoid":
3429
- return cn(baseClass, "print-break-avoid");
3430
- case "always":
3431
- return cn(baseClass, "print-break-before print-break-after");
3432
- case "left":
3433
- return cn(baseClass, "print-break-before", "print:page-break-before:left");
3434
- case "right":
3435
- return cn(baseClass, "print-break-before", "print:page-break-before:right");
3436
- default:
3437
- return baseClass;
3438
- }
3439
- };
3440
- const getStrengthClass = () => {
3441
- switch (strength) {
3442
- case "weak":
3443
- return "print:page-break-inside:avoid";
3444
- case "strong":
3445
- return "print:page-break-inside:avoid print:break-inside-avoid";
3446
- default:
3447
- return "";
3448
- }
3449
- };
3450
- const getPrintOptimizedClasses = () => {
3451
- if (!printOptimized) return "";
3452
- return cn(
3453
- "print:break-inside-avoid",
3454
- "print:mb-4"
3455
- );
3456
- };
3457
- return /* @__PURE__ */ jsxs17(
3458
- "div",
3459
- {
3460
- className: cn(
3461
- getBreakClass(),
3462
- getStrengthClass(),
3463
- getPrintOptimizedClasses(),
3464
- className
3465
- ),
3466
- ...props,
3467
- children: [
3468
- label && /* @__PURE__ */ jsx38(PrintText, { variant: "small", color: "muted", className: "mb-2", children: label }),
3469
- children,
3470
- description && /* @__PURE__ */ jsx38(PrintText, { variant: "small", color: "muted", className: "mt-2", children: description })
821
+ isLoading && /* @__PURE__ */ jsx6("div", { className: "absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center", children: /* @__PURE__ */ jsx6("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-main-500" }) }),
822
+ error && /* @__PURE__ */ jsx6("div", { className: "mt-2 text-sm text-acc-600", children: error })
3471
823
  ]
3472
824
  }
3473
825
  );
@@ -3523,39 +875,6 @@ export {
3523
875
  PaceAppLayout,
3524
876
  PaceLoginPage,
3525
877
  PasswordResetForm,
3526
- PrintButton,
3527
- PrintButtonGroup,
3528
- PrintCard,
3529
- PrintCardContent,
3530
- PrintCardFooter,
3531
- PrintCardGrid,
3532
- PrintCardHeader,
3533
- PrintCardImage,
3534
- PrintColumn,
3535
- PrintCoverHeader,
3536
- PrintDataTable,
3537
- PrintDivider,
3538
- PrintFooter,
3539
- PrintFooterContent,
3540
- PrintFooterInfo,
3541
- PrintGrid,
3542
- PrintGridBreakpoint,
3543
- PrintGridContainer,
3544
- PrintGridItem,
3545
- PrintHeader,
3546
- PrintLayout,
3547
- PrintLayoutProvider,
3548
- PrintPageBreak,
3549
- PrintPageBreakGroup,
3550
- PrintPageBreakIndicator,
3551
- PrintPageNumber,
3552
- PrintSection,
3553
- PrintSectionContent,
3554
- PrintSectionHeader,
3555
- PrintTableGroup,
3556
- PrintTableRow,
3557
- PrintText,
3558
- PrintToolbar,
3559
878
  Progress,
3560
879
  PublicErrorBoundary,
3561
880
  PublicLoadingSkeleton,
@@ -3605,7 +924,6 @@ export {
3605
924
  useErrorBoundary,
3606
925
  useFileUpload,
3607
926
  useIsPublicPage,
3608
- usePrintLayout,
3609
927
  usePublicPageContext2 as usePublicPageContext,
3610
928
  usePublicPageContext as usePublicPageProviderContext,
3611
929
  useStorage,