@burdenoff/microfe-admin 2026.511.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -0
- package/dist/admin/AdminRoot.d.ts +31 -0
- package/dist/admin/AdminRoot.d.ts.map +1 -0
- package/dist/admin/AdminRoot.js +175 -0
- package/dist/admin/AdminRoot.js.map +1 -0
- package/dist/admin/AdminRoutes.d.ts +29 -0
- package/dist/admin/AdminRoutes.d.ts.map +1 -0
- package/dist/admin/AdminRoutes.js +143 -0
- package/dist/admin/AdminRoutes.js.map +1 -0
- package/dist/admin/components/AccessDenied.d.ts +8 -0
- package/dist/admin/components/AccessDenied.d.ts.map +1 -0
- package/dist/admin/components/AccessDenied.js +28 -0
- package/dist/admin/components/AccessDenied.js.map +1 -0
- package/dist/admin/components/ActivityFeed.d.ts +20 -0
- package/dist/admin/components/ActivityFeed.d.ts.map +1 -0
- package/dist/admin/components/ActivityFeed.js +91 -0
- package/dist/admin/components/ActivityFeed.js.map +1 -0
- package/dist/admin/components/Charts.d.ts +33 -0
- package/dist/admin/components/Charts.d.ts.map +1 -0
- package/dist/admin/components/Charts.js +37 -0
- package/dist/admin/components/Charts.js.map +1 -0
- package/dist/admin/components/ConfirmDialog.d.ts +45 -0
- package/dist/admin/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/admin/components/ConfirmDialog.js +4 -0
- package/dist/admin/components/DataTable.d.ts +64 -0
- package/dist/admin/components/DataTable.d.ts.map +1 -0
- package/dist/admin/components/DataTable.js +127 -0
- package/dist/admin/components/DataTable.js.map +1 -0
- package/dist/admin/components/FormSheet.d.ts +79 -0
- package/dist/admin/components/FormSheet.d.ts.map +1 -0
- package/dist/admin/components/FormSheet.js +111 -0
- package/dist/admin/components/FormSheet.js.map +1 -0
- package/dist/admin/components/MetricCard.d.ts +40 -0
- package/dist/admin/components/MetricCard.d.ts.map +1 -0
- package/dist/admin/components/MetricCard.js +57 -0
- package/dist/admin/components/MetricCard.js.map +1 -0
- package/dist/admin/components/PageLayout.d.ts +34 -0
- package/dist/admin/components/PageLayout.d.ts.map +1 -0
- package/dist/admin/components/PageLayout.js +31 -0
- package/dist/admin/components/PageLayout.js.map +1 -0
- package/dist/admin/components/PermissionGuard.d.ts +12 -0
- package/dist/admin/components/PermissionGuard.d.ts.map +1 -0
- package/dist/admin/components/PermissionGuard.js +18 -0
- package/dist/admin/components/PermissionGuard.js.map +1 -0
- package/dist/admin/components/RowActions.d.ts +41 -0
- package/dist/admin/components/RowActions.d.ts.map +1 -0
- package/dist/admin/components/RowActions.js +93 -0
- package/dist/admin/components/RowActions.js.map +1 -0
- package/dist/admin/components/StatusBadge.d.ts +35 -0
- package/dist/admin/components/StatusBadge.d.ts.map +1 -0
- package/dist/admin/components/StatusBadge.js +41 -0
- package/dist/admin/components/StatusBadge.js.map +1 -0
- package/dist/admin/components/Toast.d.ts +26 -0
- package/dist/admin/components/Toast.d.ts.map +1 -0
- package/dist/admin/components/Toast.js +133 -0
- package/dist/admin/components/Toast.js.map +1 -0
- package/dist/admin/components/forms/SubscriptionForm.d.ts +57 -0
- package/dist/admin/components/forms/SubscriptionForm.d.ts.map +1 -0
- package/dist/admin/components/forms/SubscriptionForm.js +299 -0
- package/dist/admin/components/forms/SubscriptionForm.js.map +1 -0
- package/dist/admin/components/forms/TenantForm.d.ts +68 -0
- package/dist/admin/components/forms/TenantForm.d.ts.map +1 -0
- package/dist/admin/components/forms/TenantForm.js +346 -0
- package/dist/admin/components/forms/TenantForm.js.map +1 -0
- package/dist/admin/components/forms/TicketForm.d.ts +67 -0
- package/dist/admin/components/forms/TicketForm.d.ts.map +1 -0
- package/dist/admin/components/forms/TicketForm.js +55 -0
- package/dist/admin/components/forms/TicketForm.js.map +1 -0
- package/dist/admin/components/forms/UserForm.d.ts +57 -0
- package/dist/admin/components/forms/UserForm.d.ts.map +1 -0
- package/dist/admin/components/forms/UserForm.js +253 -0
- package/dist/admin/components/forms/UserForm.js.map +1 -0
- package/dist/admin/components/forms/index.d.ts +5 -0
- package/dist/admin/components/forms/index.d.ts.map +1 -0
- package/dist/admin/components/forms/index.js +4 -0
- package/dist/admin/components/index.d.ts +15 -0
- package/dist/admin/components/index.d.ts.map +1 -0
- package/dist/admin/components/index.js +17 -0
- package/dist/admin/components/ui.d.ts +52 -0
- package/dist/admin/components/ui.d.ts.map +1 -0
- package/dist/admin/components/ui.js +140 -0
- package/dist/admin/components/ui.js.map +1 -0
- package/dist/admin/constants/index.d.ts +75 -0
- package/dist/admin/constants/index.d.ts.map +1 -0
- package/dist/admin/constants/index.js +90 -0
- package/dist/admin/constants/index.js.map +1 -0
- package/dist/admin/constants/permissions.d.ts +27 -0
- package/dist/admin/constants/permissions.d.ts.map +1 -0
- package/dist/admin/constants/permissions.js +23 -0
- package/dist/admin/constants/permissions.js.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts +30 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.js +56 -0
- package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
- package/dist/admin/index.d.ts +31 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +9 -0
- package/dist/admin/pages/AuditLogsPage.d.ts +5 -0
- package/dist/admin/pages/AuditLogsPage.d.ts.map +1 -0
- package/dist/admin/pages/AuditLogsPage.js +209 -0
- package/dist/admin/pages/AuditLogsPage.js.map +1 -0
- package/dist/admin/pages/BillingPage.d.ts +2 -0
- package/dist/admin/pages/BillingPage.d.ts.map +1 -0
- package/dist/admin/pages/BillingPage.js +164 -0
- package/dist/admin/pages/BillingPage.js.map +1 -0
- package/dist/admin/pages/CommunicationsPage.d.ts +2 -0
- package/dist/admin/pages/CommunicationsPage.d.ts.map +1 -0
- package/dist/admin/pages/CommunicationsPage.js +118 -0
- package/dist/admin/pages/CommunicationsPage.js.map +1 -0
- package/dist/admin/pages/DashboardPage.d.ts +5 -0
- package/dist/admin/pages/DashboardPage.d.ts.map +1 -0
- package/dist/admin/pages/DashboardPage.js +121 -0
- package/dist/admin/pages/DashboardPage.js.map +1 -0
- package/dist/admin/pages/FeatureFlagsPage.d.ts +2 -0
- package/dist/admin/pages/FeatureFlagsPage.d.ts.map +1 -0
- package/dist/admin/pages/FeatureFlagsPage.js +116 -0
- package/dist/admin/pages/FeatureFlagsPage.js.map +1 -0
- package/dist/admin/pages/OrganizationsListPage.d.ts +2 -0
- package/dist/admin/pages/OrganizationsListPage.d.ts.map +1 -0
- package/dist/admin/pages/OrganizationsListPage.js +112 -0
- package/dist/admin/pages/OrganizationsListPage.js.map +1 -0
- package/dist/admin/pages/ProductsPage.d.ts +5 -0
- package/dist/admin/pages/ProductsPage.d.ts.map +1 -0
- package/dist/admin/pages/ProductsPage.js +392 -0
- package/dist/admin/pages/ProductsPage.js.map +1 -0
- package/dist/admin/pages/ReferralsPage.d.ts +2 -0
- package/dist/admin/pages/ReferralsPage.d.ts.map +1 -0
- package/dist/admin/pages/ReferralsPage.js +272 -0
- package/dist/admin/pages/ReferralsPage.js.map +1 -0
- package/dist/admin/pages/RolesPermissionsPage.d.ts +2 -0
- package/dist/admin/pages/RolesPermissionsPage.d.ts.map +1 -0
- package/dist/admin/pages/RolesPermissionsPage.js +145 -0
- package/dist/admin/pages/RolesPermissionsPage.js.map +1 -0
- package/dist/admin/pages/SREPage.d.ts +5 -0
- package/dist/admin/pages/SREPage.d.ts.map +1 -0
- package/dist/admin/pages/SREPage.js +405 -0
- package/dist/admin/pages/SREPage.js.map +1 -0
- package/dist/admin/pages/SandboxSettingsPage.d.ts +7 -0
- package/dist/admin/pages/SandboxSettingsPage.d.ts.map +1 -0
- package/dist/admin/pages/SandboxSettingsPage.js +497 -0
- package/dist/admin/pages/SandboxSettingsPage.js.map +1 -0
- package/dist/admin/pages/SettingsPage.d.ts +5 -0
- package/dist/admin/pages/SettingsPage.d.ts.map +1 -0
- package/dist/admin/pages/SettingsPage.js +279 -0
- package/dist/admin/pages/SettingsPage.js.map +1 -0
- package/dist/admin/pages/TenantDetailPage.d.ts +5 -0
- package/dist/admin/pages/TenantDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/TenantDetailPage.js +274 -0
- package/dist/admin/pages/TenantDetailPage.js.map +1 -0
- package/dist/admin/pages/TenantFormRoutePage.d.ts +6 -0
- package/dist/admin/pages/TenantFormRoutePage.d.ts.map +1 -0
- package/dist/admin/pages/TenantFormRoutePage.js +136 -0
- package/dist/admin/pages/TenantFormRoutePage.js.map +1 -0
- package/dist/admin/pages/TenantsListPage.d.ts +5 -0
- package/dist/admin/pages/TenantsListPage.d.ts.map +1 -0
- package/dist/admin/pages/TenantsListPage.js +339 -0
- package/dist/admin/pages/TenantsListPage.js.map +1 -0
- package/dist/admin/pages/UsersListPage.d.ts +5 -0
- package/dist/admin/pages/UsersListPage.d.ts.map +1 -0
- package/dist/admin/pages/UsersListPage.js +250 -0
- package/dist/admin/pages/UsersListPage.js.map +1 -0
- package/dist/admin/pages/WaitlistPage.d.ts +2 -0
- package/dist/admin/pages/WaitlistPage.d.ts.map +1 -0
- package/dist/admin/pages/WaitlistPage.js +241 -0
- package/dist/admin/pages/WaitlistPage.js.map +1 -0
- package/dist/admin/pages/WorkflowsPage.d.ts +2 -0
- package/dist/admin/pages/WorkflowsPage.d.ts.map +1 -0
- package/dist/admin/pages/WorkflowsPage.js +126 -0
- package/dist/admin/pages/WorkflowsPage.js.map +1 -0
- package/dist/admin/pages/WorkspacesListPage.d.ts +2 -0
- package/dist/admin/pages/WorkspacesListPage.d.ts.map +1 -0
- package/dist/admin/pages/WorkspacesListPage.js +100 -0
- package/dist/admin/pages/WorkspacesListPage.js.map +1 -0
- package/dist/admin/pages/index.d.ts +20 -0
- package/dist/admin/pages/index.d.ts.map +1 -0
- package/dist/admin/pages/index.js +19 -0
- package/dist/admin/providers/AdminProvider.d.ts +13 -0
- package/dist/admin/providers/AdminProvider.d.ts.map +1 -0
- package/dist/admin/providers/AdminProvider.js +43 -0
- package/dist/admin/providers/AdminProvider.js.map +1 -0
- package/dist/admin/schemas/index.d.ts +409 -0
- package/dist/admin/schemas/index.d.ts.map +1 -0
- package/dist/admin/schemas/index.js +111 -0
- package/dist/admin/schemas/index.js.map +1 -0
- package/dist/admin/store/adminStore.d.ts +28 -0
- package/dist/admin/store/adminStore.d.ts.map +1 -0
- package/dist/admin/store/adminStore.js +48 -0
- package/dist/admin/store/adminStore.js.map +1 -0
- package/dist/admin/types/index.d.ts +325 -0
- package/dist/admin/types/index.d.ts.map +1 -0
- package/dist/admin/utils/cn.d.ts +7 -0
- package/dist/admin/utils/cn.d.ts.map +1 -0
- package/dist/admin/utils/cn.js +10 -0
- package/dist/admin/utils/cn.js.map +1 -0
- package/dist/admin/utils/directActivityGraphql.d.ts +11 -0
- package/dist/admin/utils/directActivityGraphql.d.ts.map +1 -0
- package/dist/admin/utils/directActivityGraphql.js +25 -0
- package/dist/admin/utils/directActivityGraphql.js.map +1 -0
- package/dist/admin/utils/formatters.d.ts +33 -0
- package/dist/admin/utils/formatters.d.ts.map +1 -0
- package/dist/admin/utils/formatters.js +54 -0
- package/dist/admin/utils/formatters.js.map +1 -0
- package/dist/admin/utils/gatewayGraphql.d.ts +9 -0
- package/dist/admin/utils/gatewayGraphql.d.ts.map +1 -0
- package/dist/admin/utils/i18n.d.ts +6 -0
- package/dist/admin/utils/i18n.d.ts.map +1 -0
- package/dist/admin/utils/i18n.js +15 -0
- package/dist/admin/utils/i18n.js.map +1 -0
- package/dist/admin/utils/mappers.d.ts +15 -0
- package/dist/admin/utils/mappers.d.ts.map +1 -0
- package/dist/admin/utils/mappers.js +73 -0
- package/dist/admin/utils/mappers.js.map +1 -0
- package/dist/admin/utils/navigation.d.ts +9 -0
- package/dist/admin/utils/navigation.d.ts.map +1 -0
- package/dist/admin/utils/navigation.js +8 -0
- package/dist/admin/utils/navigation.js.map +1 -0
- package/dist/admin/utils/tenantEvents.d.ts +11 -0
- package/dist/admin/utils/tenantEvents.d.ts.map +1 -0
- package/dist/admin/utils/tenantEvents.js +8 -0
- package/dist/admin/utils/tenantEvents.js.map +1 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2749 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +907 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20773 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/global-types.js +12 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +132 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +65 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +53363 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js +34 -0
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js.map +1 -0
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js +118 -0
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js.map +1 -0
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/addLeadingZeros.js +8 -0
- package/dist/node_modules/date-fns/_lib/addLeadingZeros.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/defaultOptions.js +9 -0
- package/dist/node_modules/date-fns/_lib/defaultOptions.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/formatters.js +384 -0
- package/dist/node_modules/date-fns/_lib/format/formatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/lightFormatters.js +45 -0
- package/dist/node_modules/date-fns/_lib/format/lightFormatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/format/longFormatters.js +42 -0
- package/dist/node_modules/date-fns/_lib/format/longFormatters.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/getRoundingMethod.js +11 -0
- package/dist/node_modules/date-fns/_lib/getRoundingMethod.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js +10 -0
- package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/normalizeDates.js +10 -0
- package/dist/node_modules/date-fns/_lib/normalizeDates.js.map +1 -0
- package/dist/node_modules/date-fns/_lib/protectedTokens.js +25 -0
- package/dist/node_modules/date-fns/_lib/protectedTokens.js.map +1 -0
- package/dist/node_modules/date-fns/compareAsc.js +10 -0
- package/dist/node_modules/date-fns/compareAsc.js.map +1 -0
- package/dist/node_modules/date-fns/constants.js +8 -0
- package/dist/node_modules/date-fns/constants.js.map +1 -0
- package/dist/node_modules/date-fns/constructFrom.js +9 -0
- package/dist/node_modules/date-fns/constructFrom.js.map +1 -0
- package/dist/node_modules/date-fns/constructNow.js +9 -0
- package/dist/node_modules/date-fns/constructNow.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInCalendarDays.js +13 -0
- package/dist/node_modules/date-fns/differenceInCalendarDays.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInCalendarMonths.js +10 -0
- package/dist/node_modules/date-fns/differenceInCalendarMonths.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInMilliseconds.js +9 -0
- package/dist/node_modules/date-fns/differenceInMilliseconds.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInMonths.js +18 -0
- package/dist/node_modules/date-fns/differenceInMonths.js.map +1 -0
- package/dist/node_modules/date-fns/differenceInSeconds.js +11 -0
- package/dist/node_modules/date-fns/differenceInSeconds.js.map +1 -0
- package/dist/node_modules/date-fns/endOfDay.js +10 -0
- package/dist/node_modules/date-fns/endOfDay.js.map +1 -0
- package/dist/node_modules/date-fns/endOfMonth.js +10 -0
- package/dist/node_modules/date-fns/endOfMonth.js.map +1 -0
- package/dist/node_modules/date-fns/format.js +61 -0
- package/dist/node_modules/date-fns/format.js.map +1 -0
- package/dist/node_modules/date-fns/formatDistance.js +39 -0
- package/dist/node_modules/date-fns/formatDistance.js.map +1 -0
- package/dist/node_modules/date-fns/formatDistanceToNow.js +10 -0
- package/dist/node_modules/date-fns/formatDistanceToNow.js.map +1 -0
- package/dist/node_modules/date-fns/getDayOfYear.js +12 -0
- package/dist/node_modules/date-fns/getDayOfYear.js.map +1 -0
- package/dist/node_modules/date-fns/getISOWeek.js +13 -0
- package/dist/node_modules/date-fns/getISOWeek.js.map +1 -0
- package/dist/node_modules/date-fns/getISOWeekYear.js +16 -0
- package/dist/node_modules/date-fns/getISOWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/getWeek.js +13 -0
- package/dist/node_modules/date-fns/getWeek.js.map +1 -0
- package/dist/node_modules/date-fns/getWeekYear.js +17 -0
- package/dist/node_modules/date-fns/getWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/isDate.js +8 -0
- package/dist/node_modules/date-fns/isDate.js.map +1 -0
- package/dist/node_modules/date-fns/isLastDayOfMonth.js +12 -0
- package/dist/node_modules/date-fns/isLastDayOfMonth.js.map +1 -0
- package/dist/node_modules/date-fns/isValid.js +10 -0
- package/dist/node_modules/date-fns/isValid.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +11 -0
- package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +19 -0
- package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js +24 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +20 -0
- package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +71 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js +34 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +13 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js +204 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/match.js +126 -0
- package/dist/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
- package/dist/node_modules/date-fns/locale/en-US.js +22 -0
- package/dist/node_modules/date-fns/locale/en-US.js.map +1 -0
- package/dist/node_modules/date-fns/parseISO.js +119 -0
- package/dist/node_modules/date-fns/parseISO.js.map +1 -0
- package/dist/node_modules/date-fns/startOfDay.js +10 -0
- package/dist/node_modules/date-fns/startOfDay.js.map +1 -0
- package/dist/node_modules/date-fns/startOfISOWeek.js +12 -0
- package/dist/node_modules/date-fns/startOfISOWeek.js.map +1 -0
- package/dist/node_modules/date-fns/startOfISOWeekYear.js +12 -0
- package/dist/node_modules/date-fns/startOfISOWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/startOfWeek.js +11 -0
- package/dist/node_modules/date-fns/startOfWeek.js.map +1 -0
- package/dist/node_modules/date-fns/startOfWeekYear.js +13 -0
- package/dist/node_modules/date-fns/startOfWeekYear.js.map +1 -0
- package/dist/node_modules/date-fns/startOfYear.js +10 -0
- package/dist/node_modules/date-fns/startOfYear.js.map +1 -0
- package/dist/node_modules/date-fns/toDate.js +9 -0
- package/dist/node_modules/date-fns/toDate.js.map +1 -0
- package/dist/node_modules/react-hook-form/dist/index.esm.js +1210 -0
- package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/node_modules/zod/v3/ZodError.js +82 -0
- package/dist/node_modules/zod/v3/ZodError.js.map +1 -0
- package/dist/node_modules/zod/v3/errors.js +10 -0
- package/dist/node_modules/zod/v3/errors.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/errorUtil.js +9 -0
- package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/parseUtil.js +93 -0
- package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
- package/dist/node_modules/zod/v3/helpers/util.js +76 -0
- package/dist/node_modules/zod/v3/helpers/util.js.map +1 -0
- package/dist/node_modules/zod/v3/locales/en.js +62 -0
- package/dist/node_modules/zod/v3/locales/en.js.map +1 -0
- package/dist/node_modules/zod/v3/types.js +2459 -0
- package/dist/node_modules/zod/v3/types.js.map +1 -0
- package/dist/node_modules/zod/v4/core/core.js +35 -0
- package/dist/node_modules/zod/v4/core/core.js.map +1 -0
- package/dist/node_modules/zod/v4/core/errors.js +24 -0
- package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
- package/dist/node_modules/zod/v4/core/parse.js +29 -0
- package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
- package/dist/node_modules/zod/v4/core/util.js +20 -0
- package/dist/node_modules/zod/v4/core/util.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { Card as t, CardContent as n, CardHeader as r, CardTitle as i, Skeleton as a } from "./ui.js";
|
|
3
|
+
import { formatRelativeTime as o } from "../utils/formatters.js";
|
|
4
|
+
import { Activity as s, AlertTriangle as c, Ban as l, CheckCircle as u, CreditCard as d, Mail as f, Plus as p, Rocket as m, Settings as h, Shield as g, UserPlus as _, XCircle as v } from "lucide-react";
|
|
5
|
+
import { Link as y } from "react-router-dom";
|
|
6
|
+
import { jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
7
|
+
//#region src/admin/components/ActivityFeed.tsx
|
|
8
|
+
function S({ activities: e, maxItems: a = 10, loading: o, viewAllLink: s = "/activity", className: c }) {
|
|
9
|
+
let l = e.slice(0, a);
|
|
10
|
+
return /* @__PURE__ */ x(t, {
|
|
11
|
+
className: c,
|
|
12
|
+
children: [/* @__PURE__ */ x(r, {
|
|
13
|
+
className: "flex flex-row items-center justify-between",
|
|
14
|
+
children: [/* @__PURE__ */ b(i, {
|
|
15
|
+
className: "text-lg",
|
|
16
|
+
children: "Recent Activity"
|
|
17
|
+
}), /* @__PURE__ */ b(y, {
|
|
18
|
+
to: s,
|
|
19
|
+
className: "text-sm text-primary hover:underline",
|
|
20
|
+
children: "View All"
|
|
21
|
+
})]
|
|
22
|
+
}), /* @__PURE__ */ b(n, { children: o ? /* @__PURE__ */ b("div", {
|
|
23
|
+
className: "space-y-4",
|
|
24
|
+
children: Array.from({ length: 5 }).map((e, t) => /* @__PURE__ */ b(w, {}, t))
|
|
25
|
+
}) : l.length === 0 ? /* @__PURE__ */ b("p", {
|
|
26
|
+
className: "py-8 text-center text-sm text-muted-foreground",
|
|
27
|
+
children: "No recent activity"
|
|
28
|
+
}) : /* @__PURE__ */ b("div", {
|
|
29
|
+
className: "space-y-4",
|
|
30
|
+
children: l.map((e) => /* @__PURE__ */ b(C, { activity: e }, e.id))
|
|
31
|
+
}) })]
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function C({ activity: t }) {
|
|
35
|
+
let n = T(t.type);
|
|
36
|
+
return /* @__PURE__ */ x("div", {
|
|
37
|
+
className: "flex items-start gap-3",
|
|
38
|
+
children: [/* @__PURE__ */ b("div", {
|
|
39
|
+
className: e("rounded-full p-2", {
|
|
40
|
+
info: "bg-info/10 text-info",
|
|
41
|
+
warning: "bg-warning/10 text-warning",
|
|
42
|
+
error: "bg-destructive/10 text-destructive",
|
|
43
|
+
success: "bg-success/10 text-success"
|
|
44
|
+
}[t.severity || "info"]),
|
|
45
|
+
children: n
|
|
46
|
+
}), /* @__PURE__ */ x("div", {
|
|
47
|
+
className: "min-w-0 flex-1",
|
|
48
|
+
children: [/* @__PURE__ */ b("p", {
|
|
49
|
+
className: "text-sm font-medium text-foreground",
|
|
50
|
+
children: t.description
|
|
51
|
+
}), /* @__PURE__ */ x("div", {
|
|
52
|
+
className: "mt-1 flex items-center gap-2 text-xs text-muted-foreground",
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ b("span", { children: t.actor }),
|
|
55
|
+
/* @__PURE__ */ b("span", { children: "-" }),
|
|
56
|
+
/* @__PURE__ */ b("span", { children: o(t.timestamp) })
|
|
57
|
+
]
|
|
58
|
+
})]
|
|
59
|
+
})]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function w() {
|
|
63
|
+
return /* @__PURE__ */ x("div", {
|
|
64
|
+
className: "flex items-start gap-3",
|
|
65
|
+
children: [/* @__PURE__ */ b(a, { className: "h-9 w-9 rounded-full" }), /* @__PURE__ */ x("div", {
|
|
66
|
+
className: "flex-1 space-y-2",
|
|
67
|
+
children: [/* @__PURE__ */ b(a, { className: "h-4 w-3/4" }), /* @__PURE__ */ b(a, { className: "h-3 w-1/2" })]
|
|
68
|
+
})]
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function T(e) {
|
|
72
|
+
return {
|
|
73
|
+
"tenant.created": /* @__PURE__ */ b(p, { className: "h-4 w-4" }),
|
|
74
|
+
"tenant.suspended": /* @__PURE__ */ b(l, { className: "h-4 w-4" }),
|
|
75
|
+
"tenant.activated": /* @__PURE__ */ b(u, { className: "h-4 w-4" }),
|
|
76
|
+
"payment.failed": /* @__PURE__ */ b(c, { className: "h-4 w-4" }),
|
|
77
|
+
"payment.succeeded": /* @__PURE__ */ b(d, { className: "h-4 w-4" }),
|
|
78
|
+
"user.created": /* @__PURE__ */ b(_, { className: "h-4 w-4" }),
|
|
79
|
+
"user.blocked": /* @__PURE__ */ b(l, { className: "h-4 w-4" }),
|
|
80
|
+
"deployment.started": /* @__PURE__ */ b(m, { className: "h-4 w-4" }),
|
|
81
|
+
"deployment.completed": /* @__PURE__ */ b(u, { className: "h-4 w-4" }),
|
|
82
|
+
"deployment.failed": /* @__PURE__ */ b(v, { className: "h-4 w-4" }),
|
|
83
|
+
"newsletter.sent": /* @__PURE__ */ b(f, { className: "h-4 w-4" }),
|
|
84
|
+
"settings.changed": /* @__PURE__ */ b(h, { className: "h-4 w-4" }),
|
|
85
|
+
"security.alert": /* @__PURE__ */ b(g, { className: "h-4 w-4" })
|
|
86
|
+
}[e] || /* @__PURE__ */ b(s, { className: "h-4 w-4" });
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { S as ActivityFeed };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=ActivityFeed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityFeed.js","names":[],"sources":["../../../src/admin/components/ActivityFeed.tsx"],"sourcesContent":["import { Link } from 'react-router-dom';\nimport {\n Plus,\n Ban,\n AlertTriangle,\n CheckCircle,\n UserPlus,\n Rocket,\n XCircle,\n Activity,\n CreditCard,\n Mail,\n Settings,\n Shield,\n} from 'lucide-react';\nimport { Card, CardHeader, CardTitle, CardContent, Skeleton } from './ui';\nimport { cn } from '../utils/cn';\nimport { formatRelativeTime } from '../utils/formatters';\nimport type { Activity as ActivityType } from '../types';\n\ninterface ActivityFeedProps {\n /** List of activities */\n activities: ActivityType[];\n /** Maximum items to display */\n maxItems?: number;\n /** Loading state */\n loading?: boolean;\n /** Link to view all activities */\n viewAllLink?: string;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Activity feed component showing recent platform activities\n */\nexport function ActivityFeed({\n activities,\n maxItems = 10,\n loading,\n viewAllLink = '/activity',\n className,\n}: ActivityFeedProps) {\n const displayActivities = activities.slice(0, maxItems);\n\n return (\n <Card className={className}>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"text-lg\">Recent Activity</CardTitle>\n <Link to={viewAllLink} className=\"text-sm text-primary hover:underline\">\n View All\n </Link>\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"space-y-4\">\n {Array.from({ length: 5 }).map((_, i) => (\n <ActivityItemSkeleton key={i} />\n ))}\n </div>\n ) : displayActivities.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-muted-foreground\">No recent activity</p>\n ) : (\n <div className=\"space-y-4\">\n {displayActivities.map((activity) => (\n <ActivityItem key={activity.id} activity={activity} />\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n\ninterface ActivityItemProps {\n activity: ActivityType;\n}\n\nfunction ActivityItem({ activity }: ActivityItemProps) {\n const icon = getActivityIcon(activity.type);\n const severityColors = {\n info: 'bg-info/10 text-info',\n warning: 'bg-warning/10 text-warning',\n error: 'bg-destructive/10 text-destructive',\n success: 'bg-success/10 text-success',\n };\n const severity = activity.severity || 'info';\n\n return (\n <div className=\"flex items-start gap-3\">\n <div className={cn('rounded-full p-2', severityColors[severity])}>{icon}</div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{activity.description}</p>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{activity.actor}</span>\n <span>-</span>\n <span>{formatRelativeTime(activity.timestamp)}</span>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ActivityItemSkeleton() {\n return (\n <div className=\"flex items-start gap-3\">\n <Skeleton className=\"h-9 w-9 rounded-full\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n );\n}\n\nfunction getActivityIcon(type: string) {\n const iconMap: Record<string, React.ReactNode> = {\n 'tenant.created': <Plus className=\"h-4 w-4\" />,\n 'tenant.suspended': <Ban className=\"h-4 w-4\" />,\n 'tenant.activated': <CheckCircle className=\"h-4 w-4\" />,\n 'payment.failed': <AlertTriangle className=\"h-4 w-4\" />,\n 'payment.succeeded': <CreditCard className=\"h-4 w-4\" />,\n 'user.created': <UserPlus className=\"h-4 w-4\" />,\n 'user.blocked': <Ban className=\"h-4 w-4\" />,\n 'deployment.started': <Rocket className=\"h-4 w-4\" />,\n 'deployment.completed': <CheckCircle className=\"h-4 w-4\" />,\n 'deployment.failed': <XCircle className=\"h-4 w-4\" />,\n 'newsletter.sent': <Mail className=\"h-4 w-4\" />,\n 'settings.changed': <Settings className=\"h-4 w-4\" />,\n 'security.alert': <Shield className=\"h-4 w-4\" />,\n };\n\n return iconMap[type] || <Activity className=\"h-4 w-4\" />;\n}\n"],"mappings":";;;;;;;AAoCA,SAAgB,EAAa,EAC3B,eACA,cAAW,IACX,YACA,iBAAc,aACd,gBACoB;CACpB,IAAM,IAAoB,EAAW,MAAM,GAAG,EAAS;AAEvD,QACE,kBAAC,GAAD;EAAiB;YAAjB,CACE,kBAAC,GAAD;GAAY,WAAU;aAAtB,CACE,kBAAC,GAAD;IAAW,WAAU;cAAU;IAA2B,CAAA,EAC1D,kBAAC,GAAD;IAAM,IAAI;IAAa,WAAU;cAAuC;IAEjE,CAAA,CACI;MACb,kBAAC,GAAD,EAAA,UACG,IACC,kBAAC,OAAD;GAAK,WAAU;aACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,GAAD,EAAgC,EAAL,EAAK,CAChC;GACE,CAAA,GACJ,EAAkB,WAAW,IAC/B,kBAAC,KAAD;GAAG,WAAU;aAAiD;GAAsB,CAAA,GAEpF,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAkB,KAAK,MACtB,kBAAC,GAAD,EAA0C,aAAY,EAAnC,EAAS,GAA0B,CACtD;GACE,CAAA,EAEI,CAAA,CACT;;;AAQX,SAAS,EAAa,EAAE,eAA+B;CACrD,IAAM,IAAO,EAAgB,EAAS,KAAK;AAS3C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAW,EAAG,oBAVA;IACrB,MAAM;IACN,SAAS;IACT,OAAO;IACP,SAAS;IACV,CACgB,EAAS,YAAY,QAI8B;aAAG;GAAW,CAAA,EAC9E,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAuC,EAAS;IAAgB,CAAA,EAC7E,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD,EAAA,UAAO,EAAS,OAAa,CAAA;KAC7B,kBAAC,QAAD,EAAA,UAAM,KAAQ,CAAA;KACd,kBAAC,QAAD,EAAA,UAAO,EAAmB,EAAS,UAAU,EAAQ,CAAA;KACjD;MACF;KACF;;;AAIV,SAAS,IAAuB;AAC9B,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA,EAC7C,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,EAClC,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,CAC9B;KACF;;;AAIV,SAAS,EAAgB,GAAc;AAiBrC,QAhBiD;EAC/C,kBAAkB,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;EAC9C,oBAAoB,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;EAC/C,oBAAoB,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;EACvD,kBAAkB,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;EACvD,qBAAqB,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;EACvD,gBAAgB,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;EAChD,gBAAgB,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;EAC3C,sBAAsB,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;EACpD,wBAAwB,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;EAC3D,qBAAqB,kBAAC,GAAD,EAAS,WAAU,WAAY,CAAA;EACpD,mBAAmB,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;EAC/C,oBAAoB,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;EACpD,kBAAkB,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;EACjD,CAEc,MAAS,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RevenueTrendPoint, TenantGrowthPoint, ProductUsagePoint } from '../types';
|
|
2
|
+
|
|
3
|
+
interface RevenueTrendChartProps {
|
|
4
|
+
data: RevenueTrendPoint[];
|
|
5
|
+
loading?: boolean;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function RevenueTrendChart({ data, loading, className }: RevenueTrendChartProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
interface TenantGrowthChartProps {
|
|
10
|
+
data: TenantGrowthPoint[];
|
|
11
|
+
loading?: boolean;
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function TenantGrowthChart({ data, loading, className }: TenantGrowthChartProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
interface ProductUsageChartProps {
|
|
16
|
+
data: ProductUsagePoint[];
|
|
17
|
+
loading?: boolean;
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function ProductUsageChart({ data, loading, className }: ProductUsageChartProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
interface QuickLink {
|
|
22
|
+
to: string;
|
|
23
|
+
icon: React.ReactNode;
|
|
24
|
+
label: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
}
|
|
27
|
+
interface QuickLinksProps {
|
|
28
|
+
links: QuickLink[];
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function QuickLinks({ links, className }: QuickLinksProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=Charts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Charts.d.ts","sourceRoot":"","sources":["../../../src/admin/components/Charts.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAexF,UAAU,sBAAsB;IAC9B,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAyDrF;AAMD,UAAU,sBAAsB;IAC9B,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CA6DrF;AAMD,UAAU,sBAAsB;IAC9B,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CA8CrF;AAMD,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,eAAe,2CA8B/D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { Card as t, CardContent as n, CardHeader as r, CardTitle as i } from "./ui.js";
|
|
3
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
4
|
+
import "recharts";
|
|
5
|
+
//#region src/admin/components/Charts.tsx
|
|
6
|
+
function s({ links: s, className: c }) {
|
|
7
|
+
return /* @__PURE__ */ o(t, {
|
|
8
|
+
className: c,
|
|
9
|
+
children: [/* @__PURE__ */ a(r, { children: /* @__PURE__ */ a(i, {
|
|
10
|
+
className: "text-lg",
|
|
11
|
+
children: "Quick Actions"
|
|
12
|
+
}) }), /* @__PURE__ */ a(n, { children: /* @__PURE__ */ a("div", {
|
|
13
|
+
className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
|
|
14
|
+
children: s.map((t) => /* @__PURE__ */ o("a", {
|
|
15
|
+
href: t.to,
|
|
16
|
+
className: e("flex items-center gap-3 rounded-lg border border-border p-3", "transition-colors hover:bg-accent"),
|
|
17
|
+
children: [/* @__PURE__ */ a("div", {
|
|
18
|
+
className: "rounded-md bg-primary/10 p-2 text-primary",
|
|
19
|
+
children: t.icon
|
|
20
|
+
}), /* @__PURE__ */ o("div", {
|
|
21
|
+
className: "min-w-0 flex-1",
|
|
22
|
+
children: [/* @__PURE__ */ a("p", {
|
|
23
|
+
className: "font-medium text-foreground",
|
|
24
|
+
children: t.label
|
|
25
|
+
}), t.description && /* @__PURE__ */ a("p", {
|
|
26
|
+
className: "truncate text-xs text-muted-foreground",
|
|
27
|
+
children: t.description
|
|
28
|
+
})]
|
|
29
|
+
})]
|
|
30
|
+
}, t.to))
|
|
31
|
+
}) })]
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { s as QuickLinks };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=Charts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Charts.js","names":[],"sources":["../../../src/admin/components/Charts.tsx"],"sourcesContent":["import {\n LineChart,\n Line,\n AreaChart,\n Area,\n PieChart,\n Pie,\n Cell,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n ResponsiveContainer,\n} from 'recharts';\nimport { Card, CardHeader, CardTitle, CardContent, Skeleton } from './ui';\nimport { cn } from '../utils/cn';\nimport { formatCurrency, formatNumber } from '../utils/formatters';\nimport type { RevenueTrendPoint, TenantGrowthPoint, ProductUsagePoint } from '../types';\n\n// Chart colors using CSS variables for theme support\nconst CHART_COLORS = [\n 'hsl(var(--chart-1, 221.2 83.2% 53.3%))',\n 'hsl(var(--chart-2, 142.1 76.2% 36.3%))',\n 'hsl(var(--chart-3, 47.9 95.8% 53.1%))',\n 'hsl(var(--chart-4, 0 84.2% 60.2%))',\n 'hsl(var(--chart-5, 262.1 83.3% 57.8%))',\n];\n\n// ============================================================================\n// Revenue Trend Chart (Line Chart)\n// ============================================================================\n\ninterface RevenueTrendChartProps {\n data: RevenueTrendPoint[];\n loading?: boolean;\n className?: string;\n}\n\nexport function RevenueTrendChart({ data, loading, className }: RevenueTrendChartProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle className=\"text-lg\">Revenue Trend</CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <Skeleton className=\"h-[300px] w-full\" />\n ) : (\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={data} margin={{ top: 5, right: 30, left: 20, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" className=\"stroke-border\" />\n <XAxis\n dataKey=\"date\"\n className=\"text-xs fill-muted-foreground\"\n tick={{ fill: 'currentColor' }}\n />\n <YAxis\n className=\"text-xs fill-muted-foreground\"\n tick={{ fill: 'currentColor' }}\n tickFormatter={(value) => formatCurrency(value)}\n />\n <Tooltip\n contentStyle={{\n backgroundColor: 'hsl(var(--card))',\n border: '1px solid hsl(var(--border))',\n borderRadius: '6px',\n }}\n labelStyle={{ color: 'hsl(var(--foreground))' }}\n formatter={(value: number) => [formatCurrency(value), '']}\n />\n <Legend />\n <Line\n type=\"monotone\"\n dataKey=\"mrr\"\n name=\"MRR\"\n stroke={CHART_COLORS[0]}\n strokeWidth={2}\n dot={false}\n activeDot={{ r: 6 }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"arr\"\n name=\"ARR\"\n stroke={CHART_COLORS[1]}\n strokeWidth={2}\n dot={false}\n activeDot={{ r: 6 }}\n />\n </LineChart>\n </ResponsiveContainer>\n )}\n </CardContent>\n </Card>\n );\n}\n\n// ============================================================================\n// Tenant Growth Chart (Area Chart)\n// ============================================================================\n\ninterface TenantGrowthChartProps {\n data: TenantGrowthPoint[];\n loading?: boolean;\n className?: string;\n}\n\nexport function TenantGrowthChart({ data, loading, className }: TenantGrowthChartProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle className=\"text-lg\">Tenant Growth</CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <Skeleton className=\"h-[250px] w-full\" />\n ) : (\n <ResponsiveContainer width=\"100%\" height={250}>\n <AreaChart data={data} margin={{ top: 5, right: 30, left: 20, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" className=\"stroke-border\" />\n <XAxis\n dataKey=\"date\"\n className=\"text-xs fill-muted-foreground\"\n tick={{ fill: 'currentColor' }}\n />\n <YAxis className=\"text-xs fill-muted-foreground\" tick={{ fill: 'currentColor' }} />\n <Tooltip\n contentStyle={{\n backgroundColor: 'hsl(var(--card))',\n border: '1px solid hsl(var(--border))',\n borderRadius: '6px',\n }}\n labelStyle={{ color: 'hsl(var(--foreground))' }}\n />\n <Legend />\n <Area\n type=\"monotone\"\n dataKey=\"new\"\n name=\"New\"\n stackId=\"1\"\n stroke={CHART_COLORS[0]}\n fill={CHART_COLORS[0]}\n fillOpacity={0.6}\n />\n <Area\n type=\"monotone\"\n dataKey=\"active\"\n name=\"Active\"\n stackId=\"2\"\n stroke={CHART_COLORS[1]}\n fill={CHART_COLORS[1]}\n fillOpacity={0.6}\n />\n <Area\n type=\"monotone\"\n dataKey=\"churned\"\n name=\"Churned\"\n stackId=\"3\"\n stroke={CHART_COLORS[3]}\n fill={CHART_COLORS[3]}\n fillOpacity={0.6}\n />\n </AreaChart>\n </ResponsiveContainer>\n )}\n </CardContent>\n </Card>\n );\n}\n\n// ============================================================================\n// Product Usage Chart (Pie Chart)\n// ============================================================================\n\ninterface ProductUsageChartProps {\n data: ProductUsagePoint[];\n loading?: boolean;\n className?: string;\n}\n\nexport function ProductUsageChart({ data, loading, className }: ProductUsageChartProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle className=\"text-lg\">Product Usage</CardTitle>\n </CardHeader>\n <CardContent>\n {loading ? (\n <Skeleton className=\"h-[250px] w-full\" />\n ) : (\n <ResponsiveContainer width=\"100%\" height={250}>\n <PieChart>\n <Pie\n data={data}\n dataKey=\"tenants\"\n nameKey=\"product\"\n cx=\"50%\"\n cy=\"50%\"\n outerRadius={80}\n label={({ name, percent }: { name: string; percent: number }) =>\n `${name} (${(percent * 100).toFixed(0)}%)`\n }\n labelLine={false}\n >\n {data.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.color || CHART_COLORS[index % CHART_COLORS.length]}\n />\n ))}\n </Pie>\n <Tooltip\n contentStyle={{\n backgroundColor: 'hsl(var(--card))',\n border: '1px solid hsl(var(--border))',\n borderRadius: '6px',\n }}\n formatter={(value: number) => [formatNumber(value) + ' tenants', '']}\n />\n <Legend />\n </PieChart>\n </ResponsiveContainer>\n )}\n </CardContent>\n </Card>\n );\n}\n\n// ============================================================================\n// Quick Links Card\n// ============================================================================\n\ninterface QuickLink {\n to: string;\n icon: React.ReactNode;\n label: string;\n description?: string;\n}\n\ninterface QuickLinksProps {\n links: QuickLink[];\n className?: string;\n}\n\nexport function QuickLinks({ links, className }: QuickLinksProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle className=\"text-lg\">Quick Actions</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {links.map((link) => (\n <a\n key={link.to}\n href={link.to}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border p-3',\n 'transition-colors hover:bg-accent'\n )}\n >\n <div className=\"rounded-md bg-primary/10 p-2 text-primary\">{link.icon}</div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium text-foreground\">{link.label}</p>\n {link.description && (\n <p className=\"truncate text-xs text-muted-foreground\">{link.description}</p>\n )}\n </div>\n </a>\n ))}\n </div>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;AAqPA,SAAgB,EAAW,EAAE,UAAO,gBAA8B;AAChE,QACE,kBAAC,GAAD;EAAiB;YAAjB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAAU;GAAyB,CAAA,EAC7C,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAM,KAAK,MACV,kBAAC,KAAD;IAEE,MAAM,EAAK;IACX,WAAW,EACT,+DACA,oCACD;cANH,CAQE,kBAAC,OAAD;KAAK,WAAU;eAA6C,EAAK;KAAW,CAAA,EAC5E,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAA+B,EAAK;MAAU,CAAA,EAC1D,EAAK,eACJ,kBAAC,KAAD;MAAG,WAAU;gBAA0C,EAAK;MAAgB,CAAA,CAE1E;OACJ;MAdG,EAAK,GAcR,CACJ;GACE,CAAA,EACM,CAAA,CACT"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface ConfirmDialogProps {
|
|
4
|
+
/** Whether the dialog is open */
|
|
5
|
+
open: boolean;
|
|
6
|
+
/** Callback when the dialog should close */
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
/** Callback when confirmed */
|
|
9
|
+
onConfirm: () => void | Promise<void>;
|
|
10
|
+
/** Dialog title */
|
|
11
|
+
title: string;
|
|
12
|
+
/** Dialog description */
|
|
13
|
+
description: ReactNode;
|
|
14
|
+
/** Confirm button text */
|
|
15
|
+
confirmLabel?: string;
|
|
16
|
+
/** Cancel button text */
|
|
17
|
+
cancelLabel?: string;
|
|
18
|
+
/** Variant for styling */
|
|
19
|
+
variant?: 'default' | 'destructive';
|
|
20
|
+
/** Loading state */
|
|
21
|
+
loading?: boolean;
|
|
22
|
+
/** Icon to display */
|
|
23
|
+
icon?: ReactNode;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* ConfirmDialog - Modal dialog for confirming actions
|
|
27
|
+
*
|
|
28
|
+
* Use for destructive actions like deleting, or important state changes.
|
|
29
|
+
*/
|
|
30
|
+
export declare function ConfirmDialog({ open, onClose, onConfirm, title, description, confirmLabel, cancelLabel, variant, loading, icon, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element | null;
|
|
31
|
+
export interface DeleteConfirmDialogProps {
|
|
32
|
+
open: boolean;
|
|
33
|
+
onClose: () => void;
|
|
34
|
+
onConfirm: () => void | Promise<void>;
|
|
35
|
+
/** Name of item being deleted */
|
|
36
|
+
itemName: string;
|
|
37
|
+
/** Type of item (e.g., "tenant", "user") */
|
|
38
|
+
itemType: string;
|
|
39
|
+
loading?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* DeleteConfirmDialog - Pre-configured dialog for delete confirmations
|
|
43
|
+
*/
|
|
44
|
+
export declare function DeleteConfirmDialog({ open, onClose, onConfirm, itemName, itemType, loading, }: DeleteConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
//# sourceMappingURL=ConfirmDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAS1D,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,4CAA4C;IAC5C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,WAAW,EAAE,SAAS,CAAC;IACvB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;IACpC,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,SAAS,EACT,KAAK,EACL,WAAW,EACX,YAAwB,EACxB,WAAsB,EACtB,OAAmB,EACnB,OAAe,EACf,IAAI,GACL,EAAE,kBAAkB,kDA0GpB;AAMD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,OAAO,GACR,EAAE,wBAAwB,2CAkB1B"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface Column<T> {
|
|
4
|
+
/** Column key (used for accessing data) */
|
|
5
|
+
key: string;
|
|
6
|
+
/** Column header */
|
|
7
|
+
header: string;
|
|
8
|
+
/** Custom render function */
|
|
9
|
+
render?: (item: T, index: number) => ReactNode;
|
|
10
|
+
/** Column width */
|
|
11
|
+
width?: string;
|
|
12
|
+
/** Align content */
|
|
13
|
+
align?: 'left' | 'center' | 'right';
|
|
14
|
+
/** Sortable */
|
|
15
|
+
sortable?: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface DataTableProps<T> {
|
|
18
|
+
/** Column definitions */
|
|
19
|
+
columns: Column<T>[];
|
|
20
|
+
/** Data to display */
|
|
21
|
+
data: T[];
|
|
22
|
+
/** Key extractor for rows */
|
|
23
|
+
keyExtractor: (item: T) => string;
|
|
24
|
+
/** Loading state */
|
|
25
|
+
loading?: boolean;
|
|
26
|
+
/** Number of skeleton rows when loading */
|
|
27
|
+
skeletonRows?: number;
|
|
28
|
+
/** Empty state content */
|
|
29
|
+
emptyState?: ReactNode;
|
|
30
|
+
/** On row click handler */
|
|
31
|
+
onRowClick?: (item: T) => void;
|
|
32
|
+
/** Current sort column */
|
|
33
|
+
sortBy?: string;
|
|
34
|
+
/** Sort direction */
|
|
35
|
+
sortOrder?: 'asc' | 'desc';
|
|
36
|
+
/** On sort change */
|
|
37
|
+
onSort?: (column: string, order: 'asc' | 'desc') => void;
|
|
38
|
+
/** Additional class name */
|
|
39
|
+
className?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Reusable data table component
|
|
43
|
+
*/
|
|
44
|
+
export declare function DataTable<T>({ columns, data, keyExtractor, loading, skeletonRows, emptyState, onRowClick, sortBy, sortOrder, onSort, className, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
interface PaginationProps {
|
|
46
|
+
/** Current page (1-indexed) */
|
|
47
|
+
page: number;
|
|
48
|
+
/** Total pages */
|
|
49
|
+
totalPages: number;
|
|
50
|
+
/** Total items */
|
|
51
|
+
totalItems: number;
|
|
52
|
+
/** Items per page */
|
|
53
|
+
pageSize: number;
|
|
54
|
+
/** On page change */
|
|
55
|
+
onPageChange: (page: number) => void;
|
|
56
|
+
/** Additional class name */
|
|
57
|
+
className?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Pagination controls
|
|
61
|
+
*/
|
|
62
|
+
export declare function Pagination({ page, totalPages, totalItems, pageSize, onPageChange, className, }: PaginationProps): import("react/jsx-runtime").JSX.Element;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/admin/components/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,UAAU,MAAM,CAAC,CAAC;IAChB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC/C,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,eAAe;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,cAAc,CAAC,CAAC;IACxB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,sBAAsB;IACtB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,6BAA6B;IAC7B,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAClC,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,2BAA2B;IAC3B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,qBAAqB;IACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC;IACzD,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAC3B,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,YAAgB,EAChB,UAAU,EACV,UAAU,EACV,MAAM,EACN,SAAS,EACT,MAAM,EACN,SAAS,GACV,EAAE,cAAc,CAAC,CAAC,CAAC,2CA0FnB;AAED,UAAU,eAAe;IACvB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,UAAU,EACV,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,EAAE,eAAe,2CAoDjB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { Button as t, Skeleton as n } from "./ui.js";
|
|
3
|
+
import { ChevronLeft as r, ChevronRight as i, ChevronsLeft as a, ChevronsRight as o } from "lucide-react";
|
|
4
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
+
//#region src/admin/components/DataTable.tsx
|
|
6
|
+
function l({ columns: t, data: r, keyExtractor: i, loading: a, skeletonRows: o = 5, emptyState: l, onRowClick: u, sortBy: d, sortOrder: f, onSort: p, className: m }) {
|
|
7
|
+
let h = (e) => {
|
|
8
|
+
if (!e.sortable || !p) return;
|
|
9
|
+
let t = d === e.key && f === "asc" ? "desc" : "asc";
|
|
10
|
+
p(e.key, t);
|
|
11
|
+
}, g = {
|
|
12
|
+
left: "text-left",
|
|
13
|
+
center: "text-center",
|
|
14
|
+
right: "text-right"
|
|
15
|
+
};
|
|
16
|
+
return /* @__PURE__ */ s("div", {
|
|
17
|
+
className: e("overflow-hidden rounded-lg border border-border", m),
|
|
18
|
+
children: /* @__PURE__ */ s("div", {
|
|
19
|
+
className: "overflow-x-auto",
|
|
20
|
+
children: /* @__PURE__ */ c("table", {
|
|
21
|
+
className: "w-full border-collapse",
|
|
22
|
+
children: [/* @__PURE__ */ s("thead", { children: /* @__PURE__ */ s("tr", {
|
|
23
|
+
className: "border-b border-border bg-muted/50",
|
|
24
|
+
children: t.map((t) => /* @__PURE__ */ s("th", {
|
|
25
|
+
className: e("px-4 py-3 text-sm font-medium text-muted-foreground", g[t.align || "left"], t.sortable && "cursor-pointer select-none hover:text-foreground", t.width),
|
|
26
|
+
style: t.width ? { width: t.width } : void 0,
|
|
27
|
+
onClick: () => h(t),
|
|
28
|
+
children: /* @__PURE__ */ c("div", {
|
|
29
|
+
className: "flex items-center gap-2",
|
|
30
|
+
children: [t.header, t.sortable && d === t.key && /* @__PURE__ */ s("span", {
|
|
31
|
+
className: "text-xs",
|
|
32
|
+
children: f === "asc" ? "↑" : "↓"
|
|
33
|
+
})]
|
|
34
|
+
})
|
|
35
|
+
}, t.key))
|
|
36
|
+
}) }), /* @__PURE__ */ s("tbody", { children: a ? Array.from({ length: o }).map((e, r) => /* @__PURE__ */ s("tr", {
|
|
37
|
+
className: "border-b border-border last:border-0",
|
|
38
|
+
children: t.map((e) => /* @__PURE__ */ s("td", {
|
|
39
|
+
className: "px-4 py-3",
|
|
40
|
+
children: /* @__PURE__ */ s(n, { className: "h-5 w-full" })
|
|
41
|
+
}, e.key))
|
|
42
|
+
}, r)) : r.length === 0 ? /* @__PURE__ */ s("tr", { children: /* @__PURE__ */ s("td", {
|
|
43
|
+
colSpan: t.length,
|
|
44
|
+
className: "px-4 py-8",
|
|
45
|
+
children: l || /* @__PURE__ */ s("div", {
|
|
46
|
+
className: "text-center text-sm text-muted-foreground",
|
|
47
|
+
children: "No data available"
|
|
48
|
+
})
|
|
49
|
+
}) }) : r.map((n, r) => /* @__PURE__ */ s("tr", {
|
|
50
|
+
className: e("border-b border-border last:border-0 transition-colors", u && "cursor-pointer hover:bg-muted/50"),
|
|
51
|
+
onClick: () => u?.(n),
|
|
52
|
+
children: t.map((t) => /* @__PURE__ */ s("td", {
|
|
53
|
+
className: e("px-4 py-3 text-sm", g[t.align || "left"]),
|
|
54
|
+
children: t.render ? t.render(n, r) : String(n[t.key] ?? "")
|
|
55
|
+
}, t.key))
|
|
56
|
+
}, i(n))) })]
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function u({ page: n, totalPages: l, totalItems: u, pageSize: d, onPageChange: f, className: p }) {
|
|
62
|
+
let m = (n - 1) * d + 1, h = Math.min(n * d, u);
|
|
63
|
+
return /* @__PURE__ */ c("div", {
|
|
64
|
+
className: e("flex items-center justify-between px-4 py-3", p),
|
|
65
|
+
children: [/* @__PURE__ */ c("div", {
|
|
66
|
+
className: "text-sm text-muted-foreground",
|
|
67
|
+
children: [
|
|
68
|
+
"Showing ",
|
|
69
|
+
m,
|
|
70
|
+
" to ",
|
|
71
|
+
h,
|
|
72
|
+
" of ",
|
|
73
|
+
u,
|
|
74
|
+
" results"
|
|
75
|
+
]
|
|
76
|
+
}), /* @__PURE__ */ c("div", {
|
|
77
|
+
className: "flex items-center gap-1",
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ s(t, {
|
|
80
|
+
variant: "outline",
|
|
81
|
+
size: "icon",
|
|
82
|
+
onClick: () => f(1),
|
|
83
|
+
disabled: n === 1,
|
|
84
|
+
"aria-label": "First page",
|
|
85
|
+
children: /* @__PURE__ */ s(a, { className: "h-4 w-4" })
|
|
86
|
+
}),
|
|
87
|
+
/* @__PURE__ */ s(t, {
|
|
88
|
+
variant: "outline",
|
|
89
|
+
size: "icon",
|
|
90
|
+
onClick: () => f(n - 1),
|
|
91
|
+
disabled: n === 1,
|
|
92
|
+
"aria-label": "Previous page",
|
|
93
|
+
children: /* @__PURE__ */ s(r, { className: "h-4 w-4" })
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ c("span", {
|
|
96
|
+
className: "px-3 text-sm",
|
|
97
|
+
children: [
|
|
98
|
+
"Page ",
|
|
99
|
+
n,
|
|
100
|
+
" of ",
|
|
101
|
+
l
|
|
102
|
+
]
|
|
103
|
+
}),
|
|
104
|
+
/* @__PURE__ */ s(t, {
|
|
105
|
+
variant: "outline",
|
|
106
|
+
size: "icon",
|
|
107
|
+
onClick: () => f(n + 1),
|
|
108
|
+
disabled: n === l,
|
|
109
|
+
"aria-label": "Next page",
|
|
110
|
+
children: /* @__PURE__ */ s(i, { className: "h-4 w-4" })
|
|
111
|
+
}),
|
|
112
|
+
/* @__PURE__ */ s(t, {
|
|
113
|
+
variant: "outline",
|
|
114
|
+
size: "icon",
|
|
115
|
+
onClick: () => f(l),
|
|
116
|
+
disabled: n === l,
|
|
117
|
+
"aria-label": "Last page",
|
|
118
|
+
children: /* @__PURE__ */ s(o, { className: "h-4 w-4" })
|
|
119
|
+
})
|
|
120
|
+
]
|
|
121
|
+
})]
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
export { l as DataTable, u as Pagination };
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=DataTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.js","names":[],"sources":["../../../src/admin/components/DataTable.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\nimport { Button, Skeleton } from './ui';\nimport { cn } from '../utils/cn';\n\ninterface Column<T> {\n /** Column key (used for accessing data) */\n key: string;\n /** Column header */\n header: string;\n /** Custom render function */\n render?: (item: T, index: number) => ReactNode;\n /** Column width */\n width?: string;\n /** Align content */\n align?: 'left' | 'center' | 'right';\n /** Sortable */\n sortable?: boolean;\n}\n\ninterface DataTableProps<T> {\n /** Column definitions */\n columns: Column<T>[];\n /** Data to display */\n data: T[];\n /** Key extractor for rows */\n keyExtractor: (item: T) => string;\n /** Loading state */\n loading?: boolean;\n /** Number of skeleton rows when loading */\n skeletonRows?: number;\n /** Empty state content */\n emptyState?: ReactNode;\n /** On row click handler */\n onRowClick?: (item: T) => void;\n /** Current sort column */\n sortBy?: string;\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n /** On sort change */\n onSort?: (column: string, order: 'asc' | 'desc') => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Reusable data table component\n */\nexport function DataTable<T>({\n columns,\n data,\n keyExtractor,\n loading,\n skeletonRows = 5,\n emptyState,\n onRowClick,\n sortBy,\n sortOrder,\n onSort,\n className,\n}: DataTableProps<T>) {\n const handleSort = (column: Column<T>) => {\n if (!column.sortable || !onSort) return;\n const newOrder = sortBy === column.key && sortOrder === 'asc' ? 'desc' : 'asc';\n onSort(column.key, newOrder);\n };\n\n const alignClasses = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n };\n\n return (\n <div className={cn('overflow-hidden rounded-lg border border-border', className)}>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50\">\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n 'px-4 py-3 text-sm font-medium text-muted-foreground',\n alignClasses[column.align || 'left'],\n column.sortable && 'cursor-pointer select-none hover:text-foreground',\n column.width\n )}\n style={column.width ? { width: column.width } : undefined}\n onClick={() => handleSort(column)}\n >\n <div className=\"flex items-center gap-2\">\n {column.header}\n {column.sortable && sortBy === column.key && (\n <span className=\"text-xs\">{sortOrder === 'asc' ? '↑' : '↓'}</span>\n )}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {loading ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={rowIndex} className=\"border-b border-border last:border-0\">\n {columns.map((column) => (\n <td key={column.key} className=\"px-4 py-3\">\n <Skeleton className=\"h-5 w-full\" />\n </td>\n ))}\n </tr>\n ))\n ) : data.length === 0 ? (\n <tr>\n <td colSpan={columns.length} className=\"px-4 py-8\">\n {emptyState || (\n <div className=\"text-center text-sm text-muted-foreground\">\n No data available\n </div>\n )}\n </td>\n </tr>\n ) : (\n data.map((item, index) => (\n <tr\n key={keyExtractor(item)}\n className={cn(\n 'border-b border-border last:border-0 transition-colors',\n onRowClick && 'cursor-pointer hover:bg-muted/50'\n )}\n onClick={() => onRowClick?.(item)}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn('px-4 py-3 text-sm', alignClasses[column.align || 'left'])}\n >\n {column.render\n ? column.render(item, index)\n : String((item as Record<string, unknown>)[column.key] ?? '')}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\ninterface PaginationProps {\n /** Current page (1-indexed) */\n page: number;\n /** Total pages */\n totalPages: number;\n /** Total items */\n totalItems: number;\n /** Items per page */\n pageSize: number;\n /** On page change */\n onPageChange: (page: number) => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Pagination controls\n */\nexport function Pagination({\n page,\n totalPages,\n totalItems,\n pageSize,\n onPageChange,\n className,\n}: PaginationProps) {\n const startItem = (page - 1) * pageSize + 1;\n const endItem = Math.min(page * pageSize, totalItems);\n\n return (\n <div className={cn('flex items-center justify-between px-4 py-3', className)}>\n <div className=\"text-sm text-muted-foreground\">\n Showing {startItem} to {endItem} of {totalItems} results\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => onPageChange(1)}\n disabled={page === 1}\n aria-label=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => onPageChange(page - 1)}\n disabled={page === 1}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <span className=\"px-3 text-sm\">\n Page {page} of {totalPages}\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => onPageChange(page + 1)}\n disabled={page === totalPages}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => onPageChange(totalPages)}\n disabled={page === totalPages}\n aria-label=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAgDA,SAAgB,EAAa,EAC3B,YACA,SACA,iBACA,YACA,kBAAe,GACf,eACA,eACA,WACA,cACA,WACA,gBACoB;CACpB,IAAM,KAAc,MAAsB;AACxC,MAAI,CAAC,EAAO,YAAY,CAAC,EAAQ;EACjC,IAAM,IAAW,MAAW,EAAO,OAAO,MAAc,QAAQ,SAAS;AACzE,IAAO,EAAO,KAAK,EAAS;IAGxB,IAAe;EACnB,MAAM;EACN,QAAQ;EACR,OAAO;EACR;AAED,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,mDAAmD,EAAU;YAC9E,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAQ,KAAK,MACZ,kBAAC,MAAD;MAEE,WAAW,EACT,uDACA,EAAa,EAAO,SAAS,SAC7B,EAAO,YAAY,oDACnB,EAAO,MACR;MACD,OAAO,EAAO,QAAQ,EAAE,OAAO,EAAO,OAAO,GAAG,KAAA;MAChD,eAAe,EAAW,EAAO;gBAEjC,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,EAAO,QACP,EAAO,YAAY,MAAW,EAAO,OACpC,kBAAC,QAAD;QAAM,WAAU;kBAAW,MAAc,QAAQ,MAAM;QAAW,CAAA,CAEhE;;MACH,EAhBE,EAAO,IAgBT,CACL;KACC,CAAA,EACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,IACC,MAAM,KAAK,EAAE,QAAQ,GAAc,CAAC,CAAC,KAAK,GAAG,MAC3C,kBAAC,MAAD;KAAmB,WAAU;eAC1B,EAAQ,KAAK,MACZ,kBAAC,MAAD;MAAqB,WAAU;gBAC7B,kBAAC,GAAD,EAAU,WAAU,cAAe,CAAA;MAChC,EAFI,EAAO,IAEX,CACL;KACC,EANI,EAMJ,CACL,GACA,EAAK,WAAW,IAClB,kBAAC,MAAD,EAAA,UACE,kBAAC,MAAD;KAAI,SAAS,EAAQ;KAAQ,WAAU;eACpC,KACC,kBAAC,OAAD;MAAK,WAAU;gBAA4C;MAErD,CAAA;KAEL,CAAA,EACF,CAAA,GAEL,EAAK,KAAK,GAAM,MACd,kBAAC,MAAD;KAEE,WAAW,EACT,0DACA,KAAc,mCACf;KACD,eAAe,IAAa,EAAK;eAEhC,EAAQ,KAAK,MACZ,kBAAC,MAAD;MAEE,WAAW,EAAG,qBAAqB,EAAa,EAAO,SAAS,QAAQ;gBAEvE,EAAO,SACJ,EAAO,OAAO,GAAM,EAAM,GAC1B,OAAQ,EAAiC,EAAO,QAAQ,GAAG;MAC5D,EANE,EAAO,IAMT,CACL;KACC,EAjBE,EAAa,EAAK,CAiBpB,CACL,EAEE,CAAA,CACF;;GACJ,CAAA;EACF,CAAA;;AAsBV,SAAgB,EAAW,EACzB,SACA,eACA,eACA,aACA,iBACA,gBACkB;CAClB,IAAM,KAAa,IAAO,KAAK,IAAW,GACpC,IAAU,KAAK,IAAI,IAAO,GAAU,EAAW;AAErD,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,+CAA+C,EAAU;YAA5E,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IAA+C;IACpC;IAAU;IAAK;IAAQ;IAAK;IAAW;IAC5C;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe,EAAa,EAAE;KAC9B,UAAU,MAAS;KACnB,cAAW;eAEX,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;KAC7B,CAAA;IACT,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe,EAAa,IAAO,EAAE;KACrC,UAAU,MAAS;KACnB,cAAW;eAEX,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;KAC5B,CAAA;IACT,kBAAC,QAAD;KAAM,WAAU;eAAhB;MAA+B;MACvB;MAAK;MAAK;MACX;;IACP,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe,EAAa,IAAO,EAAE;KACrC,UAAU,MAAS;KACnB,cAAW;eAEX,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;KAC7B,CAAA;IACT,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe,EAAa,EAAW;KACvC,UAAU,MAAS;KACnB,cAAW;eAEX,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;KAC9B,CAAA;IACL;KACF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* FormSheet props
|
|
4
|
+
*/
|
|
5
|
+
export interface FormSheetProps {
|
|
6
|
+
/** Whether the sheet is open */
|
|
7
|
+
open: boolean;
|
|
8
|
+
/** Callback when the sheet should close */
|
|
9
|
+
onClose: () => void;
|
|
10
|
+
/** Title of the sheet */
|
|
11
|
+
title: string;
|
|
12
|
+
/** Optional description */
|
|
13
|
+
description?: string;
|
|
14
|
+
/** Form content */
|
|
15
|
+
children: React.ReactNode;
|
|
16
|
+
/** Width of the sheet */
|
|
17
|
+
width?: 'sm' | 'md' | 'lg' | 'xl';
|
|
18
|
+
/** Optional footer actions */
|
|
19
|
+
footer?: React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* FormSheet - Slide-over panel for forms
|
|
23
|
+
*
|
|
24
|
+
* A side panel component for displaying forms that slides in from the right.
|
|
25
|
+
* Includes backdrop overlay, header with close button, and optional footer.
|
|
26
|
+
*/
|
|
27
|
+
export declare function FormSheet({ open, onClose, title, description, children, width, footer, }: FormSheetProps): import("react/jsx-runtime").JSX.Element | null;
|
|
28
|
+
/**
|
|
29
|
+
* FormSheetFooter props
|
|
30
|
+
*/
|
|
31
|
+
export interface FormSheetFooterProps {
|
|
32
|
+
/** Primary action button text */
|
|
33
|
+
submitLabel?: string;
|
|
34
|
+
/** Cancel button text */
|
|
35
|
+
cancelLabel?: string;
|
|
36
|
+
/** Callback for cancel */
|
|
37
|
+
onCancel: () => void;
|
|
38
|
+
/** Whether form is submitting */
|
|
39
|
+
isSubmitting?: boolean;
|
|
40
|
+
/** Whether submit is disabled */
|
|
41
|
+
disabled?: boolean;
|
|
42
|
+
/** Form ID to connect submit button */
|
|
43
|
+
formId?: string;
|
|
44
|
+
/** Callback for submit (if not using form) */
|
|
45
|
+
onSubmit?: () => void;
|
|
46
|
+
/** Variant for submit button */
|
|
47
|
+
submitVariant?: 'default' | 'destructive';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* FormSheetFooter - Standard footer for FormSheet with cancel/submit buttons
|
|
51
|
+
*/
|
|
52
|
+
export declare function FormSheetFooter({ submitLabel, cancelLabel, onCancel, isSubmitting, disabled, formId, onSubmit, submitVariant, }: FormSheetFooterProps): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
/**
|
|
54
|
+
* FormSection - Group related form fields
|
|
55
|
+
*/
|
|
56
|
+
export interface FormSectionProps {
|
|
57
|
+
/** Section title */
|
|
58
|
+
title?: string;
|
|
59
|
+
/** Section description */
|
|
60
|
+
description?: string;
|
|
61
|
+
/** Form fields */
|
|
62
|
+
children: React.ReactNode;
|
|
63
|
+
/** Additional className */
|
|
64
|
+
className?: string;
|
|
65
|
+
}
|
|
66
|
+
export declare function FormSection({ title, description, children, className }: FormSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
67
|
+
/**
|
|
68
|
+
* FormRow - Horizontal row for form fields
|
|
69
|
+
*/
|
|
70
|
+
export interface FormRowProps {
|
|
71
|
+
/** Form fields */
|
|
72
|
+
children: React.ReactNode;
|
|
73
|
+
/** Number of columns */
|
|
74
|
+
cols?: 2 | 3 | 4;
|
|
75
|
+
/** Additional className */
|
|
76
|
+
className?: string;
|
|
77
|
+
}
|
|
78
|
+
export declare function FormRow({ children, cols, className }: FormRowProps): import("react/jsx-runtime").JSX.Element;
|
|
79
|
+
//# sourceMappingURL=FormSheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormSheet.d.ts","sourceRoot":"","sources":["../../../src/admin/components/FormSheet.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yBAAyB;IACzB,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAClC,8BAA8B;IAC9B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AASD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,OAAO,EACP,KAAK,EACL,WAAW,EACX,QAAQ,EACR,KAAY,EACZ,MAAM,GACP,EAAE,cAAc,kDAmEhB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,iCAAiC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,gCAAgC;IAChC,aAAa,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,WAAoB,EACpB,WAAsB,EACtB,QAAQ,EACR,YAAoB,EACpB,QAAgB,EAChB,MAAM,EACN,QAAQ,EACR,aAAyB,GAC1B,EAAE,oBAAoB,2CAkBtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAYxF;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kBAAkB;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,wBAAwB;IACxB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAQ,EAAE,SAAS,EAAE,EAAE,YAAY,2CAOtE"}
|