@carlonicora/nextjs-jsonapi 3.19.1 → 3.20.0

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 (60) hide show
  1. package/dist/{BlockNoteEditor-7VMBZI3V.js → BlockNoteEditor-2WFPGK64.js} +19 -19
  2. package/dist/{BlockNoteEditor-7VMBZI3V.js.map → BlockNoteEditor-2WFPGK64.js.map} +1 -1
  3. package/dist/{BlockNoteEditor-FX5RSUPA.mjs → BlockNoteEditor-CTRQ6JWE.mjs} +4 -4
  4. package/dist/{BlockNoteViewer-SVVAZ6TQ.js → BlockNoteViewer-XCGBX4ST.js} +3 -3
  5. package/dist/{BlockNoteViewer-SVVAZ6TQ.js.map → BlockNoteViewer-XCGBX4ST.js.map} +1 -1
  6. package/dist/{BlockNoteViewer-RK2RKOB7.mjs → BlockNoteViewer-ZY4ZF3HO.mjs} +2 -2
  7. package/dist/billing/index.js +401 -401
  8. package/dist/billing/index.mjs +3 -3
  9. package/dist/{chunk-GNXZNUQV.mjs → chunk-CJHBL5AN.mjs} +1711 -1482
  10. package/dist/chunk-CJHBL5AN.mjs.map +1 -0
  11. package/dist/{chunk-YCFPSXLK.mjs → chunk-CK47KSFV.mjs} +6 -1
  12. package/dist/{chunk-YCFPSXLK.mjs.map → chunk-CK47KSFV.mjs.map} +1 -1
  13. package/dist/{chunk-RT3TM342.js → chunk-IQMJAYCJ.js} +1162 -933
  14. package/dist/chunk-IQMJAYCJ.js.map +1 -0
  15. package/dist/{chunk-TBSMAL5Y.js → chunk-MWZCCOTS.js} +6 -1
  16. package/dist/chunk-MWZCCOTS.js.map +1 -0
  17. package/dist/{chunk-ODH2LYWC.js → chunk-SYQMVTIC.js} +7 -7
  18. package/dist/{chunk-ODH2LYWC.js.map → chunk-SYQMVTIC.js.map} +1 -1
  19. package/dist/{chunk-IALPADOD.mjs → chunk-U55JQ4NY.mjs} +2 -2
  20. package/dist/client/index.js +4 -4
  21. package/dist/client/index.mjs +3 -3
  22. package/dist/components/index.d.mts +24 -2
  23. package/dist/components/index.d.ts +24 -2
  24. package/dist/components/index.js +8 -4
  25. package/dist/components/index.js.map +1 -1
  26. package/dist/components/index.mjs +7 -3
  27. package/dist/contexts/index.js +4 -4
  28. package/dist/contexts/index.mjs +3 -3
  29. package/dist/core/index.d.mts +3 -0
  30. package/dist/core/index.d.ts +3 -0
  31. package/dist/core/index.js +2 -2
  32. package/dist/core/index.mjs +1 -1
  33. package/dist/features/help/index.js +37 -37
  34. package/dist/features/help/index.mjs +3 -3
  35. package/dist/features/tokenusage/index.js +101 -101
  36. package/dist/features/tokenusage/index.mjs +3 -3
  37. package/dist/index.js +3 -3
  38. package/dist/index.mjs +2 -2
  39. package/dist/server/index.js +3 -3
  40. package/dist/server/index.mjs +1 -1
  41. package/package.json +1 -1
  42. package/src/features/notification/components/containers/NotificationsListContainer.tsx +35 -18
  43. package/src/features/notification/components/filters/NotificationViewSwitcher.tsx +48 -0
  44. package/src/features/notification/components/filters/index.ts +1 -0
  45. package/src/features/notification/components/index.ts +1 -0
  46. package/src/features/notification/components/lists/NotificationsList.tsx +59 -104
  47. package/src/features/notification/components/modals/NotificationModal.tsx +97 -27
  48. package/src/features/notification/components/modals/__tests__/NotificationModal.spec.tsx +15 -4
  49. package/src/features/notification/components/notifications/Notification.tsx +19 -14
  50. package/src/features/notification/components/notifications/NotificationIcon.tsx +37 -0
  51. package/src/features/notification/components/notifications/index.ts +1 -0
  52. package/src/features/notification/data/notification.fields.ts +4 -0
  53. package/src/features/notification/hooks/useNotificationTableStructure.tsx +186 -0
  54. package/src/features/notification/notification.module.ts +2 -0
  55. package/dist/chunk-GNXZNUQV.mjs.map +0 -1
  56. package/dist/chunk-RT3TM342.js.map +0 -1
  57. package/dist/chunk-TBSMAL5Y.js.map +0 -1
  58. /package/dist/{BlockNoteEditor-FX5RSUPA.mjs.map → BlockNoteEditor-CTRQ6JWE.mjs.map} +0 -0
  59. /package/dist/{BlockNoteViewer-RK2RKOB7.mjs.map → BlockNoteViewer-ZY4ZF3HO.mjs.map} +0 -0
  60. /package/dist/{chunk-IALPADOD.mjs.map → chunk-U55JQ4NY.mjs.map} +0 -0
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
 
20
20
 
21
- var _chunkODH2LYWCjs = require('./chunk-ODH2LYWC.js');
21
+ var _chunkSYQMVTICjs = require('./chunk-SYQMVTIC.js');
22
22
 
23
23
 
24
24
 
@@ -244,7 +244,7 @@ var _chunkODH2LYWCjs = require('./chunk-ODH2LYWC.js');
244
244
 
245
245
 
246
246
 
247
- var _chunkTBSMAL5Yjs = require('./chunk-TBSMAL5Y.js');
247
+ var _chunkMWZCCOTSjs = require('./chunk-MWZCCOTS.js');
248
248
  require('./chunk-LXKSUWAV.js');
249
249
  require('./chunk-IBS6NI7D.js');
250
250
 
@@ -515,5 +515,5 @@ require('./chunk-7QVYU63E.js');
515
515
 
516
516
 
517
517
 
518
- exports.ACTION_TYPES = _chunkODH2LYWCjs.ACTION_TYPES; exports.AVAILABLE_OAUTH_SCOPES = _chunkTBSMAL5Yjs.AVAILABLE_OAUTH_SCOPES; exports.AbstractApiData = _chunkTBSMAL5Yjs.AbstractApiData; exports.AbstractService = _chunkTBSMAL5Yjs.AbstractService; exports.Action = _chunkTBSMAL5Yjs.Action; exports.AiConnection = _chunkTBSMAL5Yjs.AiConnection; exports.AiConnectionFields = _chunkTBSMAL5Yjs.AiConnectionFields; exports.AiConnectionModule = _chunkTBSMAL5Yjs.AiConnectionModule; exports.AiConnectionService = _chunkTBSMAL5Yjs.AiConnectionService; exports.Assistant = _chunkTBSMAL5Yjs.Assistant; exports.AssistantAction = _chunkTBSMAL5Yjs.AssistantAction; exports.AssistantActionModule = _chunkTBSMAL5Yjs.AssistantActionModule; exports.AssistantActionService = _chunkTBSMAL5Yjs.AssistantActionService; exports.AssistantMessage = _chunkTBSMAL5Yjs.AssistantMessage; exports.AssistantMessageModule = _chunkTBSMAL5Yjs.AssistantMessageModule; exports.AssistantMessageService = _chunkTBSMAL5Yjs.AssistantMessageService; exports.AssistantModule = _chunkTBSMAL5Yjs.AssistantModule; exports.AssistantService = _chunkTBSMAL5Yjs.AssistantService; exports.AuditLog = _chunkTBSMAL5Yjs.AuditLog; exports.AuditLogModule = _chunkTBSMAL5Yjs.AuditLogModule; exports.AuditLogService = _chunkTBSMAL5Yjs.AuditLogService; exports.Auth = _chunkTBSMAL5Yjs.Auth; exports.AuthComponent = _chunkTBSMAL5Yjs.AuthComponent; exports.AuthModule = _chunkTBSMAL5Yjs.AuthModule; exports.AuthService = _chunkTBSMAL5Yjs.AuthService; exports.AuthorModule = _chunkTBSMAL5Yjs.AuthorModule; exports.BackupCodeVerify = _chunkTBSMAL5Yjs.BackupCodeVerify; exports.BackupCodeVerifyModule = _chunkTBSMAL5Yjs.BackupCodeVerifyModule; exports.Billing = _chunkTBSMAL5Yjs.Billing; exports.BillingModule = _chunkTBSMAL5Yjs.BillingModule; exports.BillingService = _chunkTBSMAL5Yjs.BillingService; exports.BlockNoteDiffUtil = _chunkTBSMAL5Yjs.BlockNoteDiffUtil; exports.BlockNoteWordDiffRendererUtil = _chunkTBSMAL5Yjs.BlockNoteWordDiffRendererUtil; exports.COMPANY_ADMINISTRATOR_ROLE_ID = _chunkODH2LYWCjs.COMPANY_ADMINISTRATOR_ROLE_ID; exports.CURRENT_USER_STORAGE_KEY = _chunkTBSMAL5Yjs.CURRENT_USER_STORAGE_KEY; exports.Chunk = _chunkTBSMAL5Yjs.Chunk; exports.ChunkModule = _chunkTBSMAL5Yjs.ChunkModule; exports.ClientAbstractService = _chunkTBSMAL5Yjs.ClientAbstractService; exports.ClientHttpMethod = _chunkTBSMAL5Yjs.ClientHttpMethod; exports.Company = _chunkTBSMAL5Yjs.Company; exports.CompanyFields = _chunkTBSMAL5Yjs.CompanyFields; exports.CompanyModule = _chunkTBSMAL5Yjs.CompanyModule; exports.CompanyService = _chunkTBSMAL5Yjs.CompanyService; exports.Content = _chunkTBSMAL5Yjs.Content; exports.ContentFields = _chunkTBSMAL5Yjs.ContentFields; exports.ContentModule = _chunkTBSMAL5Yjs.ContentModule; exports.ContentService = _chunkTBSMAL5Yjs.ContentService; exports.DEFAULT_GRANT_TYPES = _chunkTBSMAL5Yjs.DEFAULT_GRANT_TYPES; exports.DataClass = _chunkLU7DJ4QFjs.DataClassRegistry; exports.DataClassRegistry = _chunkLU7DJ4QFjs.DataClassRegistry; exports.ENV = _chunkLU7DJ4QFjs.ENV; exports.EndpointCreator = _chunkTBSMAL5Yjs.EndpointCreator; exports.EntityAiStatus = _chunkTBSMAL5Yjs.EntityAiStatus; exports.Feature = _chunkTBSMAL5Yjs.Feature; exports.FeatureModule = _chunkTBSMAL5Yjs.FeatureModule; exports.FeatureService = _chunkTBSMAL5Yjs.FeatureService; exports.HandbookPage = _chunkTBSMAL5Yjs.HandbookPage; exports.HandbookPageFields = _chunkTBSMAL5Yjs.HandbookPageFields; exports.HandbookPageModule = _chunkTBSMAL5Yjs.HandbookPageModule; exports.HandbookPageService = _chunkTBSMAL5Yjs.HandbookPageService; exports.HandbookSection = _chunkTBSMAL5Yjs.HandbookSection; exports.HandbookSectionModule = _chunkTBSMAL5Yjs.HandbookSectionModule; exports.HandbookSectionService = _chunkTBSMAL5Yjs.HandbookSectionService; exports.HandbookThread = _chunkTBSMAL5Yjs.HandbookThread; exports.HandbookThreadMessage = _chunkTBSMAL5Yjs.HandbookThreadMessage; exports.HandbookThreadMessageModule = _chunkTBSMAL5Yjs.HandbookThreadMessageModule; exports.HandbookThreadMessageService = _chunkTBSMAL5Yjs.HandbookThreadMessageService; exports.HandbookThreadModule = _chunkTBSMAL5Yjs.HandbookThreadModule; exports.HandbookThreadService = _chunkTBSMAL5Yjs.HandbookThreadService; exports.HowTo = _chunkTBSMAL5Yjs.HowTo; exports.HowToFields = _chunkTBSMAL5Yjs.HowToFields; exports.HowToModule = _chunkTBSMAL5Yjs.HowToModule; exports.HowToService = _chunkTBSMAL5Yjs.HowToService; exports.HttpMethod = _chunkTBSMAL5Yjs.HttpMethod; exports.InvoiceStatus = _chunkTBSMAL5Yjs.InvoiceStatus; exports.JsonApiDataFactory = _chunkLU7DJ4QFjs.JsonApiDataFactory; exports.MOBILE_BREAKPOINT = _chunkTBSMAL5Yjs.MOBILE_BREAKPOINT; exports.Module = _chunkTBSMAL5Yjs.Module; exports.ModuleModule = _chunkTBSMAL5Yjs.ModuleModule; exports.ModulePaths = _chunkTBSMAL5Yjs.ModulePaths; exports.ModulePathsModule = _chunkTBSMAL5Yjs.ModulePathsModule; exports.ModuleRegistrar = _chunkTBSMAL5Yjs.ModuleRegistrar; exports.ModuleRegistry = _chunkTBSMAL5Yjs.ModuleRegistry; exports.Modules = _chunkTBSMAL5Yjs.Modules; exports.Notification = _chunkTBSMAL5Yjs.Notification; exports.NotificationFields = _chunkTBSMAL5Yjs.NotificationFields; exports.NotificationModule = _chunkTBSMAL5Yjs.NotificationModule; exports.NotificationService = _chunkTBSMAL5Yjs.NotificationService; exports.OAUTH_SCOPE_DISPLAY = _chunkTBSMAL5Yjs.OAUTH_SCOPE_DISPLAY; exports.OAuthClient = _chunkTBSMAL5Yjs.OAuthClient; exports.OAuthModule = _chunkTBSMAL5Yjs.OAuthModule; exports.OAuthService = _chunkTBSMAL5Yjs.OAuthService; exports.Passkey = _chunkTBSMAL5Yjs.Passkey; exports.PasskeyAuthenticationOptions = _chunkTBSMAL5Yjs.PasskeyAuthenticationOptions; exports.PasskeyAuthenticationOptionsModule = _chunkTBSMAL5Yjs.PasskeyAuthenticationOptionsModule; exports.PasskeyModule = _chunkTBSMAL5Yjs.PasskeyModule; exports.PasskeyRegistrationOptions = _chunkTBSMAL5Yjs.PasskeyRegistrationOptions; exports.PasskeyRegistrationOptionsModule = _chunkTBSMAL5Yjs.PasskeyRegistrationOptionsModule; exports.PasskeyRegistrationVerify = _chunkTBSMAL5Yjs.PasskeyRegistrationVerify; exports.PasskeyRegistrationVerifyModule = _chunkTBSMAL5Yjs.PasskeyRegistrationVerifyModule; exports.PasskeyRename = _chunkTBSMAL5Yjs.PasskeyRename; exports.PasskeyRenameModule = _chunkTBSMAL5Yjs.PasskeyRenameModule; exports.PasskeyVerifyLogin = _chunkTBSMAL5Yjs.PasskeyVerifyLogin; exports.PasskeyVerifyLoginModule = _chunkTBSMAL5Yjs.PasskeyVerifyLoginModule; exports.PaymentMethod = _chunkTBSMAL5Yjs.PaymentMethod; exports.PermissionMapping = _chunkTBSMAL5Yjs.PermissionMapping; exports.PermissionMappingModule = _chunkTBSMAL5Yjs.PermissionMappingModule; exports.Push = _chunkTBSMAL5Yjs.Push; exports.PushModule = _chunkTBSMAL5Yjs.PushModule; exports.PushService = _chunkTBSMAL5Yjs.PushService; exports.RbacMatrixModel = _chunkTBSMAL5Yjs.RbacMatrixModel; exports.RbacMatrixModule = _chunkTBSMAL5Yjs.RbacMatrixModule; exports.RbacService = _chunkODH2LYWCjs.RbacService; exports.ReferralModule = _chunkTBSMAL5Yjs.ReferralModule; exports.ReferralService = _chunkTBSMAL5Yjs.ReferralService; exports.ReferralStats = _chunkTBSMAL5Yjs.ReferralStats; exports.ReferralStatsModule = _chunkTBSMAL5Yjs.ReferralStatsModule; exports.RehydrationFactory = _chunkTBSMAL5Yjs.RehydrationFactory; exports.Role = _chunkTBSMAL5Yjs.Role; exports.RoleFields = _chunkTBSMAL5Yjs.RoleFields; exports.RoleModule = _chunkTBSMAL5Yjs.RoleModule; exports.RoleService = _chunkTBSMAL5Yjs.RoleService; exports.S3 = _chunkTBSMAL5Yjs.S3; exports.S3Module = _chunkTBSMAL5Yjs.S3Module; exports.S3Service = _chunkTBSMAL5Yjs.S3Service; exports.StripeCustomer = _chunkTBSMAL5Yjs.StripeCustomer; exports.StripeCustomerModule = _chunkTBSMAL5Yjs.StripeCustomerModule; exports.StripeCustomerService = _chunkTBSMAL5Yjs.StripeCustomerService; exports.StripeInvoice = _chunkTBSMAL5Yjs.StripeInvoice; exports.StripeInvoiceModule = _chunkTBSMAL5Yjs.StripeInvoiceModule; exports.StripeInvoiceService = _chunkTBSMAL5Yjs.StripeInvoiceService; exports.StripePaymentMethodModule = _chunkTBSMAL5Yjs.StripePaymentMethodModule; exports.StripePrice = _chunkTBSMAL5Yjs.StripePrice; exports.StripePriceFields = _chunkTBSMAL5Yjs.StripePriceFields; exports.StripePriceModule = _chunkTBSMAL5Yjs.StripePriceModule; exports.StripePriceService = _chunkTBSMAL5Yjs.StripePriceService; exports.StripeProduct = _chunkTBSMAL5Yjs.StripeProduct; exports.StripeProductFields = _chunkTBSMAL5Yjs.StripeProductFields; exports.StripeProductModule = _chunkTBSMAL5Yjs.StripeProductModule; exports.StripeProductService = _chunkTBSMAL5Yjs.StripeProductService; exports.StripePromotionCode = _chunkTBSMAL5Yjs.StripePromotionCode; exports.StripePromotionCodeModule = _chunkTBSMAL5Yjs.StripePromotionCodeModule; exports.StripePromotionCodeService = _chunkTBSMAL5Yjs.StripePromotionCodeService; exports.StripeSubscription = _chunkTBSMAL5Yjs.StripeSubscription; exports.StripeSubscriptionModule = _chunkTBSMAL5Yjs.StripeSubscriptionModule; exports.StripeSubscriptionService = _chunkTBSMAL5Yjs.StripeSubscriptionService; exports.StripeUsage = _chunkTBSMAL5Yjs.StripeUsage; exports.StripeUsageModule = _chunkTBSMAL5Yjs.StripeUsageModule; exports.StripeUsageService = _chunkTBSMAL5Yjs.StripeUsageService; exports.SubscriptionStatus = _chunkTBSMAL5Yjs.SubscriptionStatus; exports.TableOptions = _chunkTBSMAL5Yjs.TableOptions; exports.TokenUsageAdminBreakdownModule = _chunkTBSMAL5Yjs.TokenUsageAdminBreakdownModule; exports.TokenUsageAdminSummaryModule = _chunkTBSMAL5Yjs.TokenUsageAdminSummaryModule; exports.TokenUsageAdminTimelineModule = _chunkTBSMAL5Yjs.TokenUsageAdminTimelineModule; exports.TotpAuthenticator = _chunkTBSMAL5Yjs.TotpAuthenticator; exports.TotpAuthenticatorModule = _chunkTBSMAL5Yjs.TotpAuthenticatorModule; exports.TotpSetup = _chunkTBSMAL5Yjs.TotpSetup; exports.TotpSetupModule = _chunkTBSMAL5Yjs.TotpSetupModule; exports.TotpVerify = _chunkTBSMAL5Yjs.TotpVerify; exports.TotpVerifyLogin = _chunkTBSMAL5Yjs.TotpVerifyLogin; exports.TotpVerifyLoginModule = _chunkTBSMAL5Yjs.TotpVerifyLoginModule; exports.TotpVerifyModule = _chunkTBSMAL5Yjs.TotpVerifyModule; exports.TwoFactorChallenge = _chunkTBSMAL5Yjs.TwoFactorChallenge; exports.TwoFactorChallengeModule = _chunkTBSMAL5Yjs.TwoFactorChallengeModule; exports.TwoFactorEnable = _chunkTBSMAL5Yjs.TwoFactorEnable; exports.TwoFactorEnableModule = _chunkTBSMAL5Yjs.TwoFactorEnableModule; exports.TwoFactorService = _chunkTBSMAL5Yjs.TwoFactorService; exports.TwoFactorStatus = _chunkTBSMAL5Yjs.TwoFactorStatus; exports.TwoFactorStatusModule = _chunkTBSMAL5Yjs.TwoFactorStatusModule; exports.User = _chunkTBSMAL5Yjs.User; exports.UserFields = _chunkTBSMAL5Yjs.UserFields; exports.UserModule = _chunkTBSMAL5Yjs.UserModule; exports.UserService = _chunkTBSMAL5Yjs.UserService; exports.VIEWPORT_COOKIE_NAME = _chunkTBSMAL5Yjs.VIEWPORT_COOKIE_NAME; exports.Waitlist = _chunkTBSMAL5Yjs.Waitlist; exports.WaitlistModule = _chunkTBSMAL5Yjs.WaitlistModule; exports.WaitlistService = _chunkTBSMAL5Yjs.WaitlistService; exports.WaitlistStats = _chunkTBSMAL5Yjs.WaitlistStats; exports.WaitlistStatsModule = _chunkTBSMAL5Yjs.WaitlistStatsModule; exports.checkPermissions = _chunkTBSMAL5Yjs.checkPermissions; exports.checkPermissionsFromServer = _chunkTBSMAL5Yjs.checkPermissionsFromServer; exports.clearLastApiMeta = _chunkTBSMAL5Yjs.clearLastApiMeta; exports.clearLastApiTotal = _chunkTBSMAL5Yjs.clearLastApiTotal; exports.cn = _chunkTBSMAL5Yjs.cn; exports.composeRefs = _chunkTBSMAL5Yjs.composeRefs; exports.configureAuth = _chunkTBSMAL5Yjs.configureAuth; exports.configureI18n = _chunkODH2LYWCjs.configureI18n; exports.configureJsonApi = _chunkODH2LYWCjs.configureJsonApi; exports.configureLogin = _chunkODH2LYWCjs.configureLogin; exports.configureReferral = _chunkODH2LYWCjs.configureReferral; exports.configureRoles = _chunkODH2LYWCjs.configureRoles; exports.configureTokenUsage = _chunkTBSMAL5Yjs.configureTokenUsage; exports.configureWaitlist = _chunkODH2LYWCjs.configureWaitlist; exports.createJsonApiInclusion = _chunkTBSMAL5Yjs.createJsonApiInclusion; exports.dismissToast = _chunkTBSMAL5Yjs.dismissToast; exports.entityObjectSchema = _chunkTBSMAL5Yjs.entityObjectSchema; exports.exists = _chunkTBSMAL5Yjs.exists; exports.formatCodiceFiscale = _chunkTBSMAL5Yjs.formatCodiceFiscale; exports.formatDate = _chunkTBSMAL5Yjs.formatDate; exports.formatLocalDate = _chunkTBSMAL5Yjs.formatLocalDate; exports.formatPartitaIva = _chunkTBSMAL5Yjs.formatPartitaIva; exports.getApiUrl = _chunkODH2LYWCjs.getApiUrl; exports.getAppUrl = _chunkODH2LYWCjs.getAppUrl; exports.getBootstrapper = _chunkLU7DJ4QFjs.getBootstrapper; exports.getClientGlobalErrorHandler = _chunkTBSMAL5Yjs.getClientGlobalErrorHandler; exports.getGlobalErrorHandler = _chunkTBSMAL5Yjs.getGlobalErrorHandler; exports.getIcon = _chunkTBSMAL5Yjs.getIcon; exports.getIconByModule = _chunkTBSMAL5Yjs.getIconByModule; exports.getIconByModuleName = _chunkTBSMAL5Yjs.getIconByModuleName; exports.getInitials = _chunkTBSMAL5Yjs.getInitials; exports.getLastApiMeta = _chunkTBSMAL5Yjs.getLastApiMeta; exports.getLastApiTotal = _chunkTBSMAL5Yjs.getLastApiTotal; exports.getLucideIcon = _chunkTBSMAL5Yjs.getLucideIcon; exports.getLucideIconByModule = _chunkTBSMAL5Yjs.getLucideIconByModule; exports.getLucideIconByModuleName = _chunkTBSMAL5Yjs.getLucideIconByModuleName; exports.getPublicApiUrl = _chunkODH2LYWCjs.getPublicApiUrl; exports.getReferralConfig = _chunkODH2LYWCjs.getReferralConfig; exports.getRoleId = _chunkODH2LYWCjs.getRoleId; exports.getStripePublishableKey = _chunkODH2LYWCjs.getStripePublishableKey; exports.getTableComponents = _chunkTBSMAL5Yjs.getTableComponents; exports.getTableOptions = _chunkTBSMAL5Yjs.getTableOptions; exports.getTokenHandler = _chunkTBSMAL5Yjs.getTokenHandler; exports.getTokenUsageCurrency = _chunkTBSMAL5Yjs.getTokenUsageCurrency; exports.getTrackablePages = _chunkODH2LYWCjs.getTrackablePages; exports.getValueFromPath = _chunkTBSMAL5Yjs.getValueFromPath; exports.getWaitlistConfig = _chunkODH2LYWCjs.getWaitlistConfig; exports.handbookPageContent = _chunkTBSMAL5Yjs.handbookPageContent; exports.handbookPageSummary = _chunkTBSMAL5Yjs.handbookPageSummary; exports.handbookPageTitle = _chunkTBSMAL5Yjs.handbookPageTitle; exports.handbookSectionSummary = _chunkTBSMAL5Yjs.handbookSectionSummary; exports.handbookSectionTitle = _chunkTBSMAL5Yjs.handbookSectionTitle; exports.hasBootstrapper = _chunkLU7DJ4QFjs.hasBootstrapper; exports.isReferralEnabled = _chunkODH2LYWCjs.isReferralEnabled; exports.isRemoteImageSrc = _chunkTBSMAL5Yjs.isRemoteImageSrc; exports.isRolesConfigured = _chunkODH2LYWCjs.isRolesConfigured; exports.rehydrate = _chunkTBSMAL5Yjs.rehydrate; exports.rehydrateList = _chunkTBSMAL5Yjs.rehydrateList; exports.resetBootstrapStore = _chunkLU7DJ4QFjs.resetBootstrapStore; exports.setBootstrapper = _chunkLU7DJ4QFjs.setBootstrapper; exports.setClientGlobalErrorHandler = _chunkTBSMAL5Yjs.setClientGlobalErrorHandler; exports.setGlobalErrorHandler = _chunkTBSMAL5Yjs.setGlobalErrorHandler; exports.showCustomToast = _chunkTBSMAL5Yjs.showCustomToast; exports.showError = _chunkTBSMAL5Yjs.showError; exports.showToast = _chunkTBSMAL5Yjs.showToast; exports.tokenUsageModules = _chunkTBSMAL5Yjs.tokenUsageModules; exports.translateData = _chunkLU7DJ4QFjs.translateData; exports.translateResponse = _chunkLU7DJ4QFjs.translateResponse; exports.tryBootstrap = _chunkLU7DJ4QFjs.tryBootstrap; exports.useComposedRefs = _chunkTBSMAL5Yjs.useComposedRefs; exports.useIsMobile = _chunkTBSMAL5Yjs.useIsMobile; exports.userObjectSchema = _chunkTBSMAL5Yjs.userObjectSchema; exports.validateCodiceFiscale = _chunkTBSMAL5Yjs.validateCodiceFiscale; exports.validateItalianTaxCode = _chunkTBSMAL5Yjs.validateItalianTaxCode; exports.validatePartitaIva = _chunkTBSMAL5Yjs.validatePartitaIva;
518
+ exports.ACTION_TYPES = _chunkSYQMVTICjs.ACTION_TYPES; exports.AVAILABLE_OAUTH_SCOPES = _chunkMWZCCOTSjs.AVAILABLE_OAUTH_SCOPES; exports.AbstractApiData = _chunkMWZCCOTSjs.AbstractApiData; exports.AbstractService = _chunkMWZCCOTSjs.AbstractService; exports.Action = _chunkMWZCCOTSjs.Action; exports.AiConnection = _chunkMWZCCOTSjs.AiConnection; exports.AiConnectionFields = _chunkMWZCCOTSjs.AiConnectionFields; exports.AiConnectionModule = _chunkMWZCCOTSjs.AiConnectionModule; exports.AiConnectionService = _chunkMWZCCOTSjs.AiConnectionService; exports.Assistant = _chunkMWZCCOTSjs.Assistant; exports.AssistantAction = _chunkMWZCCOTSjs.AssistantAction; exports.AssistantActionModule = _chunkMWZCCOTSjs.AssistantActionModule; exports.AssistantActionService = _chunkMWZCCOTSjs.AssistantActionService; exports.AssistantMessage = _chunkMWZCCOTSjs.AssistantMessage; exports.AssistantMessageModule = _chunkMWZCCOTSjs.AssistantMessageModule; exports.AssistantMessageService = _chunkMWZCCOTSjs.AssistantMessageService; exports.AssistantModule = _chunkMWZCCOTSjs.AssistantModule; exports.AssistantService = _chunkMWZCCOTSjs.AssistantService; exports.AuditLog = _chunkMWZCCOTSjs.AuditLog; exports.AuditLogModule = _chunkMWZCCOTSjs.AuditLogModule; exports.AuditLogService = _chunkMWZCCOTSjs.AuditLogService; exports.Auth = _chunkMWZCCOTSjs.Auth; exports.AuthComponent = _chunkMWZCCOTSjs.AuthComponent; exports.AuthModule = _chunkMWZCCOTSjs.AuthModule; exports.AuthService = _chunkMWZCCOTSjs.AuthService; exports.AuthorModule = _chunkMWZCCOTSjs.AuthorModule; exports.BackupCodeVerify = _chunkMWZCCOTSjs.BackupCodeVerify; exports.BackupCodeVerifyModule = _chunkMWZCCOTSjs.BackupCodeVerifyModule; exports.Billing = _chunkMWZCCOTSjs.Billing; exports.BillingModule = _chunkMWZCCOTSjs.BillingModule; exports.BillingService = _chunkMWZCCOTSjs.BillingService; exports.BlockNoteDiffUtil = _chunkMWZCCOTSjs.BlockNoteDiffUtil; exports.BlockNoteWordDiffRendererUtil = _chunkMWZCCOTSjs.BlockNoteWordDiffRendererUtil; exports.COMPANY_ADMINISTRATOR_ROLE_ID = _chunkSYQMVTICjs.COMPANY_ADMINISTRATOR_ROLE_ID; exports.CURRENT_USER_STORAGE_KEY = _chunkMWZCCOTSjs.CURRENT_USER_STORAGE_KEY; exports.Chunk = _chunkMWZCCOTSjs.Chunk; exports.ChunkModule = _chunkMWZCCOTSjs.ChunkModule; exports.ClientAbstractService = _chunkMWZCCOTSjs.ClientAbstractService; exports.ClientHttpMethod = _chunkMWZCCOTSjs.ClientHttpMethod; exports.Company = _chunkMWZCCOTSjs.Company; exports.CompanyFields = _chunkMWZCCOTSjs.CompanyFields; exports.CompanyModule = _chunkMWZCCOTSjs.CompanyModule; exports.CompanyService = _chunkMWZCCOTSjs.CompanyService; exports.Content = _chunkMWZCCOTSjs.Content; exports.ContentFields = _chunkMWZCCOTSjs.ContentFields; exports.ContentModule = _chunkMWZCCOTSjs.ContentModule; exports.ContentService = _chunkMWZCCOTSjs.ContentService; exports.DEFAULT_GRANT_TYPES = _chunkMWZCCOTSjs.DEFAULT_GRANT_TYPES; exports.DataClass = _chunkLU7DJ4QFjs.DataClassRegistry; exports.DataClassRegistry = _chunkLU7DJ4QFjs.DataClassRegistry; exports.ENV = _chunkLU7DJ4QFjs.ENV; exports.EndpointCreator = _chunkMWZCCOTSjs.EndpointCreator; exports.EntityAiStatus = _chunkMWZCCOTSjs.EntityAiStatus; exports.Feature = _chunkMWZCCOTSjs.Feature; exports.FeatureModule = _chunkMWZCCOTSjs.FeatureModule; exports.FeatureService = _chunkMWZCCOTSjs.FeatureService; exports.HandbookPage = _chunkMWZCCOTSjs.HandbookPage; exports.HandbookPageFields = _chunkMWZCCOTSjs.HandbookPageFields; exports.HandbookPageModule = _chunkMWZCCOTSjs.HandbookPageModule; exports.HandbookPageService = _chunkMWZCCOTSjs.HandbookPageService; exports.HandbookSection = _chunkMWZCCOTSjs.HandbookSection; exports.HandbookSectionModule = _chunkMWZCCOTSjs.HandbookSectionModule; exports.HandbookSectionService = _chunkMWZCCOTSjs.HandbookSectionService; exports.HandbookThread = _chunkMWZCCOTSjs.HandbookThread; exports.HandbookThreadMessage = _chunkMWZCCOTSjs.HandbookThreadMessage; exports.HandbookThreadMessageModule = _chunkMWZCCOTSjs.HandbookThreadMessageModule; exports.HandbookThreadMessageService = _chunkMWZCCOTSjs.HandbookThreadMessageService; exports.HandbookThreadModule = _chunkMWZCCOTSjs.HandbookThreadModule; exports.HandbookThreadService = _chunkMWZCCOTSjs.HandbookThreadService; exports.HowTo = _chunkMWZCCOTSjs.HowTo; exports.HowToFields = _chunkMWZCCOTSjs.HowToFields; exports.HowToModule = _chunkMWZCCOTSjs.HowToModule; exports.HowToService = _chunkMWZCCOTSjs.HowToService; exports.HttpMethod = _chunkMWZCCOTSjs.HttpMethod; exports.InvoiceStatus = _chunkMWZCCOTSjs.InvoiceStatus; exports.JsonApiDataFactory = _chunkLU7DJ4QFjs.JsonApiDataFactory; exports.MOBILE_BREAKPOINT = _chunkMWZCCOTSjs.MOBILE_BREAKPOINT; exports.Module = _chunkMWZCCOTSjs.Module; exports.ModuleModule = _chunkMWZCCOTSjs.ModuleModule; exports.ModulePaths = _chunkMWZCCOTSjs.ModulePaths; exports.ModulePathsModule = _chunkMWZCCOTSjs.ModulePathsModule; exports.ModuleRegistrar = _chunkMWZCCOTSjs.ModuleRegistrar; exports.ModuleRegistry = _chunkMWZCCOTSjs.ModuleRegistry; exports.Modules = _chunkMWZCCOTSjs.Modules; exports.Notification = _chunkMWZCCOTSjs.Notification; exports.NotificationFields = _chunkMWZCCOTSjs.NotificationFields; exports.NotificationModule = _chunkMWZCCOTSjs.NotificationModule; exports.NotificationService = _chunkMWZCCOTSjs.NotificationService; exports.OAUTH_SCOPE_DISPLAY = _chunkMWZCCOTSjs.OAUTH_SCOPE_DISPLAY; exports.OAuthClient = _chunkMWZCCOTSjs.OAuthClient; exports.OAuthModule = _chunkMWZCCOTSjs.OAuthModule; exports.OAuthService = _chunkMWZCCOTSjs.OAuthService; exports.Passkey = _chunkMWZCCOTSjs.Passkey; exports.PasskeyAuthenticationOptions = _chunkMWZCCOTSjs.PasskeyAuthenticationOptions; exports.PasskeyAuthenticationOptionsModule = _chunkMWZCCOTSjs.PasskeyAuthenticationOptionsModule; exports.PasskeyModule = _chunkMWZCCOTSjs.PasskeyModule; exports.PasskeyRegistrationOptions = _chunkMWZCCOTSjs.PasskeyRegistrationOptions; exports.PasskeyRegistrationOptionsModule = _chunkMWZCCOTSjs.PasskeyRegistrationOptionsModule; exports.PasskeyRegistrationVerify = _chunkMWZCCOTSjs.PasskeyRegistrationVerify; exports.PasskeyRegistrationVerifyModule = _chunkMWZCCOTSjs.PasskeyRegistrationVerifyModule; exports.PasskeyRename = _chunkMWZCCOTSjs.PasskeyRename; exports.PasskeyRenameModule = _chunkMWZCCOTSjs.PasskeyRenameModule; exports.PasskeyVerifyLogin = _chunkMWZCCOTSjs.PasskeyVerifyLogin; exports.PasskeyVerifyLoginModule = _chunkMWZCCOTSjs.PasskeyVerifyLoginModule; exports.PaymentMethod = _chunkMWZCCOTSjs.PaymentMethod; exports.PermissionMapping = _chunkMWZCCOTSjs.PermissionMapping; exports.PermissionMappingModule = _chunkMWZCCOTSjs.PermissionMappingModule; exports.Push = _chunkMWZCCOTSjs.Push; exports.PushModule = _chunkMWZCCOTSjs.PushModule; exports.PushService = _chunkMWZCCOTSjs.PushService; exports.RbacMatrixModel = _chunkMWZCCOTSjs.RbacMatrixModel; exports.RbacMatrixModule = _chunkMWZCCOTSjs.RbacMatrixModule; exports.RbacService = _chunkSYQMVTICjs.RbacService; exports.ReferralModule = _chunkMWZCCOTSjs.ReferralModule; exports.ReferralService = _chunkMWZCCOTSjs.ReferralService; exports.ReferralStats = _chunkMWZCCOTSjs.ReferralStats; exports.ReferralStatsModule = _chunkMWZCCOTSjs.ReferralStatsModule; exports.RehydrationFactory = _chunkMWZCCOTSjs.RehydrationFactory; exports.Role = _chunkMWZCCOTSjs.Role; exports.RoleFields = _chunkMWZCCOTSjs.RoleFields; exports.RoleModule = _chunkMWZCCOTSjs.RoleModule; exports.RoleService = _chunkMWZCCOTSjs.RoleService; exports.S3 = _chunkMWZCCOTSjs.S3; exports.S3Module = _chunkMWZCCOTSjs.S3Module; exports.S3Service = _chunkMWZCCOTSjs.S3Service; exports.StripeCustomer = _chunkMWZCCOTSjs.StripeCustomer; exports.StripeCustomerModule = _chunkMWZCCOTSjs.StripeCustomerModule; exports.StripeCustomerService = _chunkMWZCCOTSjs.StripeCustomerService; exports.StripeInvoice = _chunkMWZCCOTSjs.StripeInvoice; exports.StripeInvoiceModule = _chunkMWZCCOTSjs.StripeInvoiceModule; exports.StripeInvoiceService = _chunkMWZCCOTSjs.StripeInvoiceService; exports.StripePaymentMethodModule = _chunkMWZCCOTSjs.StripePaymentMethodModule; exports.StripePrice = _chunkMWZCCOTSjs.StripePrice; exports.StripePriceFields = _chunkMWZCCOTSjs.StripePriceFields; exports.StripePriceModule = _chunkMWZCCOTSjs.StripePriceModule; exports.StripePriceService = _chunkMWZCCOTSjs.StripePriceService; exports.StripeProduct = _chunkMWZCCOTSjs.StripeProduct; exports.StripeProductFields = _chunkMWZCCOTSjs.StripeProductFields; exports.StripeProductModule = _chunkMWZCCOTSjs.StripeProductModule; exports.StripeProductService = _chunkMWZCCOTSjs.StripeProductService; exports.StripePromotionCode = _chunkMWZCCOTSjs.StripePromotionCode; exports.StripePromotionCodeModule = _chunkMWZCCOTSjs.StripePromotionCodeModule; exports.StripePromotionCodeService = _chunkMWZCCOTSjs.StripePromotionCodeService; exports.StripeSubscription = _chunkMWZCCOTSjs.StripeSubscription; exports.StripeSubscriptionModule = _chunkMWZCCOTSjs.StripeSubscriptionModule; exports.StripeSubscriptionService = _chunkMWZCCOTSjs.StripeSubscriptionService; exports.StripeUsage = _chunkMWZCCOTSjs.StripeUsage; exports.StripeUsageModule = _chunkMWZCCOTSjs.StripeUsageModule; exports.StripeUsageService = _chunkMWZCCOTSjs.StripeUsageService; exports.SubscriptionStatus = _chunkMWZCCOTSjs.SubscriptionStatus; exports.TableOptions = _chunkMWZCCOTSjs.TableOptions; exports.TokenUsageAdminBreakdownModule = _chunkMWZCCOTSjs.TokenUsageAdminBreakdownModule; exports.TokenUsageAdminSummaryModule = _chunkMWZCCOTSjs.TokenUsageAdminSummaryModule; exports.TokenUsageAdminTimelineModule = _chunkMWZCCOTSjs.TokenUsageAdminTimelineModule; exports.TotpAuthenticator = _chunkMWZCCOTSjs.TotpAuthenticator; exports.TotpAuthenticatorModule = _chunkMWZCCOTSjs.TotpAuthenticatorModule; exports.TotpSetup = _chunkMWZCCOTSjs.TotpSetup; exports.TotpSetupModule = _chunkMWZCCOTSjs.TotpSetupModule; exports.TotpVerify = _chunkMWZCCOTSjs.TotpVerify; exports.TotpVerifyLogin = _chunkMWZCCOTSjs.TotpVerifyLogin; exports.TotpVerifyLoginModule = _chunkMWZCCOTSjs.TotpVerifyLoginModule; exports.TotpVerifyModule = _chunkMWZCCOTSjs.TotpVerifyModule; exports.TwoFactorChallenge = _chunkMWZCCOTSjs.TwoFactorChallenge; exports.TwoFactorChallengeModule = _chunkMWZCCOTSjs.TwoFactorChallengeModule; exports.TwoFactorEnable = _chunkMWZCCOTSjs.TwoFactorEnable; exports.TwoFactorEnableModule = _chunkMWZCCOTSjs.TwoFactorEnableModule; exports.TwoFactorService = _chunkMWZCCOTSjs.TwoFactorService; exports.TwoFactorStatus = _chunkMWZCCOTSjs.TwoFactorStatus; exports.TwoFactorStatusModule = _chunkMWZCCOTSjs.TwoFactorStatusModule; exports.User = _chunkMWZCCOTSjs.User; exports.UserFields = _chunkMWZCCOTSjs.UserFields; exports.UserModule = _chunkMWZCCOTSjs.UserModule; exports.UserService = _chunkMWZCCOTSjs.UserService; exports.VIEWPORT_COOKIE_NAME = _chunkMWZCCOTSjs.VIEWPORT_COOKIE_NAME; exports.Waitlist = _chunkMWZCCOTSjs.Waitlist; exports.WaitlistModule = _chunkMWZCCOTSjs.WaitlistModule; exports.WaitlistService = _chunkMWZCCOTSjs.WaitlistService; exports.WaitlistStats = _chunkMWZCCOTSjs.WaitlistStats; exports.WaitlistStatsModule = _chunkMWZCCOTSjs.WaitlistStatsModule; exports.checkPermissions = _chunkMWZCCOTSjs.checkPermissions; exports.checkPermissionsFromServer = _chunkMWZCCOTSjs.checkPermissionsFromServer; exports.clearLastApiMeta = _chunkMWZCCOTSjs.clearLastApiMeta; exports.clearLastApiTotal = _chunkMWZCCOTSjs.clearLastApiTotal; exports.cn = _chunkMWZCCOTSjs.cn; exports.composeRefs = _chunkMWZCCOTSjs.composeRefs; exports.configureAuth = _chunkMWZCCOTSjs.configureAuth; exports.configureI18n = _chunkSYQMVTICjs.configureI18n; exports.configureJsonApi = _chunkSYQMVTICjs.configureJsonApi; exports.configureLogin = _chunkSYQMVTICjs.configureLogin; exports.configureReferral = _chunkSYQMVTICjs.configureReferral; exports.configureRoles = _chunkSYQMVTICjs.configureRoles; exports.configureTokenUsage = _chunkMWZCCOTSjs.configureTokenUsage; exports.configureWaitlist = _chunkSYQMVTICjs.configureWaitlist; exports.createJsonApiInclusion = _chunkMWZCCOTSjs.createJsonApiInclusion; exports.dismissToast = _chunkMWZCCOTSjs.dismissToast; exports.entityObjectSchema = _chunkMWZCCOTSjs.entityObjectSchema; exports.exists = _chunkMWZCCOTSjs.exists; exports.formatCodiceFiscale = _chunkMWZCCOTSjs.formatCodiceFiscale; exports.formatDate = _chunkMWZCCOTSjs.formatDate; exports.formatLocalDate = _chunkMWZCCOTSjs.formatLocalDate; exports.formatPartitaIva = _chunkMWZCCOTSjs.formatPartitaIva; exports.getApiUrl = _chunkSYQMVTICjs.getApiUrl; exports.getAppUrl = _chunkSYQMVTICjs.getAppUrl; exports.getBootstrapper = _chunkLU7DJ4QFjs.getBootstrapper; exports.getClientGlobalErrorHandler = _chunkMWZCCOTSjs.getClientGlobalErrorHandler; exports.getGlobalErrorHandler = _chunkMWZCCOTSjs.getGlobalErrorHandler; exports.getIcon = _chunkMWZCCOTSjs.getIcon; exports.getIconByModule = _chunkMWZCCOTSjs.getIconByModule; exports.getIconByModuleName = _chunkMWZCCOTSjs.getIconByModuleName; exports.getInitials = _chunkMWZCCOTSjs.getInitials; exports.getLastApiMeta = _chunkMWZCCOTSjs.getLastApiMeta; exports.getLastApiTotal = _chunkMWZCCOTSjs.getLastApiTotal; exports.getLucideIcon = _chunkMWZCCOTSjs.getLucideIcon; exports.getLucideIconByModule = _chunkMWZCCOTSjs.getLucideIconByModule; exports.getLucideIconByModuleName = _chunkMWZCCOTSjs.getLucideIconByModuleName; exports.getPublicApiUrl = _chunkSYQMVTICjs.getPublicApiUrl; exports.getReferralConfig = _chunkSYQMVTICjs.getReferralConfig; exports.getRoleId = _chunkSYQMVTICjs.getRoleId; exports.getStripePublishableKey = _chunkSYQMVTICjs.getStripePublishableKey; exports.getTableComponents = _chunkMWZCCOTSjs.getTableComponents; exports.getTableOptions = _chunkMWZCCOTSjs.getTableOptions; exports.getTokenHandler = _chunkMWZCCOTSjs.getTokenHandler; exports.getTokenUsageCurrency = _chunkMWZCCOTSjs.getTokenUsageCurrency; exports.getTrackablePages = _chunkSYQMVTICjs.getTrackablePages; exports.getValueFromPath = _chunkMWZCCOTSjs.getValueFromPath; exports.getWaitlistConfig = _chunkSYQMVTICjs.getWaitlistConfig; exports.handbookPageContent = _chunkMWZCCOTSjs.handbookPageContent; exports.handbookPageSummary = _chunkMWZCCOTSjs.handbookPageSummary; exports.handbookPageTitle = _chunkMWZCCOTSjs.handbookPageTitle; exports.handbookSectionSummary = _chunkMWZCCOTSjs.handbookSectionSummary; exports.handbookSectionTitle = _chunkMWZCCOTSjs.handbookSectionTitle; exports.hasBootstrapper = _chunkLU7DJ4QFjs.hasBootstrapper; exports.isReferralEnabled = _chunkSYQMVTICjs.isReferralEnabled; exports.isRemoteImageSrc = _chunkMWZCCOTSjs.isRemoteImageSrc; exports.isRolesConfigured = _chunkSYQMVTICjs.isRolesConfigured; exports.rehydrate = _chunkMWZCCOTSjs.rehydrate; exports.rehydrateList = _chunkMWZCCOTSjs.rehydrateList; exports.resetBootstrapStore = _chunkLU7DJ4QFjs.resetBootstrapStore; exports.setBootstrapper = _chunkLU7DJ4QFjs.setBootstrapper; exports.setClientGlobalErrorHandler = _chunkMWZCCOTSjs.setClientGlobalErrorHandler; exports.setGlobalErrorHandler = _chunkMWZCCOTSjs.setGlobalErrorHandler; exports.showCustomToast = _chunkMWZCCOTSjs.showCustomToast; exports.showError = _chunkMWZCCOTSjs.showError; exports.showToast = _chunkMWZCCOTSjs.showToast; exports.tokenUsageModules = _chunkMWZCCOTSjs.tokenUsageModules; exports.translateData = _chunkLU7DJ4QFjs.translateData; exports.translateResponse = _chunkLU7DJ4QFjs.translateResponse; exports.tryBootstrap = _chunkLU7DJ4QFjs.tryBootstrap; exports.useComposedRefs = _chunkMWZCCOTSjs.useComposedRefs; exports.useIsMobile = _chunkMWZCCOTSjs.useIsMobile; exports.userObjectSchema = _chunkMWZCCOTSjs.userObjectSchema; exports.validateCodiceFiscale = _chunkMWZCCOTSjs.validateCodiceFiscale; exports.validateItalianTaxCode = _chunkMWZCCOTSjs.validateItalianTaxCode; exports.validatePartitaIva = _chunkMWZCCOTSjs.validatePartitaIva;
519
519
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  getWaitlistConfig,
19
19
  isReferralEnabled,
20
20
  isRolesConfigured
21
- } from "./chunk-IALPADOD.mjs";
21
+ } from "./chunk-U55JQ4NY.mjs";
22
22
  import {
23
23
  AVAILABLE_OAUTH_SCOPES,
24
24
  AbstractApiData,
@@ -244,7 +244,7 @@ import {
244
244
  validateCodiceFiscale,
245
245
  validateItalianTaxCode,
246
246
  validatePartitaIva
247
- } from "./chunk-YCFPSXLK.mjs";
247
+ } from "./chunk-CK47KSFV.mjs";
248
248
  import "./chunk-AUXK7QSA.mjs";
249
249
  import "./chunk-C7C7VY4F.mjs";
250
250
  import {
@@ -15,7 +15,7 @@ var _chunkIOLU4ASDjs = require('../chunk-IOLU4ASD.js');
15
15
 
16
16
 
17
17
 
18
- var _chunkTBSMAL5Yjs = require('../chunk-TBSMAL5Y.js');
18
+ var _chunkMWZCCOTSjs = require('../chunk-MWZCCOTS.js');
19
19
  require('../chunk-LXKSUWAV.js');
20
20
  require('../chunk-IBS6NI7D.js');
21
21
 
@@ -87,7 +87,7 @@ var ServerSession = class {
87
87
  if (!rawModules) return false;
88
88
  const modules = JSON.parse(_pako.ungzip.call(void 0, Buffer.from(rawModules, "base64"), { toText: true }));
89
89
  const selectedModule = modules.find((module) => module.id === params.module.moduleId);
90
- return _chunkTBSMAL5Yjs.checkPermissionsFromServer.call(void 0, {
90
+ return _chunkMWZCCOTSjs.checkPermissionsFromServer.call(void 0, {
91
91
  module: params.module,
92
92
  action: params.action,
93
93
  data: params.data,
@@ -297,5 +297,5 @@ _chunk7QVYU63Ejs.__name.call(void 0, ServerJsonApiDelete, "ServerJsonApiDelete")
297
297
 
298
298
 
299
299
 
300
- exports.ServerAuthService = _chunkTBSMAL5Yjs.AuthService; exports.ServerCompanyService = _chunkTBSMAL5Yjs.CompanyService; exports.ServerContentService = _chunkTBSMAL5Yjs.ContentService; exports.ServerFeatureService = _chunkTBSMAL5Yjs.FeatureService; exports.ServerJsonApiDelete = ServerJsonApiDelete; exports.ServerJsonApiGet = ServerJsonApiGet; exports.ServerJsonApiPatch = ServerJsonApiPatch; exports.ServerJsonApiPost = ServerJsonApiPost; exports.ServerJsonApiPut = ServerJsonApiPut; exports.ServerNotificationService = _chunkTBSMAL5Yjs.NotificationService; exports.ServerPushService = _chunkTBSMAL5Yjs.PushService; exports.ServerRoleService = _chunkTBSMAL5Yjs.RoleService; exports.ServerS3Service = _chunkTBSMAL5Yjs.S3Service; exports.ServerSession = ServerSession; exports.ServerUserService = _chunkTBSMAL5Yjs.UserService; exports.configureServerJsonApi = configureServerJsonApi; exports.getServerApiUrl = getServerApiUrl; exports.getServerAppUrl = getServerAppUrl; exports.getServerToken = _chunkYUO55Q5Ajs.getServerToken; exports.getServerTrackablePages = getServerTrackablePages; exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; exports.serverRequest = _chunkIOLU4ASDjs.serverRequest;
300
+ exports.ServerAuthService = _chunkMWZCCOTSjs.AuthService; exports.ServerCompanyService = _chunkMWZCCOTSjs.CompanyService; exports.ServerContentService = _chunkMWZCCOTSjs.ContentService; exports.ServerFeatureService = _chunkMWZCCOTSjs.FeatureService; exports.ServerJsonApiDelete = ServerJsonApiDelete; exports.ServerJsonApiGet = ServerJsonApiGet; exports.ServerJsonApiPatch = ServerJsonApiPatch; exports.ServerJsonApiPost = ServerJsonApiPost; exports.ServerJsonApiPut = ServerJsonApiPut; exports.ServerNotificationService = _chunkMWZCCOTSjs.NotificationService; exports.ServerPushService = _chunkMWZCCOTSjs.PushService; exports.ServerRoleService = _chunkMWZCCOTSjs.RoleService; exports.ServerS3Service = _chunkMWZCCOTSjs.S3Service; exports.ServerSession = ServerSession; exports.ServerUserService = _chunkMWZCCOTSjs.UserService; exports.configureServerJsonApi = configureServerJsonApi; exports.getServerApiUrl = getServerApiUrl; exports.getServerAppUrl = getServerAppUrl; exports.getServerToken = _chunkYUO55Q5Ajs.getServerToken; exports.getServerTrackablePages = getServerTrackablePages; exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; exports.serverRequest = _chunkIOLU4ASDjs.serverRequest;
301
301
  //# sourceMappingURL=index.js.map
@@ -15,7 +15,7 @@ import {
15
15
  S3Service,
16
16
  UserService,
17
17
  checkPermissionsFromServer
18
- } from "../chunk-YCFPSXLK.mjs";
18
+ } from "../chunk-CK47KSFV.mjs";
19
19
  import "../chunk-AUXK7QSA.mjs";
20
20
  import "../chunk-C7C7VY4F.mjs";
21
21
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nextjs-jsonapi",
3
- "version": "3.19.1",
3
+ "version": "3.20.0",
4
4
  "description": "Next.js JSON:API client with server/client support and caching",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",
@@ -1,14 +1,20 @@
1
1
  "use client";
2
2
 
3
- import { useTranslations } from "next-intl";
4
- import { Tab, TabsContainer } from "../../../../components";
3
+ import { useSearchParams } from "next/navigation";
4
+ import { useState } from "react";
5
+ import { RoundPageContainer } from "../../../../components/containers/RoundPageContainer";
5
6
  import { useNotificationContext } from "../../contexts/NotificationContext";
6
7
  import { NotificationErrorBoundary } from "../common";
8
+ import { NotificationViewMode, NotificationViewSwitcher } from "../filters/NotificationViewSwitcher";
7
9
  import { NotificationsList } from "../lists/NotificationsList";
10
+ import { Modules } from "../../../../core";
8
11
 
9
12
  function NotificationsListContainerContent() {
10
- const t = useTranslations();
11
- const { notifications: _notifications, isLoading: _isLoading, error } = useNotificationContext();
13
+ const searchParams = useSearchParams();
14
+ const { error } = useNotificationContext();
15
+
16
+ const tabParam = searchParams.get("tab");
17
+ const [mode, setMode] = useState<NotificationViewMode>(tabParam === "archived" ? "archived" : "inbox");
12
18
 
13
19
  if (error) {
14
20
  return (
@@ -21,24 +27,35 @@ function NotificationsListContainerContent() {
21
27
  );
22
28
  }
23
29
 
24
- const tabs: Tab[] = [
25
- {
26
- label: t(`notification.inbox`),
27
- content: <NotificationsList archived={false} />,
28
- },
29
- {
30
- label: t(`notification.archived`),
31
- content: <NotificationsList archived={true} />,
32
- },
33
- ];
30
+ /* `replaceState` rather than a router push: the tab is a view preference, so
31
+ it belongs in the URL for reload/share but must not add a history entry
32
+ per toggle. */
33
+ const handleModeChange = (next: NotificationViewMode) => {
34
+ setMode(next);
35
+ const url = new URL(window.location.href);
36
+ url.searchParams.set("tab", next);
37
+ window.history.replaceState(null, "", url.toString());
38
+ };
34
39
 
35
- return <TabsContainer tabs={tabs} />;
40
+ return (
41
+ <NotificationsList
42
+ key={mode}
43
+ archived={mode === "archived"}
44
+ fullWidth
45
+ headerControl={<NotificationViewSwitcher value={mode} onChange={handleModeChange} />}
46
+ />
47
+ );
36
48
  }
37
49
 
38
50
  export function NotificationsListContainer() {
39
51
  return (
40
- <NotificationErrorBoundary>
41
- <NotificationsListContainerContent />
42
- </NotificationErrorBoundary>
52
+ /* `fullWidth` without `forceHeader`: the page header is ContentListTable's
53
+ own title row, which is where the Inbox/Archived switcher lives. Adding
54
+ `forceHeader` would stack a second bar with the same title above it. */
55
+ <RoundPageContainer module={Modules.Notification} fullWidth>
56
+ <NotificationErrorBoundary>
57
+ <NotificationsListContainerContent />
58
+ </NotificationErrorBoundary>
59
+ </RoundPageContainer>
43
60
  );
44
61
  }
@@ -0,0 +1,48 @@
1
+ "use client";
2
+
3
+ import { useTranslations } from "next-intl";
4
+ import { cn } from "../../../../utils";
5
+
6
+ export type NotificationViewMode = "inbox" | "archived";
7
+
8
+ const MODES: { key: NotificationViewMode; labelKey: string }[] = [
9
+ { key: "inbox", labelKey: "notification.inbox" },
10
+ { key: "archived", labelKey: "notification.archived" },
11
+ ];
12
+
13
+ type NotificationViewSwitcherProps = {
14
+ value: NotificationViewMode;
15
+ onChange: (mode: NotificationViewMode) => void;
16
+ };
17
+
18
+ /**
19
+ * Inbox / Archived selector for the notifications list header.
20
+ *
21
+ * A segmented control rather than a `TabsList`: it sits inside
22
+ * `ContentListTable`'s title row, which is the page header on a `fullWidth`
23
+ * `RoundPageContainer`, and a full-height tab strip does not fit there.
24
+ */
25
+ export function NotificationViewSwitcher({ value, onChange }: NotificationViewSwitcherProps) {
26
+ const t = useTranslations();
27
+
28
+ return (
29
+ <div className="bg-muted inline-flex items-center rounded-md p-0.5">
30
+ {MODES.map((mode) => (
31
+ <button
32
+ key={mode.key}
33
+ type="button"
34
+ data-testid={`notification-view-${mode.key}`}
35
+ onClick={() => onChange(mode.key)}
36
+ className={cn(
37
+ "rounded-sm px-3 py-1 text-xs font-medium whitespace-nowrap transition-colors",
38
+ value === mode.key
39
+ ? "bg-background text-foreground shadow-sm"
40
+ : "text-muted-foreground hover:text-foreground",
41
+ )}
42
+ >
43
+ {t(mode.labelKey)}
44
+ </button>
45
+ ))}
46
+ </div>
47
+ );
48
+ }
@@ -0,0 +1 @@
1
+ export * from "./NotificationViewSwitcher";
@@ -1,5 +1,6 @@
1
1
  export * from "./common";
2
2
  export * from "./containers";
3
+ export * from "./filters";
3
4
  export * from "./lists";
4
5
  export * from "./modals";
5
6
  export * from "./notifications";
@@ -1,130 +1,85 @@
1
1
  "use client";
2
2
 
3
- import { ArchiveIcon } from "lucide-react";
4
3
  import { useTranslations } from "next-intl";
4
+ import { ReactNode, useEffect, useRef } from "react";
5
+ import { ContentListTable } from "../../../../components/tables/ContentListTable";
5
6
  import { Modules } from "../../../../core";
6
7
  import { DataListRetriever, useDataListRetriever, usePageUrlGenerator } from "../../../../hooks";
7
- import {
8
- Button,
9
- Card,
10
- CardContent,
11
- Link,
12
- Skeleton,
13
- Tooltip,
14
- TooltipContent,
15
- TooltipTrigger,
16
- } from "../../../../shadcnui";
17
- import { UserAvatar } from "../../../user/components";
8
+ import { useI18nRouter } from "../../../../i18n";
9
+ import { useNotificationContext } from "../../contexts/NotificationContext";
18
10
  import { NotificationInterface } from "../../data";
11
+ import { NotificationFields } from "../../data/notification.fields";
19
12
  import { NotificationService } from "../../data/notification.service";
13
+ import "../../hooks/useNotificationTableStructure";
20
14
  import { generateNotificationData } from "../notifications/Notification";
21
15
 
22
16
  type NotificationsListProps = {
23
17
  archived: boolean;
18
+ headerControl?: ReactNode;
19
+ fullWidth?: boolean;
24
20
  };
25
21
 
26
- export function NotificationsList({ archived }: NotificationsListProps) {
22
+ export function NotificationsList({ archived, headerControl, fullWidth }: NotificationsListProps) {
27
23
  const t = useTranslations();
24
+ const router = useI18nRouter();
28
25
  const generateUrl = usePageUrlGenerator();
26
+ const { markNotificationsAsRead } = useNotificationContext();
29
27
 
30
28
  const data: DataListRetriever<NotificationInterface> = useDataListRetriever({
29
+ module: Modules.Notification,
31
30
  retriever: (params) => NotificationService.findMany(params),
32
31
  retrieverParams: { isArchived: archived },
33
- module: Modules.Notification,
34
32
  });
35
33
 
36
- const archiveNotification = async (notification: NotificationInterface) => {
37
- await NotificationService.archive({ id: notification.id });
38
- data.removeElement(notification);
39
- };
34
+ /* Mark read what this list ACTUALLY SHOWS, on every page. Reading the shared
35
+ context's list instead would only ever cover the bell's first page, so
36
+ anything reached by paging forward would stay unread permanently.
40
37
 
41
- const LoadingSkeleton = () => (
42
- <div className="space-y-4">
43
- {Array.from({ length: 3 }).map((_, i) => (
44
- <Card key={i}>
45
- <CardContent className="p-2">
46
- <div className="flex w-full flex-row items-center">
47
- <Skeleton className="me-4 h-8 w-8 rounded-full" />
48
- <div className="flex-1 space-y-2">
49
- <Skeleton className="h-4 w-3/4" />
50
- <Skeleton className="h-3 w-1/2" />
51
- </div>
52
- <Skeleton className="h-8 w-20" />
53
- </div>
54
- </CardContent>
55
- </Card>
56
- ))}
57
- </div>
58
- );
38
+ `markedRef` guards the loop: `markNotificationsAsRead` refreshes the shared
39
+ context, which re-renders this component, and `data.data` is not
40
+ guaranteed to be reference-stable across renders. Tracking the ids already
41
+ sent means a second pass finds nothing to do regardless of identity. */
42
+ const markedRef = useRef<Set<string>>(new Set<string>());
59
43
 
60
- return (
61
- <div className="space-y-4">
62
- {data.isLoaded ? (
63
- (data.data as NotificationInterface[])?.map((notification: NotificationInterface) => {
64
- const notificationData = generateNotificationData({ notification: notification, generateUrl: generateUrl });
44
+ useEffect(() => {
45
+ if (!data.isLoaded || !data.data) return;
46
+
47
+ const unreadIds = data.data
48
+ .filter((notification) => !notification.isRead && !markedRef.current.has(notification.id))
49
+ .map((notification) => notification.id);
65
50
 
66
- return (
67
- <Card key={notification.id}>
68
- <CardContent className="p-0">
69
- <div className={`flex w-full flex-row items-center p-2`}>
70
- {notificationData.actor ? (
71
- <div className="flex w-12 max-w-12 px-2">
72
- <Link href={generateUrl({ page: Modules.User, id: notificationData.actor.id })}>
73
- <UserAvatar user={notificationData.actor} className="h-8 w-8" />
74
- </Link>
75
- </div>
76
- ) : (
77
- <div className="flex w-14 max-w-14 px-2"></div>
78
- )}
79
- <div className="flex w-full flex-col">
80
- <p className="text-sm">
81
- {t.rich(`notification.${notification.notificationType}.description` as any, {
82
- strong: (chunks: any) => <strong>{chunks}</strong>,
83
- actor: notificationData.actor?.name ?? "",
84
- title: notificationData.title,
85
- })}
86
- </p>
87
- <div className="text-muted-foreground mt-1 w-full text-xs">
88
- {new Date(notification.createdAt).toLocaleString()}
89
- </div>
90
- </div>
91
- <div className="flex flex-row items-center">
92
- {notificationData.url ? (
93
- <Link href={notificationData.url}>
94
- <Button variant={`outline`} size={`sm`} onClick={(e) => e.stopPropagation()}>
95
- {t(`notification.${notification.notificationType}.buttons.action` as any)}
96
- </Button>
97
- </Link>
98
- ) : (
99
- <></>
100
- )}
101
- {!archived && (
102
- <Tooltip>
103
- <TooltipTrigger>
104
- <Button
105
- variant={`link`}
106
- onClick={(e) => {
107
- e.preventDefault();
108
- e.stopPropagation();
109
- archiveNotification(notification);
110
- }}
111
- className="text-muted-foreground hover:text-destructive ms-2"
112
- >
113
- <ArchiveIcon className="h-4 w-4 cursor-pointer" />
114
- </Button>
115
- </TooltipTrigger>
116
- <TooltipContent>{t(`notification.buttons.archive`)}</TooltipContent>
117
- </Tooltip>
118
- )}
119
- </div>
120
- </div>
121
- </CardContent>
122
- </Card>
123
- );
124
- })
125
- ) : (
126
- <LoadingSkeleton />
127
- )}
128
- </div>
51
+ if (unreadIds.length === 0) return;
52
+
53
+ unreadIds.forEach((id) => markedRef.current.add(id));
54
+ markNotificationsAsRead(unreadIds);
55
+ }, [data.isLoaded, data.data, markNotificationsAsRead]);
56
+
57
+ /* The whole row is the click target, matching the popover row — which is a
58
+ `Link` wrapping its entire body. */
59
+ const openNotification = (notification: NotificationInterface) => {
60
+ const url = generateNotificationData({ notification: notification, generateUrl: generateUrl }).url;
61
+ if (url) router.push(url);
62
+ };
63
+
64
+ return (
65
+ <ContentListTable
66
+ data={data}
67
+ fields={[
68
+ NotificationFields.icon,
69
+ NotificationFields.description,
70
+ NotificationFields.createdAt,
71
+ NotificationFields.actions,
72
+ ]}
73
+ tableGeneratorType={Modules.Notification}
74
+ title={t(`entities.notifications`, { count: 2 })}
75
+ filters={headerControl}
76
+ /* The notifications endpoint takes no search term, so rendering the box
77
+ would give the page a control that silently does nothing. */
78
+ allowSearch={false}
79
+ context={{ archived: archived }}
80
+ onRowClick={openNotification}
81
+ emptyState={t(`notification.empty`)}
82
+ fullWidth={fullWidth}
83
+ />
129
84
  );
130
85
  }
@@ -1,19 +1,23 @@
1
- import { BellIcon } from "lucide-react";
1
+ import { BellIcon, ExternalLinkIcon } from "lucide-react";
2
2
  import { useTranslations } from "next-intl";
3
3
  import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from "react";
4
4
  import { showToast } from "../../../../utils/toast";
5
+ import { cn } from "../../../../utils";
5
6
  import { useSocketContext } from "../../../../contexts";
7
+ import { Modules } from "../../../../core";
6
8
  import { usePageUrlGenerator } from "../../../../hooks";
7
9
  import {
8
- Card,
9
- CardHeader,
10
- CardTitle,
10
+ Link,
11
11
  Popover,
12
12
  PopoverContent,
13
+ PopoverHeader,
14
+ PopoverTitle,
13
15
  PopoverTrigger,
14
16
  ScrollArea,
15
- Separator,
16
17
  SidebarMenuButton,
18
+ Tooltip,
19
+ TooltipContent,
20
+ TooltipTrigger,
17
21
  } from "../../../../shadcnui";
18
22
  import { useNotificationContext } from "../../contexts/NotificationContext";
19
23
  import { NotificationInterface } from "../../data";
@@ -184,32 +188,98 @@ function NotificationModalContent({ isOpen, setIsOpen }: NotificationModalProps)
184
188
 
185
189
  return (
186
190
  <Popover open={isOpen} onOpenChange={handleOpenChange} data-testid={`sidebar-notification button`}>
187
- <PopoverTrigger>
188
- <SidebarMenuButton render={<div />} className="text-muted-foreground h-6" disabled={isLoading}>
191
+ {/* The badge overhangs the bell's top-end corner, so nothing between it
192
+ and the sidebar may clip: `overflow-visible` beats the button
193
+ variant's own `overflow-hidden`, and the label is wrapped in its own
194
+ span so the variant's `[&>span:last-child]:truncate` (which sets
195
+ overflow:hidden) lands on the label rather than on the icon slot. */}
196
+ <PopoverTrigger
197
+ render={<SidebarMenuButton className="text-muted-foreground h-6 overflow-visible" disabled={isLoading} />}
198
+ >
199
+ <span className="relative flex shrink-0 items-center justify-center overflow-visible">
189
200
  <BellIcon
190
- className={`h-5 w-5 cursor-pointer ${unreadNotifications ? "text-destructive" : ""} ${isLoading ? "animate-pulse" : ""}`}
201
+ className={cn(
202
+ "h-5 w-5 cursor-pointer",
203
+ // Filled, not just tinted: an outline bell in the danger colour
204
+ // is easy to miss at this size, a solid one is not.
205
+ unreadNotifications && "fill-destructive text-destructive",
206
+ isLoading && "animate-pulse",
207
+ )}
191
208
  />
192
- {t(`entities.notifications`, { count: 2 })}
193
- </SidebarMenuButton>
209
+ {unreadNotifications && (
210
+ // Fixed px, not rem: the app's root font size is 14px, so a
211
+ // rem-sized badge renders a quarter smaller than the scale implies
212
+ // and the count stops being readable. The ring separates the dot
213
+ // from the bell it sits on.
214
+ <span
215
+ data-testid="sidebar-notification-unread-dot"
216
+ className="bg-destructive ring-sidebar pointer-events-none absolute -top-[3px] -end-[4px] size-[9px] rounded-full ring-2 group-data-[collapsible=icon]:block md:hidden"
217
+ />
218
+ )}
219
+ </span>
220
+ <span className="truncate">{t(`entities.notifications`, { count: 2 })}</span>
221
+ {unreadNotifications && (
222
+ <span
223
+ data-testid="sidebar-notification-unread-count"
224
+ className="bg-destructive text-destructive-foreground pointer-events-none ms-auto flex h-[18px] min-w-[18px] shrink-0 items-center justify-center rounded-full px-[5px] text-[11px] leading-none font-semibold tabular-nums group-data-[collapsible=icon]:hidden"
225
+ >
226
+ {unreadCount > 99 ? "99+" : unreadCount}
227
+ </span>
228
+ )}
194
229
  </PopoverTrigger>
195
- <PopoverContent className="relative start-10 w-80 border-0 p-0 shadow-none">
196
- <Card>
197
- <CardHeader className="p-4">
198
- <CardTitle>{t(`entities.notifications`, { count: 2 })}</CardTitle>
199
- {isLoading && <div className="text-muted-foreground text-xs">Loading...</div>}
200
- {error && <div className="text-destructive text-xs/relaxed">Error: {error}</div>}
201
- </CardHeader>
202
- <Separator />
203
- <ScrollArea className="h-96">
204
- {notifications.length > 0 ? (
205
- notifications.map((notification: NotificationInterface) => (
230
+ {/* The popup IS the surface — a Card inside it stacked two paddings
231
+ (Card py-4 + CardHeader p-4) around a 20px title, which is why the
232
+ header was so tall. Widths are in a 14px rem here, so the previous
233
+ w-80 measured 280px on screen, not 320; 30rem = 420px. */}
234
+ <PopoverContent className="relative start-10 w-[30rem] gap-0 overflow-hidden p-0">
235
+ <PopoverHeader className="flex flex-row items-center justify-between gap-2 border-b px-3 py-2">
236
+ {/* Typography role 4 (section header) rather than role 5 (panel
237
+ title): the popover reads as a mini-page, not a card slot. */}
238
+ <PopoverTitle className="text-lg font-semibold">{t(`entities.notifications`, { count: 2 })}</PopoverTitle>
239
+ <Tooltip>
240
+ <TooltipTrigger
241
+ render={
242
+ <Link
243
+ href={generateUrl({ page: Modules.Notification })}
244
+ onClick={() => setIsOpen(false)}
245
+ className="text-muted-foreground hover:text-foreground transition-colors"
246
+ />
247
+ }
248
+ >
249
+ <ExternalLinkIcon className="size-4" />
250
+ </TooltipTrigger>
251
+ <TooltipContent>{t(`notification.all`)}</TooltipContent>
252
+ </Tooltip>
253
+ </PopoverHeader>
254
+ {isLoading && <div className="text-muted-foreground px-3 py-2 text-xs">{t(`common.loading`)}</div>}
255
+ {error && <div className="text-destructive px-3 py-2 text-xs">{error}</div>}
256
+ {/* The cap goes on the scroll viewport, not on the ScrollArea root: the
257
+ viewport carries Base UI's inline overflow and h-full, so a height
258
+ on the root leaves it stretching to its content instead of
259
+ scrolling.
260
+ It is measured against --available-height (set by the positioner,
261
+ after any flip) minus the header, the same way the package combobox
262
+ sizes its list. A fixed cap lets the popup outgrow the room below
263
+ the trigger, and floating-ui's shift() then clamps it into the
264
+ viewport — which is why it landed in the same spot wherever the
265
+ trigger sat, and never scrolled. */}
266
+ {/* The ScrollBar styles itself with data-vertical:w-2.5, but Base UI
267
+ emits data-orientation="vertical" — no data-vertical attribute
268
+ exists, so the track renders 2px wide with a 0px-wide thumb: an
269
+ invisible scrollbar. Forced here by data-slot until the primitive is
270
+ fixed. The thumb's bg-border is also invisible against the popup,
271
+ hence the explicit colour. */}
272
+ <ScrollArea className="[&_[data-slot=scroll-area-scrollbar]]:w-2.5 [&_[data-slot=scroll-area-thumb]]:bg-muted-foreground/40 [&>[data-slot=scroll-area-viewport]]:max-h-[min(32rem,calc(var(--available-height,32rem)-3.5rem))]">
273
+ {notifications.length > 0 ? (
274
+ <div className="divide-border divide-y">
275
+ {notifications.map((notification: NotificationInterface) => (
206
276
  <Fragment key={notification.id}>{generateNotification(notification, () => setIsOpen(false))}</Fragment>
207
- ))
208
- ) : (
209
- <div className="text-muted-foreground p-4 text-center text-sm">{t(`notification.empty`)}</div>
210
- )}
211
- </ScrollArea>
212
- </Card>
277
+ ))}
278
+ </div>
279
+ ) : (
280
+ <div className="text-muted-foreground p-6 text-center text-sm">{t(`notification.empty`)}</div>
281
+ )}
282
+ </ScrollArea>
213
283
  </PopoverContent>
214
284
  </Popover>
215
285
  );