@plumile/ui 0.1.105 → 0.1.106

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 (46) hide show
  1. package/lib/esm/{BackofficeJsonViewerAsync-Bn0_Sssa.js → BackofficeJsonViewerAsync-Bw2ffU_4.js} +2 -2
  2. package/lib/esm/{BackofficeJsonViewerAsync-Bn0_Sssa.js.map → BackofficeJsonViewerAsync-Bw2ffU_4.js.map} +1 -1
  3. package/lib/esm/{src-BPX_89p7.js → src-DJ_3P36n.js} +989 -730
  4. package/lib/esm/src-DJ_3P36n.js.map +1 -0
  5. package/lib/esm/style.css +1 -1
  6. package/lib/esm/ui.js +4 -4
  7. package/lib/types/atomic/atoms/button/Button.d.ts +2 -2
  8. package/lib/types/atomic/atoms/button/Button.d.ts.map +1 -1
  9. package/lib/types/backoffice/molecules/confirm_dialog/ConfirmDialog.d.ts +4 -1
  10. package/lib/types/backoffice/molecules/confirm_dialog/ConfirmDialog.d.ts.map +1 -1
  11. package/lib/types/components/feedback/OperationFeedback.css.d.ts +3 -0
  12. package/lib/types/components/feedback/OperationFeedback.css.d.ts.map +1 -0
  13. package/lib/types/components/feedback/OperationFeedback.d.ts +11 -0
  14. package/lib/types/components/feedback/OperationFeedback.d.ts.map +1 -0
  15. package/lib/types/components/infinite/InfiniteScrollTrigger.d.ts +12 -0
  16. package/lib/types/components/infinite/InfiniteScrollTrigger.d.ts.map +1 -0
  17. package/lib/types/components/infinite/infiniteScrollTrigger.css.d.ts +3 -0
  18. package/lib/types/components/infinite/infiniteScrollTrigger.css.d.ts.map +1 -0
  19. package/lib/types/components/media/ImagePreviewModal.d.ts +12 -0
  20. package/lib/types/components/media/ImagePreviewModal.d.ts.map +1 -0
  21. package/lib/types/components/media/imagePreviewModal.css.d.ts +14 -0
  22. package/lib/types/components/media/imagePreviewModal.css.d.ts.map +1 -0
  23. package/lib/types/components/responsive/ResponsiveCollectionRenderer.css.d.ts +4 -0
  24. package/lib/types/components/responsive/ResponsiveCollectionRenderer.css.d.ts.map +1 -0
  25. package/lib/types/components/responsive/ResponsiveCollectionRenderer.d.ts +8 -0
  26. package/lib/types/components/responsive/ResponsiveCollectionRenderer.d.ts.map +1 -0
  27. package/lib/types/components/routing/RouteFallback.d.ts +10 -0
  28. package/lib/types/components/routing/RouteFallback.d.ts.map +1 -0
  29. package/lib/types/components/routing/RoutePendingBar.d.ts +7 -0
  30. package/lib/types/components/routing/RoutePendingBar.d.ts.map +1 -0
  31. package/lib/types/components/routing/routeFallback.css.d.ts +6 -0
  32. package/lib/types/components/routing/routeFallback.css.d.ts.map +1 -0
  33. package/lib/types/components/routing/routePendingBar.css.d.ts +3 -0
  34. package/lib/types/components/routing/routePendingBar.css.d.ts.map +1 -0
  35. package/lib/types/hooks/useStickToBottom.d.ts +12 -0
  36. package/lib/types/hooks/useStickToBottom.d.ts.map +1 -0
  37. package/lib/types/hooks/useSubmitOnEnter.d.ts +7 -0
  38. package/lib/types/hooks/useSubmitOnEnter.d.ts.map +1 -0
  39. package/lib/types/index.d.ts +12 -1
  40. package/lib/types/index.d.ts.map +1 -1
  41. package/lib/types/shared/progress.d.ts +16 -0
  42. package/lib/types/shared/progress.d.ts.map +1 -0
  43. package/lib/types/shared/timeSeries.d.ts +23 -0
  44. package/lib/types/shared/timeSeries.d.ts.map +1 -0
  45. package/package.json +2 -2
  46. package/lib/esm/src-BPX_89p7.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-DJ_3P36n.js","names":[],"sources":["../../src/theme/accessibility.css.ts","../../src/theme/theme.css.ts","../../src/theme/ThemeProvider.tsx","../../src/theme/VisuallyHidden.tsx","../../src/theme/containerQueries.ts","../../src/theme/sprinkles.css.ts","../../src/theme/common.ts","../../src/i18n/locales/en/ui.json","../../src/i18n/locales/fr/ui.json","../../src/i18n/mergeResourceLanguages.ts","../../src/i18n/resources.ts","../../src/atomic/atoms/badge/badge.css.ts","../../src/atomic/atoms/badge/Badge.tsx","../../src/icons/ButtonLoadingSpinnerSvg.tsx","../../src/atomic/atoms/button/button.css.ts","../../src/atomic/atoms/button/Button.tsx","../../src/atomic/atoms/button/LinkButton.tsx","../../src/atomic/atoms/checkbox/checkbox.css.ts","../../src/atomic/atoms/input/input.css.ts","../../src/atomic/atoms/input/Input.tsx","../../src/atomic/atoms/label/label.css.ts","../../src/atomic/atoms/label/Label.tsx","../../src/atomic/atoms/checkbox/Checkbox.tsx","../../src/atomic/atoms/error_message/errorMessage.css.ts","../../src/atomic/atoms/error_message/ErrorMessage.tsx","../../src/atomic/atoms/formatted-date/FormattedDate.tsx","../../src/atomic/atoms/relative-time-text/RelativeTimeText.tsx","../../src/atomic/atoms/icon-button/IconMenuButton.tsx","../../src/icons/ModalCloseSvg.tsx","../../src/atomic/atoms/overlay/overlay.css.ts","../../src/atomic/atoms/overlay/Overlay.tsx","../../src/atomic/atoms/modal/modal.css.ts","../../src/atomic/atoms/modal/Modal.tsx","../../src/atomic/atoms/textarea/textarea.css.ts","../../src/atomic/atoms/textarea/Textarea.tsx","../../src/atomic/molecules/card/Card.css.ts","../../src/atomic/molecules/card/Card.tsx","../../src/icons/SidebarHomeSvg.tsx","../../src/atomic/molecules/breadcrumb_navigation/breadcrumbNavigation.css.ts","../../src/icons/ChevronDownSvg.tsx","../../src/atomic/molecules/dropdown/dropdown.css.ts","../../src/atomic/molecules/dropdown/Dropdown.tsx","../../src/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuPopover.tsx","../../src/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuDropdown.tsx","../../src/atomic/molecules/breadcrumb_navigation/BreadcrumbNavigation.tsx","../../src/atomic/molecules/form-actions/FormActions.tsx","../../src/atomic/molecules/checkbox_field/checkboxField.css.ts","../../src/atomic/molecules/checkbox_field/CheckboxField.tsx","../../src/icons/FormErrorAlertSvg.tsx","../../src/atomic/molecules/form_error/formError.css.ts","../../src/atomic/molecules/form_error/FormError.tsx","../../src/atomic/molecules/form_field/formField.css.ts","../../src/atomic/molecules/form_field/FormField.tsx","../../src/atomic/molecules/form/formStyles.css.ts","../../src/atomic/molecules/form/Form.tsx","../../src/atomic/molecules/form/FormErrorBanner.css.ts","../../src/atomic/molecules/form/FormErrorBanner.tsx","../../src/atomic/molecules/form/FormGroup.tsx","../../src/atomic/molecules/markdown/components/LazyMarkdownCodeBlock.tsx","../../src/atomic/molecules/markdown/LazyMarkdownRenderer.css.ts","../../src/atomic/molecules/markdown/LazyMarkdownRenderer.tsx","../../src/atomic/molecules/markdown/markdownVars.css.ts","../../src/atomic/molecules/empty-state/EmptyState.css.ts","../../src/atomic/molecules/empty-state/EmptyState.tsx","../../src/atomic/molecules/tabs/tabs.css.ts","../../src/atomic/molecules/tabs/Tabs.tsx","../../src/atomic/molecules/toast/toast.css.ts","../../src/atomic/molecules/toast/constants.ts","../../src/atomic/molecules/toast/ToastViewport.tsx","../../src/atomic/molecules/toast/ToastProvider.tsx","../../src/atomic/organisms/login_form/useLoginForm.ts","../../src/atomic/organisms/login_form/loginForm.css.ts","../../src/atomic/organisms/login_form/LoginForm.tsx","../../src/atomic/organisms/sidebar/sidebar.css.ts","../../src/atomic/organisms/sidebar/SidebarContainer.tsx","../../src/icons/ChevronLeftSvg.tsx","../../src/icons/ChevronRightSvg.tsx","../../src/icons/GlobeSvg.tsx","../../src/icons/ProjectsFolderSvg.tsx","../../src/icons/SidebarInitiativesSvg.tsx","../../src/icons/SidebarPlusSvg.tsx","../../src/icons/SidebarSearchSvg.tsx","../../src/icons/SidebarSettingsSvg.tsx","../../src/icons/SidebarTasksSvg.tsx","../../src/icons/SidebarTeamSvg.tsx","../../src/atomic/organisms/sidebar/icons.tsx","../../src/atomic/organisms/sidebar/navigationSidebar.css.ts","../../src/atomic/organisms/sidebar/NavigationSidebar.tsx","../../src/atomic/templates/auth_layout/authLayout.css.ts","../../src/atomic/templates/auth_layout/AuthLayout.tsx","../../src/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.ts","../../src/backoffice/molecules/backoffice_page_header/BackofficePageHeader.tsx","../../src/atomic/templates/page-container/pageContainer.css.ts","../../src/atomic/templates/page-container/PageContainer.tsx","../../src/atomic/templates/detail-page/detailPage.css.ts","../../src/atomic/templates/detail-page/DetailPage.tsx","../../src/components/charts/metricHistoryChart.css.ts","../../src/components/charts/MetricHistoryChart.tsx","../../src/components/charts/timeSeriesLineChart.css.ts","../../src/components/charts/TimeSeriesLineChart.tsx","../../src/components/data-table/DataTable.css.ts","../../src/components/data-table/DataTable.tsx","../../src/components/data-table/ResponsiveRecordList.css.ts","../../src/components/data-table/ResponsiveRecordList.tsx","../../src/components/infinite/infiniteScrollTrigger.css.ts","../../src/components/infinite/InfiniteScrollTrigger.tsx","../../src/components/tile/InfoTile.css.ts","../../src/components/tile/InfoTile.tsx","../../src/components/feedback/OperationFeedback.css.ts","../../src/components/feedback/OperationFeedback.tsx","../../src/components/routing/routeFallback.css.ts","../../src/components/routing/RouteFallback.tsx","../../src/components/routing/routePendingBar.css.ts","../../src/components/routing/RoutePendingBar.tsx","../../src/components/responsive/ResponsiveCollectionRenderer.css.ts","../../src/components/responsive/ResponsiveCollectionRenderer.tsx","../../src/components/data-table/TableCell.css.ts","../../src/components/data-table/TableCellBase.tsx","../../src/components/data-table/TableCell.tsx","../../src/components/layout/PanelShell.tsx","../../src/components/layout/ActionPanel.css.ts","../../src/components/layout/ActionPanel.tsx","../../src/components/layout/AppHeader.css.ts","../../src/components/layout/AppHeader.tsx","../../src/components/layout/ContentLayout.css.ts","../../src/components/layout/ContentLayout.tsx","../../src/components/layout/DetailSummaryHeader.css.ts","../../src/components/layout/DetailSummaryHeader.tsx","../../src/components/layout/PageShell.css.ts","../../src/icons/MenuSvg.tsx","../../src/components/layout/PageShell.tsx","../../src/components/layout/AppShell.tsx","../../src/backoffice/atoms/status_badge/statusBadge.css.ts","../../src/backoffice/atoms/status_badge/StatusBadge.tsx","../../src/components/dashboard/activity_card/ActivityCard.css.ts","../../src/components/dashboard/activity_card/ActivityCard.tsx","../../src/components/dashboard/activity_feed/ActivityFeed.css.ts","../../src/components/dashboard/activity_feed/ActivityFeed.tsx","../../src/components/dashboard/dashboard_grid/DashboardGrid.css.ts","../../src/components/dashboard/dashboard_grid/DashboardGrid.tsx","../../src/components/dashboard/metadata_strip/MetadataStrip.css.ts","../../src/components/dashboard/metadata_strip/MetadataStrip.tsx","../../src/components/dashboard/metric_card/MetricCard.css.ts","../../src/components/dashboard/metric_card/MetricCard.tsx","../../src/components/dashboard/metric_tile_group/MetricTileGroup.css.ts","../../src/components/dashboard/metric_tile_group/MetricTileGroup.tsx","../../src/components/dashboard/page_hero/PageHero.css.ts","../../src/components/dashboard/page_hero/PageHero.tsx","../../src/components/dashboard/segmented_nav/SegmentedNav.css.ts","../../src/components/dashboard/segmented_nav/SegmentedNav.tsx","../../src/components/dashboard/section_nav/SectionNav.css.ts","../../src/components/dashboard/section_nav/SectionNav.tsx","../../src/components/dashboard/selectable_card/SelectableCard.css.ts","../../src/components/dashboard/selectable_card/SelectableCard.tsx","../../src/components/layout/SidebarPageLayout.tsx","../../src/components/layout/SettingsLayout.css.ts","../../src/components/layout/SettingsLayout.tsx","../../src/backoffice/molecules/backoffice_key_value_list/backofficeKeyValueList.css.ts","../../src/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.tsx","../../src/components/dashboard/status_summary_panel/StatusSummaryPanel.css.ts","../../src/components/dashboard/status_summary_panel/StatusSummaryPanel.tsx","../../src/components/dashboard/timeline_event_row/TimelineEventRow.css.ts","../../src/components/dashboard/timeline_event_row/TimelineEventRow.tsx","../../src/components/layout/SplitViewLayout.css.ts","../../src/components/layout/SplitViewLayout.tsx","../../src/components/layout/ToolbarRow.css.ts","../../src/components/layout/ToolbarRow.tsx","../../src/shared/agentText.ts","../../src/components/agent/AgentMarkdownCard.css.ts","../../src/components/agent/AgentMarkdownCard.tsx","../../src/components/select/SimpleSelect.css.ts","../../src/components/select/SimpleSelect.tsx","../../src/components/subscriptions/RefetchNeededBanner.css.ts","../../src/components/subscriptions/RefetchNeededBanner.tsx","../../src/components/layout/TabsContentLayout.css.ts","../../src/components/layout/TabsContentLayout.tsx","../../src/components/media/imagePreviewModal.css.ts","../../src/components/media/ImagePreviewModal.tsx","../../src/components/data-table/VirtualizedConnectionTable.css.ts","../../src/components/data-table/VirtualizedConnectionTable.tsx","../../src/backoffice/shared/copyWithExecCommand.ts","../../src/backoffice/atoms/copyable_text/copyableText.css.ts","../../src/backoffice/atoms/copyable_text/CopyableText.tsx","../../src/backoffice/atoms/backoffice_id_badge/backofficeIdBadge.css.ts","../../src/backoffice/atoms/backoffice_id_badge/BackofficeIdBadge.tsx","../../src/backoffice/atoms/environment_badge/environmentBadge.css.ts","../../src/backoffice/atoms/environment_badge/EnvironmentBadge.tsx","../../src/backoffice/atoms/shortcut_hint/shortcutHint.css.ts","../../src/backoffice/atoms/shortcut_hint/ShortcutHint.tsx","../../src/backoffice/atoms/skeleton/skeleton.css.ts","../../src/backoffice/atoms/skeleton/Skeleton.helpers.ts","../../src/backoffice/atoms/skeleton/Skeleton.tsx","../../src/backoffice/atoms/spinner/spinner.css.ts","../../src/backoffice/atoms/spinner/Spinner.tsx","../../src/backoffice/atoms/tag/tag.css.ts","../../src/backoffice/atoms/tag/Tag.tsx","../../src/backoffice/molecules/backoffice_detail_layout/backofficeDetailLayout.css.ts","../../src/backoffice/molecules/backoffice_detail_layout/BackofficeDetailLayout.tsx","../../src/backoffice/molecules/backoffice_empty_state/backofficeEmptyState.css.ts","../../src/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.tsx","../../src/backoffice/molecules/backoffice_filter_drawer/backofficeFilterDrawer.css.ts","../../src/backoffice/molecules/backoffice_filter_drawer/BackofficeFilterDrawer.tsx","../../src/backoffice/molecules/backoffice_filter_field/backofficeFilterField.css.ts","../../src/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.tsx","../../src/backoffice/molecules/backoffice_filters_bar/backofficeFiltersBar.css.ts","../../src/backoffice/molecules/backoffice_filters_bar/BackofficeFiltersBar.tsx","../../src/backoffice/molecules/backoffice_form_section/backofficeFormSection.css.ts","../../src/backoffice/molecules/backoffice_form_section/BackofficeFormSection.tsx","../../src/backoffice/molecules/confirm_dialog/confirmDialog.css.ts","../../src/backoffice/molecules/confirm_dialog/ConfirmDialog.tsx","../../src/backoffice/molecules/backoffice_json_viewer/backofficeJsonViewer.css.ts","../../src/backoffice/molecules/backoffice_json_viewer/BackofficeJsonViewer.tsx","../../src/backoffice/molecules/backoffice_json_viewer/LazyBackofficeJsonViewer.css.ts","../../src/backoffice/molecules/backoffice_json_viewer/LazyBackofficeJsonViewer.tsx","../../src/backoffice/molecules/backoffice_infinite_list_status/backofficeInfiniteListStatus.css.ts","../../src/backoffice/molecules/backoffice_infinite_list_status/BackofficeInfiniteListStatus.tsx","../../src/backoffice/molecules/backoffice_load_more/backofficeLoadMore.css.ts","../../src/backoffice/molecules/backoffice_load_more/BackofficeLoadMore.tsx","../../src/backoffice/molecules/backoffice_relations_menu/backofficeRelationsMenu.css.ts","../../src/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.tsx","../../src/backoffice/molecules/backoffice_table_skeleton/backofficeTableSkeleton.css.ts","../../src/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.tsx","../../src/backoffice/molecules/backoffice_table_toolbar/backofficeTableToolbar.css.ts","../../src/backoffice/molecules/backoffice_table_toolbar/BackofficeTableToolbar.tsx","../../src/backoffice/molecules/backoffice_tabs/backofficeTabs.css.ts","../../src/backoffice/molecules/backoffice_tabs/BackofficeTabs.tsx","../../src/backoffice/molecules/bulk_actions_bar/bulkActionsBar.css.ts","../../src/backoffice/molecules/bulk_actions_bar/BulkActionsBar.tsx","../../src/backoffice/molecules/filter_chip_row/filterChipRow.css.ts","../../src/backoffice/molecules/filter_chip_row/FilterChipRow.tsx","../../src/backoffice/molecules/global_search_input/globalSearchInput.css.ts","../../src/backoffice/molecules/global_search_input/GlobalSearchInput.tsx","../../src/backoffice/molecules/inline_banner/inlineBanner.css.ts","../../src/backoffice/molecules/inline_banner/InlineBanner.tsx","../../src/backoffice/molecules/sidebar_nav_item/sidebarNavItem.css.ts","../../src/backoffice/molecules/sidebar_nav_item/SidebarNavItem.tsx","../../src/backoffice/molecules/sidebar_nav_section/sidebarNavSection.css.ts","../../src/backoffice/molecules/sidebar_nav_section/SidebarNavSection.tsx","../../src/icons/ProfileDropdownLogoutSvg.tsx","../../src/backoffice/molecules/sidebar_profile_menu/sidebarProfileMenu.css.ts","../../src/backoffice/molecules/sidebar_profile_menu/BackofficeSidebarProfileMenu.tsx","../../src/backoffice/molecules/sidebar_collapse_toggle/sidebarCollapseToggle.css.ts","../../src/backoffice/molecules/sidebar_collapse_toggle/SidebarCollapseToggle.tsx","../../src/backoffice/molecules/table_toolbar/tableToolbar.css.ts","../../src/backoffice/molecules/table_toolbar/TableToolbar.tsx","../../src/backoffice/organisms/audit_timeline/auditTimeline.css.ts","../../src/backoffice/organisms/audit_timeline/AuditTimeline.tsx","../../src/backoffice/organisms/backoffice_data_table/backofficeDataTable.css.ts","../../src/backoffice/organisms/backoffice_data_table/BackofficeDataTable.tsx","../../src/backoffice/organisms/backoffice_virtualized_connection_table/helpers.ts","../../src/backoffice/organisms/backoffice_virtualized_connection_table/BackofficeVirtualizedConnectionTable.tsx","../../src/backoffice/organisms/entity_header/entityHeader.css.ts","../../src/backoffice/organisms/entity_header/EntityHeader.tsx","../../src/backoffice/templates/detail_page_template/detailPageTemplate.css.ts","../../src/backoffice/templates/detail_page_template/DetailPageTemplate.tsx","../../src/backoffice/templates/list_page_template/listPageTemplate.css.ts","../../src/backoffice/templates/list_page_template/ListPageTemplate.tsx","../../src/admin/organisms/admin_sidebar/adminSidebar.css.ts","../../src/admin/organisms/admin_sidebar/AdminSidebar.tsx","../../src/admin/organisms/admin_topbar/adminTopbar.css.ts","../../src/admin/organisms/admin_topbar/AdminTopbar.tsx","../../src/admin/templates/admin_shell_layout/AdminShellLayout.tsx","../../src/admin/theme/adminDensity.css.ts","../../src/admin/theme/adminTheme.css.ts","../../src/admin/theme/AdminThemeProvider.tsx","../../src/shared/agentJobRequestFormatting.ts","../../src/shared/backofficeTableDensity.css.ts","../../src/shared/progress.ts","../../src/shared/timeSeries.ts","../../src/hooks/useStickToBottom.ts","../../src/hooks/useSubmitOnEnter.ts","../../src/pages/WrapperPage.tsx","../../src/icons/BanSvg.tsx","../../src/icons/ChatSizeLargeSvg.tsx","../../src/icons/ChatSizeMediumSvg.tsx","../../src/icons/ChatSizeSmallSvg.tsx","../../src/icons/ChatCheckSvg.tsx","../../src/icons/ChatXSvg.tsx","../../src/icons/CheckSvg.tsx","../../src/icons/CoinOffSvg.tsx","../../src/icons/ClockSvg.tsx","../../src/icons/DatabaseCheckSvg.tsx","../../src/icons/DatabaseXSvg.tsx","../../src/icons/DevModeSvg.tsx","../../src/icons/EyeSvg.tsx","../../src/icons/GripDotsSvg.tsx","../../src/icons/HomeActivityAssignUserSvg.tsx","../../src/icons/HomeStatsCheckBadgeSvg.tsx","../../src/icons/HomeStatsClipboardSvg.tsx","../../src/icons/HomeStatsClockSvg.tsx","../../src/icons/KeyOffSvg.tsx","../../src/icons/KeySvg.tsx","../../src/icons/LinkCheckSvg.tsx","../../src/icons/LinkXSvg.tsx","../../src/icons/backoffice/createBackofficeSidebarIcon.tsx","../../src/icons/backoffice/BackofficeSidebarActivitySvg.tsx","../../src/icons/backoffice/BackofficeSidebarArchiveSvg.tsx","../../src/icons/backoffice/BackofficeSidebarBadgeCheckSvg.tsx","../../src/icons/backoffice/BackofficeSidebarBotSvg.tsx","../../src/icons/backoffice/BackofficeSidebarBracesSvg.tsx","../../src/icons/backoffice/BackofficeSidebarBrainCircuitSvg.tsx","../../src/icons/backoffice/BackofficeSidebarBriefcaseSvg.tsx","../../src/icons/backoffice/BackofficeSidebarBuildingSvg.tsx","../../src/icons/backoffice/BackofficeSidebarCableSvg.tsx","../../src/icons/backoffice/BackofficeSidebarCalendarSvg.tsx","../../src/icons/backoffice/BackofficeSidebarChartBarSvg.tsx","../../src/icons/backoffice/BackofficeSidebarChartLineSvg.tsx","../../src/icons/backoffice/BackofficeSidebarChartPieSvg.tsx","../../src/icons/backoffice/BackofficeSidebarClipboardCheckSvg.tsx","../../src/icons/backoffice/BackofficeSidebarClipboardListSvg.tsx","../../src/icons/backoffice/BackofficeSidebarClockSvg.tsx","../../src/icons/backoffice/BackofficeSidebarCodeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarCopyCheckSvg.tsx","../../src/icons/backoffice/BackofficeSidebarCopySvg.tsx","../../src/icons/backoffice/BackofficeSidebarCopyXSvg.tsx","../../src/icons/backoffice/BackofficeSidebarCrosshairSvg.tsx","../../src/icons/backoffice/BackofficeSidebarDatabaseSvg.tsx","../../src/icons/backoffice/BackofficeSidebarDiffSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFileCodeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFileCogSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFileSearchSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFileStackSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFileTextSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFilesSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFingerprintSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFlameSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFolderGitSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFolderKanbanSvg.tsx","../../src/icons/backoffice/BackofficeSidebarFolderTreeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGaugeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGitBranchPlusSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGitBranchSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGitCommitSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGitCompareSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGitForkSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGitMergeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGitPullRequestSvg.tsx","../../src/icons/backoffice/BackofficeSidebarGlobeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarHistorySvg.tsx","../../src/icons/backoffice/BackofficeSidebarInfoSvg.tsx","../../src/icons/backoffice/BackofficeSidebarKeySquareSvg.tsx","../../src/icons/backoffice/BackofficeSidebarKeySvg.tsx","../../src/icons/backoffice/BackofficeSidebarLandmarkSvg.tsx","../../src/icons/backoffice/BackofficeSidebarLayoutDashboardSvg.tsx","../../src/icons/backoffice/BackofficeSidebarLinkSvg.tsx","../../src/icons/backoffice/BackofficeSidebarListChecksSvg.tsx","../../src/icons/backoffice/BackofficeSidebarListTodoSvg.tsx","../../src/icons/backoffice/BackofficeSidebarListTreeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarLocateSvg.tsx","../../src/icons/backoffice/BackofficeSidebarLockKeyholeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarLockSvg.tsx","../../src/icons/backoffice/BackofficeSidebarMailPlusSvg.tsx","../../src/icons/backoffice/BackofficeSidebarMapPinSvg.tsx","../../src/icons/backoffice/BackofficeSidebarMapSvg.tsx","../../src/icons/backoffice/BackofficeSidebarMessagePlusSvg.tsx","../../src/icons/backoffice/BackofficeSidebarMessageTextSvg.tsx","../../src/icons/backoffice/BackofficeSidebarMessagesSvg.tsx","../../src/icons/backoffice/BackofficeSidebarMonitorCheckSvg.tsx","../../src/icons/backoffice/BackofficeSidebarMouseClickSvg.tsx","../../src/icons/backoffice/BackofficeSidebarNetworkSvg.tsx","../../src/icons/backoffice/BackofficeSidebarPanelsSvg.tsx","../../src/icons/backoffice/BackofficeSidebarPenToolSvg.tsx","../../src/icons/backoffice/BackofficeSidebarPinSvg.tsx","../../src/icons/backoffice/BackofficeSidebarPlayCircleSvg.tsx","../../src/icons/backoffice/BackofficeSidebarRadarSvg.tsx","../../src/icons/backoffice/BackofficeSidebarReceiptSvg.tsx","../../src/icons/backoffice/BackofficeSidebarRocketSvg.tsx","../../src/icons/backoffice/BackofficeSidebarRouteSvg.tsx","../../src/icons/backoffice/BackofficeSidebarScrollTextSvg.tsx","../../src/icons/backoffice/BackofficeSidebarSearchCodeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarSearchSvg.tsx","../../src/icons/backoffice/BackofficeSidebarSendSvg.tsx","../../src/icons/backoffice/BackofficeSidebarShieldAlertSvg.tsx","../../src/icons/backoffice/BackofficeSidebarShieldCheckSvg.tsx","../../src/icons/backoffice/BackofficeSidebarShieldUserSvg.tsx","../../src/icons/backoffice/BackofficeSidebarStepForwardSvg.tsx","../../src/icons/backoffice/BackofficeSidebarStethoscopeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarTerminalSquareSvg.tsx","../../src/icons/backoffice/BackofficeSidebarTestTubeSvg.tsx","../../src/icons/backoffice/BackofficeSidebarTrashSvg.tsx","../../src/icons/backoffice/BackofficeSidebarUploadCloudSvg.tsx","../../src/icons/backoffice/BackofficeSidebarUserCheckSvg.tsx","../../src/icons/backoffice/BackofficeSidebarUserCogSvg.tsx","../../src/icons/backoffice/BackofficeSidebarUserSearchSvg.tsx","../../src/icons/backoffice/BackofficeSidebarUserSvg.tsx","../../src/icons/backoffice/BackofficeSidebarUsersSvg.tsx","../../src/icons/backoffice/BackofficeSidebarWalletSvg.tsx","../../src/icons/backoffice/BackofficeSidebarWandSvg.tsx","../../src/icons/backoffice/BackofficeSidebarWorkflowSvg.tsx","../../src/icons/backoffice/BackofficeSidebarWrenchSvg.tsx","../../src/icons/LockOpenSvg.tsx","../../src/icons/LockSvg.tsx","../../src/icons/MailCheckSvg.tsx","../../src/icons/MailXSvg.tsx","../../src/icons/PencilSvg.tsx","../../src/icons/PinFilledSvg.tsx","../../src/icons/PinSvg.tsx","../../src/icons/ProfileDropdownOrganizationSvg.tsx","../../src/icons/RobotCheckSvg.tsx","../../src/icons/RobotSvg.tsx","../../src/icons/RobotXSvg.tsx","../../src/icons/RocketOffSvg.tsx","../../src/icons/RocketSvg.tsx","../../src/icons/SendCheckSvg.tsx","../../src/icons/SendMessageSvg.tsx","../../src/icons/SendXSvg.tsx","../../src/icons/SettingsCheckSvg.tsx","../../src/icons/SettingsXSvg.tsx","../../src/icons/ShieldLockSvg.tsx","../../src/icons/ShieldOffSvg.tsx","../../src/icons/TaskAttachmentSvg.tsx","../../src/icons/TaskCommentBubbleSvg.tsx","../../src/icons/TaskDependencyBlockedSvg.tsx","../../src/icons/TaskDependencyReadySvg.tsx","../../src/icons/WrenchSvg.tsx","../../src/icons/XBadgeSvg.tsx","../../src/svg/ChevronDownIcon.tsx"],"sourcesContent":["import { keyframes, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from './sprinkles.css.js';\n\nexport const visuallyHidden = sprinkles({\n borderWidth: 0,\n borderStyle: 'none',\n clip: 'hidden',\n height: 'px',\n margin: '-px',\n overflow: 'hidden',\n padding: 0,\n position: 'absolute',\n width: 'px',\n});\n\nexport const spinAnimation = keyframes({\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' },\n});\n\nexport const spin = style({\n animation: `${spinAnimation} 1s linear infinite`,\n});\n","import { createGlobalTheme } from '@vanilla-extract/css';\n\nimport { lightThemeClass, lightThemeValues } from './theme-light.css.js';\nimport { darkThemeClass } from './theme-dark.css.js';\nimport { vars } from './themeContract.js';\n\ncreateGlobalTheme(':root', vars, lightThemeValues);\n\nexport { darkThemeClass, lightThemeClass, lightThemeValues };\n","import {\n type JSX,\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport './accessibility.css.js';\nimport './global.css.js';\nimport { darkThemeClass, lightThemeClass } from './theme.css.js';\n\nexport type ThemeMode = 'system' | 'light' | 'dark';\nexport type ResolvedTheme = 'light' | 'dark';\n\ntype ThemeContextValue = {\n mode: ThemeMode;\n resolvedTheme: ResolvedTheme;\n setMode: (mode: ThemeMode) => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nexport const THEME_MODE_KEY = 'plumile-theme-mode';\n\ntype ThemeProviderProps = {\n children: ReactNode;\n defaultMode?: ThemeMode;\n};\n\nconst getSystemTheme = (): ResolvedTheme => {\n if (\n typeof window === 'undefined' ||\n typeof window.matchMedia !== 'function'\n ) {\n return 'light';\n }\n\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n};\n\nconst resolveTheme = (\n mode: ThemeMode,\n systemTheme: ResolvedTheme,\n): ResolvedTheme => {\n if (mode === 'system') {\n return systemTheme;\n }\n\n return mode;\n};\n\nconst readStoredMode = (defaultMode: ThemeMode): ThemeMode => {\n if (typeof window === 'undefined') {\n return defaultMode;\n }\n\n const savedMode = window.localStorage.getItem(THEME_MODE_KEY);\n\n if (savedMode === 'system' || savedMode === 'light' || savedMode === 'dark') {\n return savedMode;\n }\n\n return defaultMode;\n};\n\nexport const ThemeProvider = ({\n children,\n defaultMode = 'system',\n}: ThemeProviderProps): JSX.Element => {\n const [mode, setMode] = useState<ThemeMode>(() => {\n return readStoredMode(defaultMode);\n });\n const [systemTheme, setSystemTheme] = useState<ResolvedTheme>(() => {\n return getSystemTheme();\n });\n const resolvedTheme = resolveTheme(mode, systemTheme);\n\n useEffect(() => {\n if (\n mode === 'system' &&\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const updateSystemTheme = (\n event?: MediaQueryList | MediaQueryListEvent,\n ): void => {\n const matchesDarkTheme = event?.matches ?? mediaQuery.matches;\n\n if (matchesDarkTheme) {\n setSystemTheme('dark');\n return;\n }\n\n setSystemTheme('light');\n };\n\n updateSystemTheme(mediaQuery);\n mediaQuery.addEventListener('change', updateSystemTheme);\n\n return () => {\n mediaQuery.removeEventListener('change', updateSystemTheme);\n };\n }\n\n return undefined;\n }, [mode]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n window.localStorage.setItem(THEME_MODE_KEY, mode);\n return undefined;\n }, [mode]);\n\n useEffect(() => {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const root = document.documentElement;\n let themeClass = lightThemeClass;\n\n if (resolvedTheme === 'dark') {\n themeClass = darkThemeClass;\n }\n\n root.classList.remove(lightThemeClass, darkThemeClass);\n root.classList.add(themeClass);\n\n return () => {\n root.classList.remove(lightThemeClass, darkThemeClass);\n };\n }, [resolvedTheme]);\n\n const value = useMemo(() => {\n return {\n mode,\n resolvedTheme,\n setMode,\n };\n }, [mode, resolvedTheme]);\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n\n if (context == null) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n\n return context;\n};\n\nexport const __test = {\n getSystemTheme,\n resolveTheme,\n readStoredMode,\n} as const;\n","import { type ComponentPropsWithoutRef, type JSX } from 'react';\n\nimport { visuallyHidden } from './accessibility.css.js';\nimport { cx } from './tools.js';\n\ntype Props = ComponentPropsWithoutRef<'span'>;\n\n/**\n * Accessible helper that keeps the content available to assistive tech\n * while removing it from the visual flow.\n */\nexport const VisuallyHidden = ({ className, ...rest }: Props): JSX.Element => {\n return <span {...rest} className={cx(visuallyHidden, className)} />;\n};\n","export const containerQueries = {\n '3xs': '(min-width: 360px)',\n '2xs': '(min-width: 480px)',\n xs: '(min-width: 640px)',\n sm: '(min-width: 768px)',\n md: '(min-width: 1024px)',\n lg: '(min-width: 1280px)',\n xl: '(min-width: 1440px)',\n xxl: '(min-width: 1680px)',\n} as const;\n\nexport type ContainerQueryKey = keyof typeof containerQueries;\n","import { defineProperties, createSprinkles } from '@vanilla-extract/sprinkles';\nimport { vars } from './themeContract.js';\nimport { screens, spacing } from './common.js';\n\nconst NONE = 'none' as const;\nconst FLEX_START = 'flex-start' as const;\nconst FLEX_END = 'flex-end' as const;\nconst CENTER = 'center' as const;\nconst STRETCH = 'stretch' as const;\nconst BASELINE = 'baseline' as const;\n\nconst otherProperties = defineProperties({\n properties: {\n all: ['inherit', 'initial', 'revert', 'revert-layer', 'unset'],\n appearance: ['auto', 'none'],\n cursor: [\n 'alias',\n 'all-scroll',\n 'auto',\n 'cell',\n 'col-resize',\n 'context-menu',\n 'copy',\n 'crosshair',\n 'default',\n 'e-resize',\n 'ew-resize',\n 'grab',\n 'grabbing',\n 'help',\n 'move',\n 'n-resize',\n 'ne-resize',\n 'nesw-resize',\n 'no-drop',\n 'none',\n 'not-allowed',\n 'ns-resize',\n 'nw-resize',\n 'nwse-resize',\n 'pointer',\n 'progress',\n 'row-resize',\n 's-resize',\n 'se-resize',\n 'sw-resize',\n 'text',\n 'vertical-text',\n 'w-resize',\n 'wait',\n 'zoom-in',\n 'zoom-out',\n ],\n animation: vars.animation,\n arrows: {\n hidden: {\n WebkitAppearance: 'none',\n MozAppearance: 'textfield',\n '&::-webkit-inner-spin-button, &::-webkit-outer-spin-button': {\n WebkitAppearance: 'none',\n margin: 0,\n },\n },\n },\n backgroundSize: {\n auto: 'auto',\n contain: 'contain',\n cover: 'cover',\n skeleton: '300% 100%',\n },\n border: {\n none: 'none',\n spinner: `2px solid color-mix(in srgb, ${vars.colors.white} 30%, transparent)`,\n },\n clip: {\n hidden: 'rect(0 0 0 0)',\n },\n containerType: ['inline-size', 'normal', 'size'],\n fontStyle: ['normal', 'italic'],\n font: ['inherit'],\n objectPosition: vars.objectPosition,\n objectFit: ['contain', 'cover', 'fill', 'none', 'scale-down'],\n order: vars.order,\n placeHolder: {\n italic: {\n '::placeholder': {\n fontStyle: 'italic',\n // color: vars.colors['slate-400'],\n fontWeight: vars.fontWeight.light,\n },\n },\n },\n\n pointerEvents: ['none', 'auto'],\n msOverflowStyle: ['auto', 'none'],\n rotate: vars.rotate,\n scrollBar: {\n light: {\n '&::-webkit-scrollbar': {\n background: 'transparent',\n width: spacing[1.5],\n },\n '&::-webkit-scrollbar-thumb': {\n background: 'white',\n borderRadius: spacing[1.5],\n },\n },\n hidden: {\n '&::-webkit-scrollbar': {\n WebkitAppearance: 'none',\n display: 'none',\n },\n MsOverflowStyle: 'none',\n scrollbarWidth: 'none',\n },\n },\n scrollbarColor: {\n auto: 'auto',\n border: `${vars.colors.border} transparent`,\n borderLight: `${vars.colors.borderLight} transparent`,\n },\n scrollbarWidth: ['auto', 'none', 'thin'],\n skew: vars.skew,\n textDecoration: ['none', 'line-through', 'underline'],\n textDecorationThickness: vars.textDecorationThickness,\n textIndent: vars.spacing,\n textTransform: ['uppercase', 'lowercase', 'capitalize'],\n textUnderlineOffset: vars.textUnderlineOffset,\n transform: vars.transform,\n transformOrigin: {\n topLeft: 'top left',\n },\n transitionDelay: vars.transitionDelay,\n transitionDuration: vars.transitionDuration,\n transitionProperty: vars.transitionProperty,\n transitionTimingFunction: vars.transitionTimingFunction,\n verticalAlign: ['baseline', 'middle', 'sub', 'super', 'top'],\n willChange: ['background-position', 'transform'],\n zIndex: vars.zIndex,\n },\n});\n\nconst responsiveProperties = defineProperties({\n conditions: {\n base: {},\n sm: { '@media': screens.sm },\n md: { '@media': screens.md },\n lg: { '@media': screens.lg },\n xl: { '@media': screens.xl },\n xxl: { '@media': screens.xxl },\n max900: { '@media': 'screen and (max-width: 900px)' },\n max1023: { '@media': 'screen and (max-width: 1023px)' },\n min1200: { '@media': 'screen and (min-width: 1200px)' },\n },\n defaultCondition: 'base',\n properties: {\n /**\n * The order of fontSize in this file has an impact on CSS rule priority\n */\n fontSize: {\n '3xs': {\n fontSize: vars.fontSize['3xs'],\n lineHeight: vars.lineHeight['3xs'],\n },\n '2xs': {\n fontSize: vars.fontSize['2xs'],\n lineHeight: vars.lineHeight['2xs'],\n },\n xs: {\n fontSize: vars.fontSize.xs,\n lineHeight: vars.lineHeight.xs,\n },\n sm: {\n fontSize: vars.fontSize.sm,\n lineHeight: vars.lineHeight.sm,\n },\n base: {\n fontSize: vars.fontSize.base,\n lineHeight: vars.lineHeight.base,\n },\n lg: {\n fontSize: vars.fontSize.lg,\n lineHeight: vars.lineHeight.lg,\n },\n xl: {\n fontSize: vars.fontSize.xl,\n lineHeight: vars.lineHeight.xl,\n },\n '2xl': {\n fontSize: vars.fontSize['2xl'],\n lineHeight: vars.lineHeight['2xl'],\n },\n '3xl': {\n fontSize: vars.fontSize['3xl'],\n lineHeight: vars.lineHeight['3xl'],\n },\n '4xl': {\n fontSize: vars.fontSize['4xl'],\n },\n '5xl': {\n fontSize: vars.fontSize['5xl'],\n lineHeight: vars.lineHeight['5xl'],\n },\n '6xl': {\n fontSize: vars.fontSize['6xl'],\n lineHeight: vars.lineHeight['6xl'],\n },\n '7xl': {\n fontSize: vars.fontSize['7xl'],\n lineHeight: vars.lineHeight['7xl'],\n },\n '8xl': {\n fontSize: vars.fontSize['8xl'],\n lineHeight: vars.lineHeight['8xl'],\n },\n '9xl': {\n fontSize: vars.fontSize['9xl'],\n lineHeight: vars.lineHeight['9xl'],\n },\n responsive: {\n fontSize: vars.fontSize.responsive,\n lineHeight: vars.lineHeight.responsive,\n },\n },\n alignItems: [STRETCH, FLEX_START, CENTER, FLEX_END, BASELINE],\n alignSelf: ['auto', FLEX_START, CENTER, FLEX_END, STRETCH],\n borderColor: vars.colors,\n borderWidth: vars.borderWidth,\n borderStyle: [NONE, 'dashed', 'solid'],\n borderRadius: vars.borderRadius,\n borderTop: [NONE],\n borderRight: [NONE],\n borderBottom: [NONE],\n borderLeft: [NONE],\n borderTopColor: vars.colors,\n borderRightColor: vars.colors,\n borderBottomColor: vars.colors,\n borderLeftColor: vars.colors,\n borderTopWidth: vars.borderWidth,\n borderRightWidth: vars.borderWidth,\n borderBottomWidth: vars.borderWidth,\n borderLeftWidth: vars.borderWidth,\n borderTopRightRadius: vars.borderRadius,\n borderTopLeftRadius: vars.borderRadius,\n borderBottomRightRadius: vars.borderRadius,\n borderBottomLeftRadius: vars.borderRadius,\n borderSpacing: vars.borderSpacing,\n borderCollapse: ['collapse', 'separate'],\n bottom: vars.spacing,\n boxShadow: vars.boxShadow,\n columnGap: vars.spacing,\n display: [\n 'none',\n 'block',\n 'contents',\n 'flex',\n 'grid',\n 'inline',\n 'inline-flex',\n 'inline-block',\n 'table',\n 'table-cell',\n 'table-header-group',\n 'table-row',\n 'table-row-group',\n ],\n dropShadow: vars.dropShadow,\n flex: vars.flex,\n flexBasis: vars.flexBasis,\n flexDirection: ['row', 'column', 'row-reverse'],\n flexGrow: vars.flexGrow,\n flexShrink: vars.flexShrink,\n flexWrap: ['nowrap', 'wrap', 'wrap-reverse'],\n fontVariantNumeric: {\n 'tabular-nums': 'tabular-nums',\n },\n fontFamily: vars.fontFamily,\n fontWeight: vars.fontWeight,\n gap: vars.spacing,\n gridAutoColumns: vars.gridAutoColumns,\n gridAutoRows: vars.gridAutoRows,\n gridColumn: vars.gridColumn,\n gridColumnEnd: vars.gridColumnEnd,\n gridColumnStart: vars.gridColumnStart,\n gridRow: vars.gridRow,\n gridRowEnd: vars.gridRowEnd,\n gridRowStart: vars.gridRowStart,\n gridTemplateColumns: vars.gridTemplateColumns,\n gridTemplateRows: vars.gridTemplateRows,\n height: vars.height,\n hueRotate: vars.hueRotate,\n inset: vars.inset,\n invert: vars.invert,\n justifyContent: [\n 'center',\n 'flex-end',\n 'flex-start',\n 'space-between',\n 'stretch',\n 'space-around',\n ],\n left: vars.left,\n letterSpacing: vars.letterSpacing,\n wordSpacing: vars.wordSpacing,\n lineHeight: vars.lineHeight,\n listStyleType: vars.listStyleType,\n margin: vars.margin,\n marginBottom: vars.spacing,\n marginLeft: vars.spacing,\n marginRight: vars.spacing,\n marginTop: vars.spacing,\n maxHeight: vars.maxHeight,\n maxWidth: vars.maxWidth,\n minHeight: vars.minHeight,\n minWidth: { ...vars.minWidth, ...vars.width },\n outline: ['none'],\n outlineOffset: vars.outlineOffset,\n outlineWidth: vars.outlineWidth,\n overflow: ['auto', 'hidden', 'scroll', 'visible'],\n overflowWrap: ['anywhere', 'break-word'],\n overflowY: ['auto', 'hidden', 'scroll'],\n overflowX: ['auto', 'hidden', 'scroll', 'visible'],\n padding: vars.spacing,\n paddingBottom: vars.spacing,\n paddingBlock: vars.spacing,\n paddingInline: vars.spacing,\n paddingLeft: vars.spacing,\n paddingRight: vars.spacing,\n paddingTop: vars.spacing,\n position: ['absolute', 'relative', 'fixed', 'sticky', 'static'],\n right: vars.spacing,\n rowGap: vars.spacing,\n scale: vars.scale,\n scrollbarGutter: ['auto', 'stable', 'stable both-edges'],\n scrollMargin: vars.spacing,\n scrollMarginTop: vars.spacing,\n scrollPadding: vars.spacing,\n strokeWidth: vars.strokeWidth,\n textAlign: ['left', 'center', 'end'],\n textOverflow: ['ellipsis', 'clip'],\n top: vars.top,\n userSelect: {\n none: {\n userSelect: 'none',\n '-webkit-user-select': 'none',\n },\n },\n visibility: ['hidden', 'visible'],\n width: vars.width,\n wordBreak: ['break-word', 'break-all'],\n zIndex: vars.zIndex,\n whiteSpace: ['nowrap', 'normal', 'pre', 'pre-wrap'],\n resize: ['none', 'both', 'horizontal', 'vertical'],\n backgroundImage: vars.backgroundImage,\n },\n shorthands: {\n marginX: ['marginLeft', 'marginRight'],\n marginY: ['marginTop', 'marginBottom'],\n padding: ['paddingTop', 'paddingBottom', 'paddingLeft', 'paddingRight'],\n paddingX: ['paddingLeft', 'paddingRight'],\n paddingY: ['paddingTop', 'paddingBottom'],\n },\n});\n\nconst colorModeProperties = defineProperties({\n conditions: {\n lightMode: {},\n darkMode: { '@media': '(prefers-color-scheme: dark)' },\n },\n defaultCondition: 'lightMode',\n properties: {\n backgroundColor: vars.colors,\n background: {\n gradient:\n 'linear-gradient(to right, rgba(0, 127, 87, 1), rgba(5, 99, 116, 1));',\n ellipseGradient:\n 'radial-gradient(ellipse at top left, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.0653), rgba(255, 255, 255, 0));',\n linearGradient:\n 'linear-gradient(to right, rgba(0, 127, 87, 1), rgba(0, 126, 144, 1));',\n verticalLinearGradient: 'linear-gradient(white, #F1F5F9);',\n },\n color: vars.colors,\n grayscale: vars.grayscale,\n opacity: vars.opacity,\n outlineColor: vars.colors,\n sepia: vars.sepia,\n stroke: vars.stroke,\n textColor: vars.colors,\n textTransform: ['uppercase', 'lowercase', 'capitalize', 'none'],\n textDecorationColor: vars.colors,\n textOpacity: vars.opacity,\n },\n});\n\nexport const sprinkles = createSprinkles(\n colorModeProperties,\n otherProperties,\n responsiveProperties,\n);\n\nconst stateProperties = defineProperties({\n conditions: {\n hover: {\n selector: '&:hover',\n },\n focusVisible: {\n selector: '&:focus-visible',\n },\n disabled: {\n selector: '&:disabled',\n },\n },\n defaultCondition: false,\n properties: {\n backgroundColor: vars.colors,\n borderColor: vars.colors,\n boxShadow: vars.boxShadow,\n color: vars.colors,\n cursor: [\n 'alias',\n 'all-scroll',\n 'auto',\n 'cell',\n 'col-resize',\n 'context-menu',\n 'copy',\n 'crosshair',\n 'default',\n 'e-resize',\n 'ew-resize',\n 'grab',\n 'grabbing',\n 'help',\n 'move',\n 'n-resize',\n 'ne-resize',\n 'nesw-resize',\n 'no-drop',\n 'none',\n 'not-allowed',\n 'ns-resize',\n 'nw-resize',\n 'nwse-resize',\n 'pointer',\n 'progress',\n 'row-resize',\n 's-resize',\n 'se-resize',\n 'sw-resize',\n 'text',\n 'vertical-text',\n 'w-resize',\n 'wait',\n 'zoom-in',\n 'zoom-out',\n ],\n opacity: vars.opacity,\n },\n});\n\nconst hoverProperties = defineProperties({\n conditions: {\n default: {},\n hover: {\n selector: '&:hover',\n },\n },\n defaultCondition: 'default',\n properties: {\n backgroundColor: vars.colors,\n color: vars.colors,\n transform: vars.transform,\n textDecoration: ['underline'],\n },\n});\n\nconst firstChildProperties = defineProperties({\n conditions: {\n default: {},\n firstChild: {\n selector: '&:first-child',\n },\n },\n defaultCondition: 'default',\n properties: {\n borderTopLeftRadius: vars.borderRadius,\n borderTopRightRadius: vars.borderRadius,\n },\n});\n\nexport const hoverSprinkles = createSprinkles(hoverProperties);\nexport const firstChildSprinkles = createSprinkles(firstChildProperties);\nexport const stateSprinkles = createSprinkles(stateProperties);\n","export const spacing = {\n auto: 'auto',\n full: '100%',\n px: '1px',\n '-px': '-1px',\n '-108': '-30rem',\n '-102': '-26rem',\n '-96': '-24rem',\n '-88': '-22rem',\n '-80': '-20rem',\n '-72': '-18rem',\n '-64': '-16rem',\n '-60': '-15rem',\n '-56': '-14rem',\n '-52': '-13rem',\n '-48': '-12rem',\n '-44': '-11rem',\n '-40': '-10rem',\n '-36': '-9rem',\n '-34': '-8.5rem',\n '-32': '-8rem',\n '-30': '-7.5rem',\n '-28': '-7rem',\n '-24': '-6rem',\n '-20': '-5rem',\n '-19': '-4.75rem',\n '-17.5': '-4.375rem',\n '-16': '-4rem',\n '-15': '-3.75rem',\n '-14': '-3.5rem',\n '-13': '-3.125rem',\n '-12': '-3rem',\n '-11': '-2.75rem',\n '-10': '-2.5rem',\n '-9': '-2.25rem',\n '-8': '-2rem',\n '-7': '-1.75rem',\n '-6': '-1.5rem',\n '-5': '-1.25rem',\n '-4': '-1rem',\n '-3.5': '-0.875rem',\n '-3': '-0.75rem',\n '-2.5': '-0.625rem',\n '-2': '-0.5rem',\n '-1.5': '-0.375rem',\n '-1': '-0.25rem',\n '-0.5': '-0.125rem',\n 0: '0px',\n 0.5: '0.125rem',\n 1: '0.25rem',\n 1.5: '0.375rem',\n 2: '0.5rem',\n 2.5: '0.625rem',\n 3: '0.75rem',\n 3.5: '0.875rem',\n 4: '1rem',\n 5: '1.25rem',\n 6: '1.5rem',\n 7: '1.75rem',\n 8: '2rem',\n 9: '2.25rem',\n 10: '2.5rem',\n 11: '2.75rem',\n 12: '3rem',\n 13: '3.25rem',\n 14: '3.5rem',\n 15: '3.75rem',\n 16: '4rem',\n 17.5: '4.375rem',\n 18: '4.5rem',\n 18.5: '4.625rem',\n 19: '4.75rem',\n 20: '5rem',\n 24: '6rem',\n 28: '7rem',\n 30: '7.5rem',\n 32: '8rem',\n 34: '8.5rem',\n 36: '9rem',\n 40: '10rem',\n 44: '11rem',\n 48: '12rem',\n 52: '13rem',\n 56: '14rem',\n 60: '15rem',\n 64: '16rem',\n 72: '18rem',\n 80: '20rem',\n 88: '22rem',\n 96: '24rem',\n 102: '26rem',\n 108: '30rem',\n 112: '32rem',\n 120: '33.75rem',\n};\n\nexport const opacity = {\n 0: '0',\n 5: '0.05',\n 10: '0.1',\n 20: '0.2',\n 25: '0.25',\n 30: '0.3',\n 35: '0.35',\n 40: '0.4',\n 50: '0.5',\n 60: '0.6',\n 70: '0.7',\n 75: '0.75',\n 80: '0.8',\n 90: '0.9',\n 95: '0.95',\n 100: '1',\n};\n\nexport const screens = {\n sm: 'screen and (max-width: 640px)',\n md: 'screen and (max-width: 768px)',\n lg: 'screen and (max-width: 1024px)',\n xl: 'screen and (max-width: 1280px)',\n xxl: 'screen and (max-width: 1536px)',\n};\n","{\n \"auth\": {\n \"loginForm\": {\n \"actions\": {\n \"submit\": \"Sign in\"\n },\n \"errors\": {\n \"emailRequired\": \"Enter an email address.\",\n \"locked\": \"Too many attempts. Try again later.\",\n \"lockedWithTime\": \"Too many attempts. Try again at {{time}}.\",\n \"loginFailed\": \"Sign in failed. Please try again.\",\n \"passwordMinLength\": \"Password must be at least {{minLength}} characters.\",\n \"passwordRequired\": \"Enter a password.\"\n },\n \"labels\": {\n \"email\": \"Email\",\n \"password\": \"Password\"\n },\n \"placeholders\": {\n \"email\": \"you@company.com\",\n \"password\": \"Enter your password\"\n }\n }\n },\n \"backoffice\": {\n \"bulkActions\": {\n \"clear\": \"Clear\",\n \"selected_one\": \"{{count}} selected\",\n \"selected_other\": \"{{count}} selected\"\n },\n \"copyableText\": {\n \"copied\": \"Copied\",\n \"copy\": \"Copy\"\n },\n \"dataTable\": {\n \"label\": \"Data table\",\n \"selectAll\": \"Select all rows\",\n \"selectRow\": \"Select row {{index}}\"\n },\n \"filterChips\": {\n \"clearAll\": \"Clear all\",\n \"remove\": \"Remove filter\"\n },\n \"filterDrawer\": {\n \"closeAriaLabel\": \"Close filters\",\n \"empty\": \"No filters match this search.\",\n \"reset\": \"Reset all\",\n \"searchAriaLabel\": \"Search filters\",\n \"searchPlaceholder\": \"Search filters\",\n \"subtitle_one\": \"{{count}} filter\",\n \"subtitle_other\": \"{{count}} filters\",\n \"title\": \"All filters\"\n },\n \"globalSearch\": {\n \"clear\": \"Clear search\",\n \"placeholder\": \"Search…\"\n },\n \"idBadge\": {\n \"copy\": \"Copy ID\"\n },\n \"inlineBanner\": {\n \"dismiss\": \"Dismiss\"\n },\n \"jsonViewer\": {\n \"collapse\": \"Collapse\",\n \"copied\": \"Copied\",\n \"copy\": \"Copy\",\n \"expand\": \"Expand\",\n \"serializationError\": \"Failed to serialize JSON\",\n \"title\": \"Raw JSON\"\n },\n \"loadMore\": {\n \"end\": \"End of results\",\n \"loading\": \"Loading more…\",\n \"moreAvailable\": \"More results available\"\n },\n \"relationsMenu\": {\n \"label\": \"Relations\"\n },\n \"tabs\": {\n \"label\": \"Tabs\"\n },\n \"tag\": {\n \"remove\": \"Remove\"\n }\n },\n \"common\": {\n \"actions\": {\n \"cancel\": \"Cancel\",\n \"close\": \"Close\",\n \"confirm\": \"Confirm\",\n \"save\": \"Save\",\n \"saving\": \"Saving...\"\n },\n \"errors\": {\n \"unexpected\": \"An unexpected error occurred.\"\n },\n \"loading\": \"Loading...\",\n \"menu\": {\n \"open\": \"Open menu\"\n },\n \"notAvailable\": \"N/A\",\n \"select\": {\n \"placeholder\": \"Select an option\"\n },\n \"table\": {\n \"empty\": \"No entries found.\",\n \"label\": \"Data table\"\n }\n },\n \"layout\": {\n \"pageShell\": {\n \"resizeSidePanel\": \"Resize side panel\"\n }\n },\n \"markdown\": {\n \"code\": {\n \"copied\": \"Copied\",\n \"copiedTitle\": \"Copied!\",\n \"copy\": \"Copy\",\n \"copyTitle\": \"Copy code\",\n \"loadingBlock\": \"Loading code block...\",\n \"loadingHighlight\": \"Loading syntax highlighting...\"\n },\n \"footnotes\": {\n \"title\": \"Notes\"\n },\n \"html\": {\n \"unsupported\": \"Unsupported HTML\"\n },\n \"image\": {\n \"invalid\": \"Invalid image\",\n \"unavailable\": \"Image unavailable: {{src}}\"\n },\n \"mermaid\": {\n \"diagramLabel\": \"Mermaid diagram\",\n \"empty\": \"Mermaid diagram is empty.\",\n \"renderFailed\": \"Mermaid diagram failed to render.\",\n \"rendering\": \"Rendering Mermaid diagram...\"\n }\n },\n \"navigation\": {\n \"breadcrumb\": \"Breadcrumb\",\n \"pageShell\": {\n \"closeNavigation\": \"Close navigation\",\n \"openNavigation\": \"Open navigation\"\n },\n \"sidebar\": {\n \"actions\": {\n \"collapse\": \"Collapse\",\n \"collapseAriaLabel\": \"Collapse sidebar\",\n \"expand\": \"Expand\",\n \"expandAriaLabel\": \"Expand sidebar\"\n }\n }\n },\n \"subscriptions\": {\n \"refetchNeeded\": {\n \"actions\": {\n \"reload\": \"Refresh\"\n },\n \"messages\": {\n \"bufferOverflow\": \"Live updates were interrupted (too many events). Refresh to load the latest data.\",\n \"cursorReplayUnavailable\": \"Live updates were interrupted (reconnect unavailable). Refresh to load the latest data.\",\n \"default\": \"Live updates were interrupted. Refresh to load the latest data.\"\n },\n \"title\": \"Live updates interrupted\"\n }\n },\n \"toast\": {\n \"dismissAriaLabel\": \"Dismiss notification\"\n }\n}\n","{\n \"auth\": {\n \"loginForm\": {\n \"actions\": {\n \"submit\": \"Se connecter\"\n },\n \"errors\": {\n \"emailRequired\": \"Entrez une adresse email.\",\n \"locked\": \"Trop de tentatives. Veuillez réessayer plus tard.\",\n \"lockedWithTime\": \"Trop de tentatives. Veuillez réessayer à {{time}}.\",\n \"loginFailed\": \"Échec de connexion. Veuillez réessayer.\",\n \"passwordMinLength\": \"Le mot de passe doit contenir au moins {{minLength}} caractères.\",\n \"passwordRequired\": \"Entrez un mot de passe.\"\n },\n \"labels\": {\n \"email\": \"Email\",\n \"password\": \"Mot de passe\"\n },\n \"placeholders\": {\n \"email\": \"vous@entreprise.com\",\n \"password\": \"Entrez votre mot de passe\"\n }\n }\n },\n \"backoffice\": {\n \"bulkActions\": {\n \"clear\": \"Effacer\",\n \"selected_one\": \"{{count}} sélectionné\",\n \"selected_many\": \"{{count}} sélectionnés\",\n \"selected_other\": \"{{count}} sélectionnés\"\n },\n \"copyableText\": {\n \"copied\": \"Copié\",\n \"copy\": \"Copier\"\n },\n \"dataTable\": {\n \"label\": \"Tableau de données\",\n \"selectAll\": \"Sélectionner toutes les lignes\",\n \"selectRow\": \"Sélectionner la ligne {{index}}\"\n },\n \"filterChips\": {\n \"clearAll\": \"Tout effacer\",\n \"remove\": \"Retirer le filtre\"\n },\n \"filterDrawer\": {\n \"closeAriaLabel\": \"Fermer les filtres\",\n \"empty\": \"Aucun filtre ne correspond à cette recherche.\",\n \"reset\": \"Tout réinitialiser\",\n \"searchAriaLabel\": \"Rechercher des filtres\",\n \"searchPlaceholder\": \"Rechercher des filtres\",\n \"subtitle_one\": \"{{count}} filtre\",\n \"subtitle_many\": \"{{count}} filtres\",\n \"subtitle_other\": \"{{count}} filtres\",\n \"title\": \"Tous les filtres\"\n },\n \"globalSearch\": {\n \"clear\": \"Effacer la recherche\",\n \"placeholder\": \"Rechercher…\"\n },\n \"idBadge\": {\n \"copy\": \"Copier l'ID\"\n },\n \"inlineBanner\": {\n \"dismiss\": \"Fermer\"\n },\n \"jsonViewer\": {\n \"collapse\": \"Réduire\",\n \"copied\": \"Copié\",\n \"copy\": \"Copier\",\n \"expand\": \"Déplier\",\n \"serializationError\": \"Impossible de sérialiser le JSON\",\n \"title\": \"JSON brut\"\n },\n \"loadMore\": {\n \"end\": \"Fin des résultats\",\n \"loading\": \"Chargement…\",\n \"moreAvailable\": \"D'autres résultats sont disponibles\"\n },\n \"relationsMenu\": {\n \"label\": \"Relations\"\n },\n \"tabs\": {\n \"label\": \"Onglets\"\n },\n \"tag\": {\n \"remove\": \"Retirer\"\n }\n },\n \"common\": {\n \"actions\": {\n \"cancel\": \"Annuler\",\n \"close\": \"Fermer\",\n \"confirm\": \"Confirmer\",\n \"save\": \"Enregistrer\",\n \"saving\": \"Enregistrement...\"\n },\n \"errors\": {\n \"unexpected\": \"Une erreur inattendue est survenue.\"\n },\n \"loading\": \"Chargement...\",\n \"menu\": {\n \"open\": \"Ouvrir le menu\"\n },\n \"notAvailable\": \"N/A\",\n \"select\": {\n \"placeholder\": \"Sélectionner une option\"\n },\n \"table\": {\n \"empty\": \"Aucune entrée trouvée.\",\n \"label\": \"Tableau de données\"\n }\n },\n \"layout\": {\n \"pageShell\": {\n \"resizeSidePanel\": \"Redimensionner le panneau latéral\"\n }\n },\n \"markdown\": {\n \"code\": {\n \"copied\": \"Copié\",\n \"copiedTitle\": \"Copié !\",\n \"copy\": \"Copier\",\n \"copyTitle\": \"Copier le code\",\n \"loadingBlock\": \"Chargement du bloc de code...\",\n \"loadingHighlight\": \"Chargement de la coloration syntaxique...\"\n },\n \"footnotes\": {\n \"title\": \"Notes\"\n },\n \"html\": {\n \"unsupported\": \"HTML non pris en charge\"\n },\n \"image\": {\n \"invalid\": \"Image invalide\",\n \"unavailable\": \"Image non disponible : {{src}}\"\n },\n \"mermaid\": {\n \"diagramLabel\": \"Diagramme Mermaid\",\n \"empty\": \"Le diagramme Mermaid est vide.\",\n \"renderFailed\": \"Le diagramme Mermaid n'a pas pu être rendu.\",\n \"rendering\": \"Rendu du diagramme Mermaid...\"\n }\n },\n \"navigation\": {\n \"breadcrumb\": \"Fil d'Ariane\",\n \"pageShell\": {\n \"closeNavigation\": \"Fermer la navigation\",\n \"openNavigation\": \"Ouvrir la navigation\"\n },\n \"sidebar\": {\n \"actions\": {\n \"collapse\": \"Réduire\",\n \"collapseAriaLabel\": \"Réduire la barre latérale\",\n \"expand\": \"Déplier\",\n \"expandAriaLabel\": \"Étendre la barre latérale\"\n }\n }\n },\n \"subscriptions\": {\n \"refetchNeeded\": {\n \"actions\": {\n \"reload\": \"Rafraîchir\"\n },\n \"messages\": {\n \"bufferOverflow\": \"Les mises à jour en temps réel ont été interrompues (trop d'événements). Rafraîchissez pour récupérer les dernières données.\",\n \"cursorReplayUnavailable\": \"Les mises à jour en temps réel ont été interrompues (reconnexion impossible). Rafraîchissez pour récupérer les dernières données.\",\n \"default\": \"Les mises à jour en temps réel ont été interrompues. Rafraîchissez pour récupérer les dernières données.\"\n },\n \"title\": \"Mises à jour interrompues\"\n }\n },\n \"toast\": {\n \"dismissAriaLabel\": \"Fermer la notification\"\n }\n}\n","import type { ResourceLanguage } from 'i18next';\n\nconst isResourceObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nconst asResourceLanguage = (value: unknown): ResourceLanguage => {\n if (isResourceObject(value)) {\n return value as ResourceLanguage;\n }\n return {};\n};\n\nexport const __test = {\n isResourceObject,\n asResourceLanguage,\n} as const;\n\n/**\n * Deep-merges i18next resource language objects while preserving nested keys.\n */\nexport function mergeResourceLanguages(\n ...values: readonly ResourceLanguage[]\n): ResourceLanguage {\n const output: ResourceLanguage = {};\n\n values.forEach((value) => {\n Object.entries(value).forEach(([key, nextValue]) => {\n const currentValue = output[key];\n if (isResourceObject(currentValue) && isResourceObject(nextValue)) {\n output[key] = mergeResourceLanguages(\n asResourceLanguage(currentValue),\n asResourceLanguage(nextValue),\n );\n return;\n }\n output[key] = nextValue;\n });\n });\n\n return output;\n}\n","import en from './locales/en/ui.json' with { type: 'json' };\nimport fr from './locales/fr/ui.json' with { type: 'json' };\nimport type { Resource, ResourceLanguage } from 'i18next';\n\nimport { mergeResourceLanguages } from './mergeResourceLanguages.js';\n\nexport const uiI18nResources = {\n en: { ui: en },\n fr: { ui: fr },\n} as const;\n\nexport type UiI18nResources = typeof uiI18nResources;\n\nconst isResourceLanguage = (value: unknown): value is ResourceLanguage => {\n return typeof value === 'object' && value != null;\n};\n\nconst asResourceLanguage = (value: unknown): ResourceLanguage => {\n if (isResourceLanguage(value)) {\n return value;\n }\n return {};\n};\n\n/**\n * Returns i18next resources with the package-owned `ui` namespace registered.\n *\n * Applications should pass their resources through this helper before\n * initializing i18next. App-provided `ui` keys are deep-merged on top so\n * product-specific copy can override package defaults without dropping nested\n * shared UI keys such as common actions and table labels.\n */\nexport function withUiI18nResources(appResources: Resource = {}): Resource {\n const output: Resource = {};\n const packageResources = uiI18nResources as Resource;\n const locales = new Set([\n ...Object.keys(packageResources),\n ...Object.keys(appResources),\n ]);\n\n locales.forEach((locale) => {\n const packageLocale = asResourceLanguage(packageResources[locale]);\n const appLocale = asResourceLanguage(appResources[locale]);\n output[locale] = {\n ...packageLocale,\n ...appLocale,\n ui: mergeResourceLanguages(\n asResourceLanguage(packageLocale.ui),\n asResourceLanguage(appLocale.ui),\n ),\n };\n });\n\n return output;\n}\n","import { keyframes, style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst baseSprinkles = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'md',\n fontSize: 'xs',\n fontWeight: 'medium',\n gap: 1,\n});\n\nconst baseTypography = sprinkles({\n lineHeight: 1,\n});\n\nconst shimmerAnimation = keyframes({\n '0%': {\n transform: 'translateX(-120%)',\n },\n '50%': {\n transform: 'translateX(0%)',\n },\n '100%': {\n transform: 'translateX(120%)',\n },\n});\n\nconst loadingBase = style({\n position: 'relative',\n overflow: 'hidden',\n selectors: {\n '&::after': {\n content: '',\n position: 'absolute',\n inset: 0,\n background: `linear-gradient(\n 100deg,\n ${vars.colors.transparent} 0%,\n color-mix(in srgb, ${vars.colors.white} 20%, transparent) 25%,\n color-mix(in srgb, ${vars.colors.white} 90%, transparent) 50%,\n color-mix(in srgb, ${vars.colors.white} 20%, transparent) 75%,\n ${vars.colors.transparent} 100%\n )`,\n transform: 'translateX(-120%)',\n animation: `${shimmerAnimation} 1.1s ease-in-out infinite`,\n opacity: 0.9,\n pointerEvents: 'none',\n willChange: 'transform',\n },\n },\n});\n\nexport const badge = recipe({\n base: [baseSprinkles, baseTypography],\n variants: {\n tone: {\n neutral: sprinkles({\n backgroundColor: 'brandLightGray',\n color: 'brandDarkGray',\n }),\n info: sprinkles({\n backgroundColor: 'primaryLight',\n color: 'brandPrimaryRed',\n }),\n success: sprinkles({ backgroundColor: 'green-100', color: 'green-700' }),\n warning: sprinkles({ backgroundColor: 'amber-100', color: 'amber-700' }),\n danger: sprinkles({ backgroundColor: 'red-100', color: 'red-700' }),\n accent: sprinkles({\n backgroundColor: 'brandSecondaryOrange',\n color: 'brandWhite',\n }),\n },\n loading: {\n on: loadingBase,\n off: '',\n },\n },\n defaultVariants: {\n tone: 'neutral',\n loading: 'off',\n },\n compoundVariants: [],\n});\n\nexport type BadgeVariants = RecipeVariants<typeof badge>;\n","import { type JSX, type ReactNode } from 'react';\n\nimport { badge } from './badge.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n children: ReactNode;\n tone?: BadgeTone;\n className?: string;\n loading?: boolean;\n};\n\ntype BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\n\nexport const Badge = ({\n children,\n tone,\n className,\n loading = false,\n}: Props): JSX.Element => {\n let loadingVariant: 'on' | 'off' = 'off';\n if (loading) {\n loadingVariant = 'on';\n }\n\n return (\n <span className={cx(badge({ tone, loading: loadingVariant }), className)}>\n {children}\n </span>\n );\n};\n\nexport default Badge;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ButtonLoadingSpinnerSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...rest}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeOpacity={0.25}\n ></circle>\n <path\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n fillOpacity={0.75}\n ></path>\n </svg>\n );\n};\n","import { keyframes, style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst baseLayout = sprinkles({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontWeight: 'medium',\n cursor: 'pointer',\n});\n\nconst baseInteraction = style([\n sprinkles({\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'default',\n borderWidth: 0,\n borderStyle: 'none',\n }),\n {\n selectors: {\n '&:active': {\n transform: 'scale(0.98)',\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n opacity: '0.7',\n cursor: 'not-allowed',\n },\n },\n },\n]);\n\nconst primaryVariant = sprinkles({\n backgroundColor: 'brandPrimaryRed',\n color: 'brandWhite',\n fontWeight: 'semibold',\n});\n\nconst secondaryVariant = style([\n sprinkles({\n backgroundColor: 'transparent',\n color: 'primary',\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'primary',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: vars.colors.primaryLight,\n },\n },\n },\n]);\n\nconst textVariant = sprinkles({\n backgroundColor: 'transparent',\n color: 'primary',\n});\n\nconst successVariant = style([\n sprinkles({ backgroundColor: 'success', color: 'text' }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.9)',\n },\n },\n },\n]);\n\nconst dangerVariant = style([\n sprinkles({ backgroundColor: 'error', color: 'text' }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.9)',\n },\n },\n },\n]);\n\nconst brandVariant = style([\n sprinkles({\n color: 'brandWhite',\n fontWeight: 'semibold',\n backgroundImage: 'brandDiagonal125',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'transparent',\n boxShadow: 'xl',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.97)',\n transform: 'translateY(-1px)',\n },\n '&:active:not(:disabled)': {\n transform: 'translateY(0)',\n },\n },\n },\n]);\n\nconst brandGhostVariant = style([\n sprinkles({\n backgroundColor: 'brandSecondaryOrange',\n color: 'brandWhite',\n borderColor: 'brandSecondaryOrange',\n borderWidth: 'px',\n borderStyle: 'solid',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.97)',\n },\n },\n },\n]);\n\nconst iconVariant = style([\n sprinkles({\n backgroundColor: 'brandSecondaryOrange',\n color: 'brandWhite',\n borderRadius: 'full',\n padding: 0,\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: vars.colors.primaryLight,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nconst tabVariant = style([\n sprinkles({\n backgroundColor: 'transparent',\n color: 'textSecondary',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 2,\n borderBottomColor: 'transparent',\n paddingY: 2,\n paddingX: 4,\n fontSize: 'sm',\n fontWeight: 'medium',\n appearance: 'none',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n color: vars.colors.text,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n cursor: 'default',\n opacity: 0.6,\n },\n },\n },\n]);\n\nconst smallSize = sprinkles({\n paddingY: 1,\n paddingX: 4,\n fontSize: 'xs',\n borderRadius: 'xl',\n height: 8,\n});\n\nconst mediumSize = sprinkles({\n paddingY: 2,\n paddingX: 6,\n fontSize: 'sm',\n borderRadius: 'xl',\n height: 10,\n});\n\nconst largeSize = sprinkles({\n paddingY: 4,\n paddingX: 8,\n fontSize: 'base',\n borderRadius: 'lg',\n height: 12,\n});\n\nconst iconSizeSmall = sprinkles({\n width: 8,\n height: 8,\n minWidth: 8,\n minHeight: 8,\n});\n\nconst iconSizeMedium = sprinkles({\n width: 10,\n height: 10,\n minWidth: 10,\n minHeight: 10,\n});\n\nconst iconSizeLarge = sprinkles({\n width: 12,\n height: 12,\n minWidth: 12,\n minHeight: 12,\n});\n\nexport const button = recipe({\n base: [baseLayout, baseInteraction],\n variants: {\n variant: {\n primary: primaryVariant,\n secondary: secondaryVariant,\n text: textVariant,\n success: successVariant,\n danger: dangerVariant,\n brand: brandVariant,\n brandGhost: brandGhostVariant,\n tab: tabVariant,\n icon: iconVariant,\n },\n size: {\n small: smallSize,\n medium: mediumSize,\n large: largeSize,\n },\n width: {\n auto: sprinkles({ width: 'auto' }),\n full: sprinkles({ width: 'full' }),\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'medium',\n width: 'auto',\n },\n compoundVariants: [\n {\n variants: { variant: 'icon', size: 'small' },\n style: iconSizeSmall,\n },\n {\n variants: { variant: 'icon', size: 'medium' },\n style: iconSizeMedium,\n },\n {\n variants: { variant: 'icon', size: 'large' },\n style: iconSizeLarge,\n },\n ],\n});\n\nexport const tabButtonActive = sprinkles({\n color: 'primary',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 2,\n borderBottomColor: 'primary',\n fontWeight: 'semibold',\n});\n\nexport const activeButton = recipe({\n base: [baseLayout, baseInteraction],\n variants: {\n variant: {\n primary: primaryVariant,\n secondary: secondaryVariant,\n text: textVariant,\n success: successVariant,\n danger: dangerVariant,\n brand: brandVariant,\n brandGhost: brandGhostVariant,\n tab: tabButtonActive,\n icon: iconVariant,\n },\n size: {\n small: smallSize,\n medium: mediumSize,\n large: largeSize,\n },\n width: {\n auto: sprinkles({ width: 'auto' }),\n full: sprinkles({ width: 'full' }),\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'medium',\n width: 'auto',\n },\n compoundVariants: [\n {\n variants: { variant: 'icon', size: 'small' },\n style: iconSizeSmall,\n },\n {\n variants: { variant: 'icon', size: 'medium' },\n style: iconSizeMedium,\n },\n {\n variants: { variant: 'icon', size: 'large' },\n style: iconSizeLarge,\n },\n ],\n});\n\nexport type ButtonVariants = RecipeVariants<typeof button>;\n\nconst INLINE_FLEX = 'inline-flex' as const;\n\nconst inlineFlexCenter = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n});\n\nconst spin = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const content = inlineFlexCenter;\n\nexport const loadingIndicator = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n gap: 2,\n});\n\nexport const spinnerIcon = style([\n sprinkles({\n width: 5,\n height: 5,\n flexShrink: 0,\n }),\n {\n animation: `${spin} 1s linear infinite`,\n },\n]);\n\nexport const iconLeft = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n marginRight: 2,\n});\n\nexport const iconRight = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n marginLeft: 2,\n});\n\nexport const iconOnlyContent = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n justifyContent: 'center',\n});\n","import React, { type Ref, type JSX } from 'react';\n\nimport { ButtonLoadingSpinnerSvg } from '../../../icons/ButtonLoadingSpinnerSvg.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nimport {\n button,\n content as contentClass,\n iconLeft,\n iconRight,\n loadingIndicator,\n spinnerIcon,\n type ButtonVariants,\n} from './button.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype ButtonSlot =\n | 'loadingIndicator'\n | 'spinnerIcon'\n | 'content'\n | 'iconLeft'\n | 'iconRight';\n\ntype SlotClasses<T extends string> = Partial<Record<T, string>>;\n\n// Omit the conflicting 'size' property from HTML button attributes\nexport type ButtonProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'size'\n> & {\n variant?: NonNullable<ButtonVariants>['variant'];\n size?: NonNullable<ButtonVariants>['size'];\n width?: NonNullable<ButtonVariants>['width'];\n isLoading?: boolean;\n loadingLabel?: React.ReactNode;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n ref?: Ref<HTMLButtonElement>;\n classes?: SlotClasses<ButtonSlot>;\n};\n\nexport const Button = (props: ButtonProps): JSX.Element => {\n const { t } = useUiTranslation();\n const {\n children,\n className,\n disabled,\n isLoading = false,\n loadingLabel,\n classes,\n leftIcon,\n rightIcon,\n size,\n variant,\n width,\n ref,\n ...rest\n } = props;\n\n const resolvedClassName = cx(button({ variant, size, width }), className);\n const isDisabled = Boolean(isLoading) || Boolean(disabled);\n\n let renderedContent: JSX.Element;\n\n if (isLoading) {\n const resolvedLoadingLabel = loadingLabel ?? t('common.loading');\n renderedContent = (\n <span className={cx(loadingIndicator, classes?.loadingIndicator)}>\n <ButtonLoadingSpinnerSvg\n className={cx(spinnerIcon, classes?.spinnerIcon)}\n width={20}\n height={20}\n />\n {resolvedLoadingLabel}\n </span>\n );\n } else {\n const iconElements: JSX.Element[] = [];\n\n if (leftIcon != null) {\n iconElements.push(\n <span className={cx(iconLeft, classes?.iconLeft)} key=\"left-icon\">\n {leftIcon}\n </span>,\n );\n }\n\n iconElements.push(\n <span className={cx(contentClass, classes?.content)} key=\"content\">\n {children}\n </span>,\n );\n\n if (rightIcon != null) {\n iconElements.push(\n <span className={cx(iconRight, classes?.iconRight)} key=\"right-icon\">\n {rightIcon}\n </span>,\n );\n }\n\n renderedContent = <>{iconElements}</>;\n }\n\n return (\n <button\n ref={ref}\n className={resolvedClassName}\n disabled={isDisabled}\n {...rest}\n >\n {renderedContent}\n </button>\n );\n};\n","import {\n type ComponentPropsWithoutRef,\n type JSX,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { Link } from '@plumile/router';\n\nimport { ButtonLoadingSpinnerSvg } from '../../../icons/ButtonLoadingSpinnerSvg.js';\nimport { cx } from '../../../theme/tools.js';\nimport {\n activeButton,\n button,\n content as contentClass,\n iconLeft,\n iconRight,\n loadingIndicator,\n spinnerIcon,\n type ButtonVariants,\n} from './button.css.js';\n\ntype LinkProps = ComponentPropsWithoutRef<typeof Link>;\n\ntype Props = Omit<LinkProps, 'children' | 'className'> & {\n children: ReactNode;\n className?: string;\n variant?: NonNullable<ButtonVariants>['variant'];\n size?: NonNullable<ButtonVariants>['size'];\n width?: NonNullable<ButtonVariants>['width'];\n isLoading?: boolean;\n loadingLabel?: ReactNode;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n};\n\nexport const LinkButton = (props: Props): JSX.Element => {\n const {\n children,\n className,\n isDisabled,\n isLoading = false,\n leftIcon,\n loadingLabel,\n ref,\n rightIcon,\n size,\n variant,\n width,\n ...rest\n } = props;\n\n const resolvedClassName = cx(button({ variant, size, width }), className);\n const disabled = Boolean(isLoading) || Boolean(isDisabled);\n const isIconVariant = variant === 'icon';\n\n let renderedContent: JSX.Element;\n\n if (isLoading) {\n renderedContent = (\n <span className={loadingIndicator}>\n <ButtonLoadingSpinnerSvg\n className={spinnerIcon}\n width={20}\n height={20}\n />\n {loadingLabel}\n </span>\n );\n } else if (isIconVariant) {\n const iconContent = leftIcon ?? rightIcon ?? children ?? null;\n\n renderedContent = <span>{iconContent}</span>;\n } else {\n const iconElements: JSX.Element[] = [];\n\n if (leftIcon != null) {\n iconElements.push(\n <span className={iconLeft} key=\"left-icon\">\n {leftIcon}\n </span>,\n );\n }\n\n iconElements.push(\n <span className={contentClass} key=\"content\">\n {children}\n </span>,\n );\n\n if (rightIcon != null) {\n iconElements.push(\n <span className={iconRight} key=\"right-icon\">\n {rightIcon}\n </span>,\n );\n }\n\n renderedContent = <>{iconElements}</>;\n }\n\n let ariaDisabled: true | undefined;\n if (disabled) {\n ariaDisabled = true;\n }\n\n return (\n <Link\n {...rest}\n ref={ref}\n className={resolvedClassName}\n activeClassName={activeButton({ variant })}\n isDisabled={disabled}\n aria-disabled={ariaDisabled}\n >\n {renderedContent}\n </Link>\n );\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const checkboxContainer = sprinkles({\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n});\n\nexport const checkboxInput = sprinkles({\n position: 'absolute',\n cursor: 'pointer',\n opacity: 0,\n height: 0,\n width: 0,\n});\n\nexport const checkboxLabel = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n paddingLeft: 2,\n cursor: 'pointer',\n});\n\nconst checkboxBase = style([\n sprinkles({\n display: 'inline-block',\n width: 5,\n height: 5,\n backgroundColor: 'white',\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'md',\n cursor: 'pointer',\n position: 'relative',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'default',\n }),\n {\n selectors: {\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n display: 'none',\n left: '6px',\n top: '2px',\n width: '6px',\n height: '11px',\n border: `solid ${vars.colors.white}`,\n borderWidth: '0 2px 2px 0',\n transform: 'rotate(45deg)',\n },\n },\n },\n]);\n\nconst checkedVariant = style([\n sprinkles({ backgroundColor: 'primary', borderColor: 'primary' }),\n {\n selectors: {\n '&:after': {\n display: 'block',\n },\n },\n },\n]);\n\nconst uncheckedVariant = style([\n sprinkles({ backgroundColor: 'white' }),\n {\n selectors: {\n '&:hover': {\n borderColor: vars.colors.primary,\n },\n },\n },\n]);\n\nconst indeterminateVariant = style([\n sprinkles({ backgroundColor: 'primary', borderColor: 'primary' }),\n {\n selectors: {\n '&:after': {\n display: 'block',\n left: '4px',\n top: '8px',\n width: '10px',\n height: '0',\n borderWidth: '0 0 2px 0',\n transform: 'none',\n },\n },\n },\n]);\n\nconst disabledVariant = sprinkles({\n opacity: 50,\n cursor: 'not-allowed',\n});\n\nconst enabledVariant = sprinkles({});\n\nexport const customCheckbox = recipe({\n base: checkboxBase,\n variants: {\n checked: {\n true: checkedVariant,\n false: uncheckedVariant,\n },\n indeterminate: {\n true: indeterminateVariant,\n false: enabledVariant,\n },\n disabled: {\n true: disabledVariant,\n false: enabledVariant,\n },\n },\n defaultVariants: {\n checked: false,\n indeterminate: false,\n disabled: false,\n },\n});\n\nexport type CheckboxVariants = RecipeVariants<typeof customCheckbox>;\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n position: 'relative',\n width: 'auto',\n display: 'inline-block',\n});\n\nexport const containerFullWidth = sprinkles({\n width: 'full',\n});\n\nconst iconBase = style([\n sprinkles({\n position: 'absolute',\n top: '1/2',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n }),\n {\n transform: 'translateY(-50%)',\n },\n]);\n\nexport const leftIcon = style([iconBase, sprinkles({ left: 2.5 })]);\n\nexport const rightIcon = style([iconBase, sprinkles({ right: 2.5 })]);\n\nexport const rightIconInteractive = sprinkles({\n pointerEvents: 'auto',\n});\n\nexport const inputWithLeftIcon = sprinkles({\n paddingLeft: 9,\n});\n\nexport const inputWithRightIcon = sprinkles({\n paddingRight: 9,\n});\n\nexport const inputWithInteractiveRightIcon = sprinkles({\n paddingRight: 24,\n});\n\nconst baseInput = style([\n sprinkles({\n paddingY: 1,\n paddingX: 3,\n borderRadius: 'lg',\n fontSize: 'base',\n width: 'full',\n outline: 'none',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'default',\n }),\n {\n '::placeholder': {\n color: vars.colors.textSecondary,\n opacity: '0.7',\n },\n },\n]);\n\nconst defaultVariant = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus': {\n borderColor: vars.colors.primary,\n boxShadow: `0 0 0 3px ${vars.colors.primaryLight}`,\n },\n },\n },\n]);\n\nconst errorVariant = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'error',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus': {\n boxShadow: `0 0 0 3px color-mix(in srgb, ${vars.colors.error} 20%, transparent)`,\n },\n },\n },\n]);\n\nconst smallSize = sprinkles({\n paddingY: 1,\n paddingX: 2,\n fontSize: 'sm',\n});\n\nconst mediumSize = sprinkles({\n paddingY: 2,\n paddingX: 4,\n fontSize: 'base',\n});\n\nconst largeSize = sprinkles({\n paddingY: 4,\n paddingX: 6,\n fontSize: 'lg',\n});\n\nexport const input = recipe({\n base: baseInput,\n variants: {\n variant: {\n default: defaultVariant,\n error: errorVariant,\n },\n size: {\n small: smallSize,\n medium: mediumSize,\n large: largeSize,\n },\n fullWidth: {\n true: sprinkles({ width: 'full' }),\n false: sprinkles({ width: 'auto' }),\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'medium',\n fullWidth: true,\n },\n});\n\nexport type InputVariants = RecipeVariants<typeof input>;\n","import {\n type InputHTMLAttributes,\n type JSX,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {\n container,\n containerFullWidth,\n input as inputRecipe,\n inputWithLeftIcon,\n inputWithInteractiveRightIcon,\n inputWithRightIcon,\n leftIcon as leftIconClass,\n rightIcon as rightIconClass,\n rightIconInteractive,\n} from './input.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype InputVariant = 'default' | 'error';\ntype InputSize = 'small' | 'medium' | 'large';\n\n// Omit the conflicting 'size' property from HTML input attributes\nexport type Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n variant?: InputVariant;\n size?: InputSize;\n fullWidth?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n rightIconIsInteractive?: boolean;\n ref?: Ref<HTMLInputElement>;\n};\n\nexport const Input = (props: Props): JSX.Element => {\n const {\n variant,\n size,\n fullWidth,\n leftIcon,\n rightIcon,\n rightIconIsInteractive = false,\n ref: inputRef,\n ...rest\n } = props;\n const { className, style, ...inputProps } = rest;\n const inputType = inputProps.type;\n\n if (inputType === 'checkbox' || inputType === 'radio') {\n return (\n <input\n ref={inputRef}\n className={className}\n style={style}\n {...inputProps}\n />\n );\n }\n\n let leftIconElement: JSX.Element | null = null;\n if (leftIcon != null) {\n leftIconElement = <div className={leftIconClass}>{leftIcon}</div>;\n }\n\n let rightIconElement: JSX.Element | null = null;\n if (rightIcon != null) {\n rightIconElement = (\n <div\n className={cx(rightIconClass, {\n [rightIconInteractive]: rightIconIsInteractive,\n })}\n >\n {rightIcon}\n </div>\n );\n }\n\n const computedClassName = inputRecipe({ variant, size, fullWidth });\n const resolvedClassName = cx(computedClassName, className, {\n [inputWithLeftIcon]: leftIcon != null,\n [inputWithRightIcon]: rightIcon != null,\n [inputWithInteractiveRightIcon]: rightIconIsInteractive,\n });\n\n let containerClassName = cx(container);\n if (fullWidth === true) {\n containerClassName = cx(container, containerFullWidth);\n }\n\n return (\n <div className={containerClassName}>\n {leftIconElement}\n <input\n ref={inputRef}\n className={resolvedClassName}\n style={style}\n {...inputProps}\n />\n {rightIconElement}\n </div>\n );\n};\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const label = recipe({\n base: sprinkles({\n display: 'block',\n marginBottom: 1,\n fontWeight: 'medium',\n }),\n variants: {\n variant: {\n default: sprinkles({ color: 'text' }),\n error: sprinkles({ color: 'error' }),\n },\n size: {\n small: sprinkles({ fontSize: 'xs' }),\n medium: sprinkles({ fontSize: 'sm' }),\n large: sprinkles({ fontSize: 'base' }),\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'medium',\n },\n});\n\nexport type LabelVariants = RecipeVariants<typeof label>;\n\nexport const requiredMark = sprinkles({\n color: 'error',\n marginLeft: 0.5,\n});\n","import React, { type JSX } from 'react';\nimport {\n label,\n requiredMark as requiredMarkClass,\n type LabelVariants,\n} from './label.css.js';\n\ntype Props = React.LabelHTMLAttributes<HTMLLabelElement> & {\n variant?: NonNullable<LabelVariants>['variant'];\n size?: NonNullable<LabelVariants>['size'];\n required?: boolean;\n};\n\nexport const Label = (props: Props): JSX.Element => {\n const { children, variant, size, required, ...rest } = props;\n const { className, ...labelProps } = rest;\n let requiredMark: JSX.Element | null = null;\n\n if (required === true) {\n requiredMark = <span className={requiredMarkClass}>*</span>;\n }\n\n const computedClassName = label({ variant, size });\n const mergedClassName = [computedClassName, className]\n .filter((value) => {\n return value != null && value !== '';\n })\n .join(' ');\n\n let resolvedClassName: string | undefined;\n if (mergedClassName !== '') {\n resolvedClassName = mergedClassName;\n }\n\n return (\n <label className={resolvedClassName} {...labelProps}>\n {children}\n {requiredMark}\n </label>\n );\n};\n","import React, { useEffect, useRef, type JSX, type Ref } from 'react';\nimport {\n checkboxContainer,\n checkboxInput,\n checkboxLabel,\n customCheckbox,\n type CheckboxVariants,\n} from './checkbox.css.js';\nimport { Input } from '../input/Input.js';\nimport { Label } from '../label/Label.js';\n\nexport interface CheckboxProps\n extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'checked' | 'size'\n >,\n Omit<CheckboxVariants, 'checked' | 'indeterminate'> {\n label?: string;\n checked?: boolean;\n indeterminate?: boolean;\n ref?: Ref<HTMLInputElement>;\n}\n\nexport const Checkbox = (props: CheckboxProps): JSX.Element => {\n const {\n label,\n checked = false,\n indeterminate = false,\n disabled = false,\n onChange,\n ref: inputRef,\n ...rest\n } = props;\n const localRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (localRef.current != null) {\n localRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const handleRef = (node: HTMLInputElement | null): void => {\n localRef.current = node;\n if (typeof inputRef === 'function') {\n inputRef(node);\n } else if (inputRef != null) {\n inputRef.current = node;\n }\n };\n\n let ariaChecked: boolean | 'mixed' = checked;\n if (indeterminate) {\n ariaChecked = 'mixed';\n }\n\n let labelContent: JSX.Element | null = null;\n if (label != null && label !== '') {\n labelContent = <span className={checkboxLabel}>{label}</span>;\n }\n return (\n <Label className={checkboxContainer}>\n <Input\n ref={handleRef}\n type=\"checkbox\"\n className={checkboxInput}\n checked={checked}\n disabled={disabled}\n onChange={onChange}\n aria-checked={ariaChecked}\n {...rest}\n />\n <span\n className={customCheckbox({ checked, disabled, indeterminate })}\n aria-hidden=\"true\"\n />\n {labelContent}\n </Label>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const errorMessage = sprinkles({\n color: 'error',\n fontSize: 'sm',\n marginTop: 1,\n});\n","import React, { type JSX } from 'react';\nimport { errorMessage } from './errorMessage.css.js';\n\ntype Props = {\n children: React.ReactNode;\n className?: string;\n id?: string; // Added id prop\n};\n\nexport const ErrorMessage = ({\n children,\n id,\n ...rest\n}: Props): JSX.Element | null => {\n if (children == null) {\n return null;\n }\n\n return (\n <div id={id} className={errorMessage} {...rest}>\n {children}\n </div>\n );\n};\n","import { type JSX, useMemo } from 'react';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\ntype DateValue = string | { toString: () => string };\n\ntype Props = {\n value: DateValue | null | undefined;\n fallback?: string;\n options?: Intl.DateTimeFormatOptions;\n locale?: string;\n className?: string;\n};\n\nconst DEFAULT_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n};\n\nexport const FormattedDate = ({\n value,\n fallback,\n options = DEFAULT_OPTIONS,\n locale,\n className,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedFallback = fallback ?? t('common.notAvailable');\n const displayValue = useMemo(() => {\n if (value == null) {\n return resolvedFallback;\n }\n\n const date = new Date(String(value));\n if (Number.isNaN(date.getTime())) {\n return resolvedFallback;\n }\n\n try {\n return new Intl.DateTimeFormat(locale, options).format(date);\n } catch {\n return resolvedFallback;\n }\n }, [value, resolvedFallback, locale, options]);\n\n return <span className={className}>{displayValue}</span>;\n};\n","import { type JSX, useMemo } from 'react';\n\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\ntype DateValue = string | { toString: () => string };\n\nexport type RelativeTimeTextProps = {\n value: DateValue | null | undefined;\n fallback?: string;\n locale?: string;\n className?: string;\n titleMode?: 'absolute' | 'none';\n};\n\ntype RelativeUnit = Intl.RelativeTimeFormatUnit;\n\nconst SECOND_IN_MS = 1000;\nconst MINUTE_IN_MS = 60 * SECOND_IN_MS;\nconst HOUR_IN_MS = 60 * MINUTE_IN_MS;\nconst DAY_IN_MS = 24 * HOUR_IN_MS;\nconst MONTH_IN_MS = 30 * DAY_IN_MS;\nconst YEAR_IN_MS = 365 * DAY_IN_MS;\n\nconst DEFAULT_TITLE_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n};\n\nconst resolveRelativeParts = (\n diffInMs: number,\n): { value: number; unit: RelativeUnit } => {\n const absoluteDiff = Math.abs(diffInMs);\n\n if (absoluteDiff < MINUTE_IN_MS) {\n return {\n value: Math.round(diffInMs / SECOND_IN_MS),\n unit: 'second',\n };\n }\n\n if (absoluteDiff < HOUR_IN_MS) {\n return {\n value: Math.round(diffInMs / MINUTE_IN_MS),\n unit: 'minute',\n };\n }\n\n if (absoluteDiff < DAY_IN_MS) {\n return {\n value: Math.round(diffInMs / HOUR_IN_MS),\n unit: 'hour',\n };\n }\n\n if (absoluteDiff < MONTH_IN_MS) {\n return {\n value: Math.round(diffInMs / DAY_IN_MS),\n unit: 'day',\n };\n }\n\n if (absoluteDiff < YEAR_IN_MS) {\n return {\n value: Math.round(diffInMs / MONTH_IN_MS),\n unit: 'month',\n };\n }\n\n return {\n value: Math.round(diffInMs / YEAR_IN_MS),\n unit: 'year',\n };\n};\n\nconst formatAbsoluteTitle = (\n date: Date,\n locale?: string,\n): string | undefined => {\n try {\n return new Intl.DateTimeFormat(locale, DEFAULT_TITLE_OPTIONS).format(date);\n } catch {\n return undefined;\n }\n};\n\nexport const RelativeTimeText = ({\n className,\n fallback,\n locale,\n titleMode = 'absolute',\n value,\n}: RelativeTimeTextProps): JSX.Element => {\n const { i18n, t } = useUiTranslation();\n const resolvedFallback = fallback ?? t('common.notAvailable');\n const resolvedLocale = locale ?? i18n.language;\n\n const resolvedDate = useMemo(() => {\n if (value == null) {\n return null;\n }\n\n const date = new Date(String(value));\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date;\n }, [value]);\n\n const displayValue = useMemo(() => {\n if (resolvedDate == null) {\n return resolvedFallback;\n }\n\n const diffInMs = resolvedDate.getTime() - Date.now();\n const { unit, value: relativeValue } = resolveRelativeParts(diffInMs);\n\n try {\n return new Intl.RelativeTimeFormat(resolvedLocale, {\n numeric: 'auto',\n }).format(relativeValue, unit);\n } catch {\n return resolvedFallback;\n }\n }, [resolvedDate, resolvedFallback, resolvedLocale]);\n\n let title: string | undefined;\n if (titleMode === 'absolute' && resolvedDate != null) {\n title = formatAbsoluteTitle(resolvedDate, resolvedLocale);\n }\n\n return (\n <span className={className} title={title}>\n {displayValue}\n </span>\n );\n};\n\nexport default RelativeTimeText;\n\nexport const __test = {\n resolveRelativeParts,\n formatAbsoluteTitle,\n} as const;\n","import { type ComponentProps, type JSX } from 'react';\n\nimport { Button } from '../button/Button.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nconst DEFAULT_ICON = '⋮';\n\nexport type IconMenuButtonProps = Omit<\n ComponentProps<typeof Button>,\n 'children' | 'variant' | 'size'\n> & {\n label?: string;\n icon?: JSX.Element | string;\n};\n\nexport const IconMenuButton = ({\n label,\n icon = DEFAULT_ICON,\n type = 'button',\n ...rest\n}: IconMenuButtonProps): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedLabel = label ?? t('common.menu.open');\n return (\n <Button\n aria-label={resolvedLabel}\n variant=\"text\"\n size=\"small\"\n type={type}\n {...rest}\n >\n {icon}\n </Button>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ModalCloseSvg = ({\n width = 20,\n height = 20,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 6L18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nconst overlayBase = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 'modal',\n transitionProperty: 'opacityVisibility',\n transitionDuration: 300,\n transitionTimingFunction: 'ease-in-out',\n} as const;\n\nexport const overlay = sprinkles({\n ...overlayBase,\n opacity: 0,\n visibility: 'hidden',\n backgroundColor: 'black-200',\n});\n\nexport const overlayVisible = sprinkles({\n opacity: 100,\n visibility: 'visible',\n});\n","import { type JSX } from 'react';\nimport * as styles from './overlay.css.js';\n\ntype Props = {\n isVisible: boolean;\n onClick?: () => void;\n};\n\nexport const Overlay = ({ isVisible, onClick }: Props): JSX.Element => {\n const classNames = [styles.overlay];\n\n if (isVisible) {\n classNames.push(styles.overlayVisible);\n }\n\n return (\n <div\n className={classNames.join(' ')}\n onClick={onClick}\n aria-hidden=\"true\"\n />\n );\n};\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const modalContainer = sprinkles({\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 4,\n zIndex: 'modal',\n});\n\nexport const modal = style([\n sprinkles({\n backgroundColor: 'white',\n borderRadius: 'xl',\n boxShadow: 'xl',\n width: 'full',\n maxWidth: 700,\n maxHeight: '90vh',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n overflow: 'hidden',\n }),\n {\n animation: 'modalFadeIn 0.2s ease-out',\n zIndex: 51,\n },\n]);\n\nexport const modalHeader = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingY: 4,\n paddingX: 6,\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'border',\n});\n\nexport const modalTitle = sprinkles({\n color: 'text',\n margin: 0,\n fontSize: 'xl',\n fontWeight: 'semibold',\n});\n\nexport const closeButton = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n color: 'textSecondary',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 100,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.backgroundModifier,\n color: vars.colors.text,\n },\n '&:focus': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.primary}`,\n },\n },\n },\n]);\n\nexport const modalContent = sprinkles({\n paddingY: 6,\n paddingX: 6,\n overflowY: 'auto',\n});\n\nexport const modalFooter = sprinkles({\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 4,\n paddingY: 4,\n paddingX: 6,\n borderWidth: 0,\n borderStyle: 'solid',\n borderTopWidth: 'default',\n borderTopColor: 'border',\n});\n","import React, { type JSX, useEffect, useId, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTranslation } from 'react-i18next';\n\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\nimport { Overlay } from '../overlay/Overlay.js';\nimport * as styles from './modal.css.js';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n footer?: React.ReactNode;\n closeAriaLabel?: string;\n};\n\nexport const Modal = (props: Props): JSX.Element | null => {\n const { isOpen, onClose, title, children, footer, closeAriaLabel } = props;\n const { t } = useTranslation('ui');\n const titleId = useId();\n const modalRef = useRef<HTMLDivElement>(null);\n const closeButtonRef = useRef<HTMLButtonElement | null>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!isOpen) {\n return () => {};\n }\n\n if (document.activeElement instanceof HTMLElement) {\n restoreFocusRef.current = document.activeElement;\n }\n\n window.setTimeout(() => {\n closeButtonRef.current?.focus();\n }, 0);\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n return;\n }\n\n if (e.key !== 'Tab') {\n return;\n }\n\n const modalElement = modalRef.current;\n if (modalElement == null) {\n return;\n }\n\n const focusableElements = Array.from(\n modalElement.querySelectorAll<HTMLElement>(\n [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(','),\n ),\n ).filter((element) => {\n return element.offsetParent != null;\n });\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n if (firstElement == null || lastElement == null) {\n e.preventDefault();\n modalElement.focus();\n return;\n }\n\n if (e.shiftKey && document.activeElement === firstElement) {\n e.preventDefault();\n lastElement.focus();\n return;\n }\n\n if (!e.shiftKey && document.activeElement === lastElement) {\n e.preventDefault();\n firstElement.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n restoreFocusRef.current?.focus();\n restoreFocusRef.current = null;\n };\n }, [isOpen, onClose]);\n\n // Prevent click from bubbling to overlay\n const handleModalClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n if (!isOpen) {\n return null;\n }\n\n const modalContent = (\n <>\n <Overlay isVisible={isOpen} onClick={onClose} />\n <div className={styles.modalContainer}>\n <div\n className={styles.modal}\n ref={modalRef}\n onClick={handleModalClick}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n >\n <div className={styles.modalHeader}>\n <h2 id={titleId} className={styles.modalTitle}>\n {title}\n </h2>\n <button\n ref={closeButtonRef}\n className={styles.closeButton}\n onClick={onClose}\n aria-label={closeAriaLabel ?? t('common.actions.close')}\n type=\"button\"\n >\n <ModalCloseSvg width={20} height={20} aria-hidden=\"true\" />\n </button>\n </div>\n <div className={styles.modalContent}>{children}</div>\n {footer != null && <div className={styles.modalFooter}>{footer}</div>}\n </div>\n </div>\n </>\n );\n\n if (typeof document === 'undefined') {\n return modalContent;\n }\n\n return createPortal(modalContent, document.body);\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst baseTextarea = style([\n sprinkles({\n paddingY: 2,\n paddingX: 4,\n borderRadius: 'md',\n fontSize: 'base',\n width: 'full',\n outline: 'none',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'default',\n minHeight: 24,\n resize: 'vertical',\n lineHeight: 1.5,\n }),\n {\n '::placeholder': {\n color: vars.colors.textSecondary,\n opacity: '0.7',\n },\n },\n]);\n\nconst defaultVariant = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus': {\n borderColor: vars.colors.primary,\n boxShadow: `0 0 0 3px ${vars.colors.primaryLight}`,\n },\n },\n },\n]);\n\nconst errorVariant = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'error',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus': {\n boxShadow: `0 0 0 3px color-mix(in srgb, ${vars.colors.error} 20%, transparent)`,\n },\n },\n },\n]);\n\nconst smallSize = sprinkles({\n paddingY: 1,\n paddingX: 2,\n fontSize: 'sm',\n minHeight: 18,\n});\n\nconst mediumSize = sprinkles({\n paddingY: 2,\n paddingX: 4,\n fontSize: 'base',\n minHeight: 24,\n});\n\nconst largeSize = sprinkles({\n paddingY: 4,\n paddingX: 6,\n fontSize: 'lg',\n minHeight: 32,\n});\n\nexport const textarea = recipe({\n base: baseTextarea,\n variants: {\n variant: {\n default: defaultVariant,\n error: errorVariant,\n },\n size: {\n small: smallSize,\n medium: mediumSize,\n large: largeSize,\n },\n fullWidth: {\n true: sprinkles({ width: 'full' }),\n false: sprinkles({ width: 'auto' }),\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'medium',\n fullWidth: true,\n },\n});\n\nexport type TextareaVariants = RecipeVariants<typeof textarea>;\n","import { type JSX, type Ref, type TextareaHTMLAttributes } from 'react';\n\nimport { textarea, type TextareaVariants } from './textarea.css.js';\n\ntype VariantProp = NonNullable<TextareaVariants>['variant'];\ntype SizeProp = NonNullable<TextareaVariants>['size'];\ntype FullWidthProp = NonNullable<TextareaVariants>['fullWidth'];\n\nexport type Props = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n variant?: VariantProp;\n size?: SizeProp;\n fullWidth?: FullWidthProp;\n ref?: Ref<HTMLTextAreaElement>;\n};\n\nexport const Textarea = (props: Props): JSX.Element => {\n const { variant, size, fullWidth, ref: textareaRef, ...rest } = props;\n const { className, rows, ...textareaProps } = rest;\n\n const computedClassName = textarea({ variant, size, fullWidth });\n const mergedClassName = [computedClassName, className]\n .filter((value) => {\n return value != null && value !== '';\n })\n .join(' ');\n\n let resolvedClassName: string | undefined;\n if (mergedClassName !== '') {\n resolvedClassName = mergedClassName;\n }\n\n const resolvedRows = rows ?? 4;\n\n return (\n <textarea\n ref={textareaRef}\n className={resolvedClassName}\n rows={resolvedRows}\n {...textareaProps}\n />\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const card = sprinkles({\n width: 'full',\n borderRadius: 'xl',\n backgroundColor: 'brandSecondaryOrange-20',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 4,\n});\n\nexport const title = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const content = sprinkles({\n padding: 6,\n});\n","import React, { type JSX, useMemo } from 'react';\n\nimport * as styles from './Card.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n headerActions?: React.ReactNode;\n title?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n contentClassName?: string;\n};\n\nexport const Card = (props: Props): JSX.Element => {\n const { title, children, headerActions, className, contentClassName } = props;\n\n const header = useMemo(() => {\n if (title == null) {\n return null;\n }\n\n return (\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n {headerActions}\n </div>\n );\n }, [headerActions, title]);\n\n const rootClass = cx(styles.card, className);\n const contentClass = cx(styles.content, contentClassName);\n\n return (\n <div className={rootClass}>\n {header}\n <div className={contentClass}>{children}</div>\n </div>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarHomeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M3 9L12 2L21 9V20C21 20.5304 20.7893 21.0391 20.4142 21.4142C20.0391 21.7893 19.5304 22 19 22H5C4.46957 22 3.96086 21.7893 3.58579 21.4142C3.21071 21.0391 3 20.5304 3 20V9Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 22V12H15V22\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { vars } from '../../../theme/themeContract.js';\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nconst displayInlineFlex = 'inline-flex';\n\nexport const breadcrumb = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const breadcrumbList = sprinkles({\n display: 'flex',\n alignItems: 'center',\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n gap: 3,\n});\n\nexport const breadcrumbItem = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const breadcrumbSection = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 1,\n});\n\nexport const breadcrumbLabel = sprinkles({\n fontSize: '2xs',\n fontWeight: 'semibold',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n color: 'textMuted',\n lineHeight: 1,\n});\n\nexport const breadcrumbNameRow = sprinkles({\n display: displayInlineFlex,\n alignItems: 'center',\n gap: 2,\n});\n\nexport const breadcrumbChevron = sprinkles({\n color: 'current',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const breadcrumbChevronOpen = sprinkles({\n rotate: 180,\n color: 'text',\n});\n\nexport const breadcrumbLink = style([\n sprinkles({\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n display: displayInlineFlex,\n alignItems: 'center',\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n textDecoration: 'none',\n lineHeight: 1.2,\n }),\n {\n ':hover': {\n color: vars.colors.primary,\n textDecoration: 'none',\n },\n ':focus': {\n outline: 'none',\n color: vars.colors.primary,\n },\n },\n]);\n\nexport const breadcrumbSeparator = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'textMuted',\n fontSize: 'sm',\n fontWeight: 'bold',\n});\n\nexport const breadcrumbChevronButton = style([\n sprinkles({\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n minWidth: 6,\n minHeight: 6,\n borderRadius: 'md',\n borderWidth: 0,\n borderStyle: 'none',\n backgroundColor: 'backgroundSecondary',\n color: 'text',\n cursor: 'pointer',\n padding: 0,\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: vars.colors.backgroundTertiary,\n color: vars.colors.text,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const homeLink = sprinkles({\n display: displayInlineFlex,\n alignItems: 'center',\n justifyContent: 'center',\n height: 8,\n borderRadius: 'sm',\n color: 'text',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const homeIcon = sprinkles({\n color: 'current',\n});\n\nconst popoverIn = keyframes({\n '0%': {\n opacity: 0,\n transform: 'translateY(-6px) scale(0.98)',\n },\n '100%': {\n opacity: 1,\n transform: 'translateY(0) scale(1)',\n },\n});\n\nexport const popoverPanel = style([\n sprinkles({\n padding: 2,\n minWidth: 64,\n maxWidth: '26rem',\n boxShadow: 'inkGlow',\n transformOrigin: 'topLeft',\n }),\n {\n animation: `${popoverIn} 160ms ease`,\n },\n]);\n\nexport const popoverContent = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const popoverHeader = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n});\n\nexport const popoverTitle = sprinkles({\n fontSize: 'xs',\n fontWeight: 'semibold',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n color: 'textMuted',\n});\n\nexport const popoverSearch = sprinkles({\n display: 'flex',\n});\n\nexport const popoverList = sprinkles({\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n maxHeight: 64,\n overflowY: 'auto',\n});\n\nexport const popoverItem = style([\n sprinkles({\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n paddingRight: 3,\n paddingLeft: 3,\n paddingTop: 2,\n paddingBottom: 2,\n borderRadius: 'md',\n textDecoration: 'none',\n color: 'text',\n }),\n {\n ':hover': {\n backgroundColor: vars.colors.backgroundSecondary,\n color: vars.colors.text,\n },\n ':focus': {\n outline: `2px solid ${vars.colors.primaryLight}`,\n outlineOffset: 2,\n },\n },\n]);\n\nexport const popoverItemActive = sprinkles({\n backgroundColor: 'primaryLight',\n color: 'primary',\n});\n\nexport const popoverItemName = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n});\n\nexport const popoverItemDescription = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n});\n\nexport const popoverEmpty = sprinkles({\n padding: 2,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChevronDownSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\n// Container only wraps the trigger now; menu content is portaled to body.\nexport const container = sprinkles({\n position: 'relative',\n});\n\n// Base visual styling for the dropdown content. Position (top/left) is applied inline.\nexport const content = sprinkles({\n backgroundColor: 'white',\n borderRadius: 'xl',\n zIndex: 'modal',\n overflow: 'hidden',\n});\n\nexport const contentPositioned = sprinkles({\n position: 'fixed',\n top: 0,\n left: 0,\n});\n\nexport const hidden = sprinkles({\n display: 'none',\n});\n\nexport const focusOutlineReset = sprinkles({\n outline: 'none',\n});\n\nexport const menu = sprinkles({\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n});\n\nexport const menuItem = sprinkles({\n cursor: 'pointer',\n});\n","import {\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n useCallback,\n type ReactNode,\n type ReactElement,\n type JSX,\n type Ref,\n type AriaRole,\n type HTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n createContext,\n useContext,\n isValidElement,\n cloneElement,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport * as classes from './dropdown.css.js';\nimport { cx } from '../../../theme/tools.js';\n\n// Types\nexport type DropdownPlacement =\n | 'bottom-start'\n | 'bottom-end'\n | 'top-start'\n | 'top-end';\n\ntype TriggerAriaHaspopup =\n | true\n | 'menu'\n | 'listbox'\n | 'tree'\n | 'grid'\n | 'dialog';\n\nconst triggerAriaHaspopupRoles: ReadonlySet<string> = new Set([\n 'menu',\n 'listbox',\n 'tree',\n 'grid',\n 'dialog',\n]);\n\ninterface DropdownContextValue {\n close: () => void;\n open: () => void;\n isOpen: boolean;\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null);\n/**\n * Access the nearest Dropdown context. Throws if used outside a <Dropdown />.\n */\nexport const useDropdown = (): DropdownContextValue => {\n const ctx = useContext(DropdownContext);\n if (ctx == null) {\n throw new Error('useDropdown must be used within a <Dropdown />');\n }\n return ctx;\n};\n\nexport interface DropdownProps {\n trigger: ReactElement | ((isOpen: boolean) => ReactElement);\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n placement?: DropdownPlacement;\n offset?: number;\n matchTriggerWidth?: boolean;\n open?: boolean; // controlled\n defaultOpen?: boolean; // uncontrolled\n onOpenChange?: (open: boolean) => void;\n closeOnItemClick?: boolean;\n portalContainer?: HTMLElement | null;\n contentRole?: AriaRole;\n contentAriaLabel?: string;\n // Accessible label if trigger is an icon only\n ariaLabel?: string;\n}\n\ninterface PositionState {\n top: number;\n left: number;\n width?: number;\n}\n\nconst isForwardRefComponent = (type: unknown): boolean => {\n if (type == null || typeof type !== 'object') {\n return false;\n }\n return (\n (type as { $$typeof?: symbol }).$$typeof === Symbol.for('react.forward_ref')\n );\n};\n\n/**\n * A scalable, portal-based dropdown component with basic collision handling,\n * controlled/uncontrolled modes, accessibility attributes, and optional\n * trigger width matching. Content is rendered in a React portal (default: document.body).\n */\nexport const Dropdown = ({\n trigger,\n children,\n className,\n contentClassName,\n placement = 'bottom-start',\n offset = 4,\n matchTriggerWidth = true,\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnItemClick = false,\n portalContainer,\n contentRole = 'menu',\n contentAriaLabel,\n ariaLabel,\n}: DropdownProps): JSX.Element => {\n const isControlled = open != null;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n let isOpen = uncontrolledOpen;\n if (isControlled) {\n isOpen = Boolean(open);\n }\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<PositionState | null>(null);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const toggle = useCallback(() => {\n setOpen(!isOpen);\n }, [isOpen, setOpen]);\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n const openFn = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n // Positioning logic\n const computePosition = useCallback(() => {\n const triggerEl = triggerRef.current;\n const contentEl = contentRef.current;\n if (triggerEl == null) {\n return;\n }\n if (contentEl == null) {\n return;\n }\n\n const rect = triggerEl.getBoundingClientRect();\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'bottom-start':\n top = rect.bottom + offset;\n left = rect.left;\n break;\n case 'bottom-end':\n top = rect.bottom + offset;\n left = rect.right - contentEl.offsetWidth;\n break;\n case 'top-start':\n top = rect.top - contentEl.offsetHeight - offset;\n left = rect.left;\n break;\n case 'top-end':\n top = rect.top - contentEl.offsetHeight - offset;\n left = rect.right - contentEl.offsetWidth;\n break;\n default:\n top = rect.bottom + offset;\n left = rect.left;\n }\n\n // Keep within viewport (basic collision handling)\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let width: number | undefined;\n if (matchTriggerWidth) {\n width = rect.width;\n }\n const contentWidth = width ?? contentEl.offsetWidth;\n\n if (left + contentWidth > vw - 4) {\n left = Math.max(4, vw - contentWidth - 4);\n }\n if (left < 4) left = 4;\n const contentHeight = contentEl.offsetHeight;\n if (top + contentHeight > vh - 4) {\n // Try flip to top if bottom overflows and initial was bottom\n if (placement.startsWith('bottom')) {\n const flippedTop = rect.top - contentHeight - offset;\n if (flippedTop >= 4) {\n top = flippedTop;\n } else {\n top = Math.max(4, vh - contentHeight - 4);\n }\n } else {\n top = Math.max(4, vh - contentHeight - 4);\n }\n }\n if (top < 4) top = 4;\n\n setPosition({ top, left, width });\n }, [placement, offset, matchTriggerWidth]);\n\n useLayoutEffect(() => {\n if (isOpen) computePosition();\n }, [isOpen, computePosition, children]);\n\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n const handle = () => {\n computePosition();\n };\n window.addEventListener('resize', handle);\n window.addEventListener('scroll', handle, true);\n\n return () => {\n window.removeEventListener('resize', handle);\n window.removeEventListener('scroll', handle, true);\n };\n }, [isOpen, computePosition]);\n\n // Outside click & Escape\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n const onDocMouseDown = (e: globalThis.MouseEvent) => {\n const target = e.target as Node;\n if (\n containerRef.current != null &&\n contentRef.current != null &&\n !containerRef.current.contains(target) &&\n !contentRef.current.contains(target)\n ) {\n close();\n }\n };\n const onKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('mousedown', onDocMouseDown);\n document.addEventListener('keydown', onKey);\n\n return () => {\n document.removeEventListener('mousedown', onDocMouseDown);\n document.removeEventListener('keydown', onKey);\n };\n }, [isOpen, close]);\n\n // Keyboard navigation basic (ArrowDown focuses first focusable)\n useEffect(() => {\n if (!isOpen) return;\n const firstFocusable = contentRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n firstFocusable?.focus();\n }, [isOpen]);\n\n // Close on item click if enabled\n useEffect(() => {\n if (!isOpen || !closeOnItemClick) {\n return undefined;\n }\n const handler = (e: globalThis.MouseEvent) => {\n if (contentRef.current?.contains(e.target as Node)) {\n close();\n }\n };\n document.addEventListener('click', handler, { capture: true });\n\n return () => {\n document.removeEventListener('click', handler, true);\n };\n }, [isOpen, closeOnItemClick, close]);\n\n let triggerElement = trigger;\n if (typeof trigger === 'function') {\n triggerElement = trigger(isOpen);\n }\n\n if (!isValidElement(triggerElement)) {\n throw new Error('Dropdown trigger must be a React element.');\n }\n\n const isHostElement = typeof triggerElement.type === 'string';\n const isButtonElement = isHostElement && triggerElement.type === 'button';\n const canAttachRef =\n isHostElement ||\n typeof triggerElement.type === 'function' ||\n isForwardRefComponent(triggerElement.type);\n\n if (!canAttachRef) {\n throw new Error(\n 'Dropdown trigger must be a DOM element or component that accepts a ref.',\n );\n }\n\n const triggerElementRef =\n (triggerElement.props as { ref?: Ref<HTMLElement> }).ref ??\n (triggerElement as ReactElement & { ref?: Ref<HTMLElement> }).ref;\n const setTriggerRef = (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof triggerElementRef === 'function') {\n triggerElementRef(node);\n } else if (triggerElementRef != null) {\n triggerElementRef.current = node;\n }\n };\n\n const triggerProps = triggerElement.props as HTMLAttributes<HTMLElement> & {\n type?: string;\n };\n\n const handleTriggerClick = (event: ReactMouseEvent<HTMLElement>) => {\n triggerProps.onClick?.(event);\n if (event.defaultPrevented) {\n return;\n }\n toggle();\n };\n\n const handleTriggerKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n triggerProps.onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n };\n\n let triggerAriaHaspopup: TriggerAriaHaspopup = true;\n if (triggerAriaHaspopupRoles.has(contentRole)) {\n triggerAriaHaspopup = contentRole as TriggerAriaHaspopup;\n }\n\n const mergedTriggerProps: Record<string, unknown> = {\n onClick: handleTriggerClick,\n 'aria-haspopup': triggerAriaHaspopup,\n 'aria-expanded': isOpen,\n };\n\n if (ariaLabel != null && ariaLabel !== '') {\n mergedTriggerProps['aria-label'] = ariaLabel;\n }\n\n if (isButtonElement) {\n if (triggerProps.type == null) {\n mergedTriggerProps.type = 'button';\n }\n } else {\n mergedTriggerProps.onKeyDown = handleTriggerKeyDown;\n if (triggerProps.role == null) {\n mergedTriggerProps.role = 'button';\n }\n if (triggerProps.tabIndex == null) {\n mergedTriggerProps.tabIndex = 0;\n }\n }\n\n mergedTriggerProps.ref = setTriggerRef;\n\n let contentStyles: React.CSSProperties = {};\n if (position != null) {\n contentStyles = {\n top: position.top,\n left: position.left,\n width: position.width,\n };\n }\n\n const portalTarget = portalContainer ?? document.body;\n\n const contextValue: DropdownContextValue = {\n close,\n open: openFn,\n isOpen,\n };\n\n let dropdownContent: JSX.Element | null = null;\n if (isOpen) {\n dropdownContent = createPortal(\n <div\n ref={contentRef}\n role={contentRole}\n aria-label={contentAriaLabel}\n className={cx(\n classes.content,\n classes.contentPositioned,\n contentClassName,\n )}\n style={contentStyles}\n >\n {children}\n </div>,\n portalTarget,\n );\n }\n\n return (\n <DropdownContext.Provider value={contextValue}>\n <div className={cx(classes.container, className)} ref={containerRef}>\n {cloneElement(triggerElement, mergedTriggerProps)}\n </div>\n {dropdownContent}\n </DropdownContext.Provider>\n );\n};\n","import { type JSX, useMemo, useState } from 'react';\nimport { Link } from '@plumile/router';\nimport { Input } from '../../atoms/input/Input.js';\nimport { useDropdown } from '../dropdown/Dropdown.js';\nimport { cx } from '../../../theme/tools.js';\n\nimport * as styles from './breadcrumbNavigation.css.js';\nimport type { BreadcrumbMenuItem } from './types.js';\n\ntype Props = {\n items: readonly BreadcrumbMenuItem[];\n selectedId?: string | null;\n searchPlaceholder: string;\n searchAriaLabel: string;\n emptyLabel: string;\n emptyMatchesLabel: string;\n};\n\nexport const BreadcrumbMenuPopover = ({\n items,\n selectedId,\n searchPlaceholder,\n searchAriaLabel,\n emptyLabel,\n emptyMatchesLabel,\n}: Props): JSX.Element => {\n const { close } = useDropdown();\n const [query, setQuery] = useState('');\n const normalizedQuery = query.trim().toLowerCase();\n\n const filteredItems = useMemo(() => {\n if (normalizedQuery === '') {\n return items;\n }\n\n return items.filter((item) => {\n return item.name.toLowerCase().includes(normalizedQuery);\n });\n }, [items, normalizedQuery]);\n\n let emptyStateLabel: string;\n if (normalizedQuery === '') {\n emptyStateLabel = emptyLabel;\n } else {\n emptyStateLabel = emptyMatchesLabel;\n }\n\n return (\n <div className={styles.popoverContent}>\n <div className={styles.popoverSearch}>\n <Input\n type=\"search\"\n size=\"small\"\n fullWidth\n placeholder={searchPlaceholder}\n value={query}\n onChange={(event) => {\n setQuery(event.target.value);\n }}\n aria-label={searchAriaLabel}\n />\n </div>\n <ul className={styles.popoverList}>\n {filteredItems.length === 0 && (\n <li className={styles.popoverEmpty}>{emptyStateLabel}</li>\n )}\n {filteredItems.map((item) => {\n const itemClassName = cx(styles.popoverItem, {\n [styles.popoverItemActive]: item.id === selectedId,\n });\n\n let descriptionNode: JSX.Element | null = null;\n if (item.description != null && item.description !== '') {\n descriptionNode = (\n <span className={styles.popoverItemDescription}>\n {item.description}\n </span>\n );\n }\n\n return (\n <li key={item.id}>\n <Link\n to={item.to}\n className={itemClassName}\n onClick={() => {\n close();\n }}\n >\n <span className={styles.popoverItemName}>{item.name}</span>\n {descriptionNode}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n","import { type JSX } from 'react';\nimport { Link } from '@plumile/router';\nimport { ChevronDownSvg } from '../../../icons/ChevronDownSvg.js';\nimport { Dropdown } from '../dropdown/Dropdown.js';\nimport { cx } from '../../../theme/tools.js';\n\nimport * as styles from './breadcrumbNavigation.css.js';\nimport { BreadcrumbMenuPopover } from './BreadcrumbMenuPopover.js';\nimport type { BreadcrumbMenuConfig, BreadcrumbNode } from './types.js';\n\ntype Props = {\n node: BreadcrumbNode;\n menu?: BreadcrumbMenuConfig;\n ariaLabel: string;\n searchPlaceholder: string;\n searchAriaLabel: string;\n emptyLabel: string;\n emptyMatchesLabel: string;\n};\n\nexport const BreadcrumbMenuDropdown = ({\n node,\n menu,\n ariaLabel,\n searchPlaceholder,\n searchAriaLabel,\n emptyLabel,\n emptyMatchesLabel,\n}: Props): JSX.Element => {\n const menuItems = menu?.items ?? [];\n\n if (menu == null) {\n return (\n <div className={styles.breadcrumbSection}>\n <div className={styles.breadcrumbNameRow}>\n <Link to={node.to} className={styles.breadcrumbLink}>\n {node.name}\n </Link>\n </div>\n </div>\n );\n }\n\n return (\n <div className={styles.breadcrumbSection}>\n {/* <span className={styles.breadcrumbLabel}>{sectionLabel}</span> */}\n <div className={styles.breadcrumbNameRow}>\n <Link to={node.to} className={styles.breadcrumbLink}>\n {node.name}\n </Link>\n <Dropdown\n trigger={(isOpen) => {\n return (\n <button type=\"button\" className={styles.breadcrumbChevronButton}>\n <ChevronDownSvg\n width={14}\n height={14}\n className={cx(styles.breadcrumbChevron, {\n [styles.breadcrumbChevronOpen]: isOpen,\n })}\n />\n </button>\n );\n }}\n ariaLabel={ariaLabel}\n placement=\"bottom-start\"\n matchTriggerWidth={false}\n contentRole=\"dialog\"\n contentAriaLabel={ariaLabel}\n contentClassName={styles.popoverPanel}\n >\n <BreadcrumbMenuPopover\n items={menuItems}\n selectedId={menu.selectedId}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n emptyLabel={emptyLabel}\n emptyMatchesLabel={emptyMatchesLabel}\n />\n </Dropdown>\n </div>\n </div>\n );\n};\n","import { type JSX } from 'react';\nimport { Link } from '@plumile/router';\nimport { SidebarHomeSvg } from '../../../icons/SidebarHomeSvg.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nimport * as styles from './breadcrumbNavigation.css.js';\nimport { cx } from '../../../theme/tools.js';\nimport { BreadcrumbMenuDropdown } from './BreadcrumbMenuDropdown.js';\nimport type { BreadcrumbNavigationItem, BreadcrumbNode } from './types.js';\n\ntype Props = {\n root: BreadcrumbNode;\n rootAriaLabel: string;\n ariaLabel?: string;\n items?: readonly BreadcrumbNavigationItem[];\n className?: string;\n};\n\nexport const BreadcrumbNavigation = (props: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const { root, rootAriaLabel, ariaLabel, items = [], className } = props;\n const breadcrumbItems: JSX.Element[] = [];\n\n breadcrumbItems.push(\n <li key=\"home\" className={styles.breadcrumbItem}>\n <Link to={root.to} className={styles.homeLink} aria-label={rootAriaLabel}>\n <SidebarHomeSvg width={16} height={16} className={styles.homeIcon} />\n </Link>\n </li>,\n );\n\n for (const item of items) {\n breadcrumbItems.push(\n <li key={item.id} className={styles.breadcrumbItem}>\n <BreadcrumbMenuDropdown\n node={item.node}\n menu={item.menu}\n ariaLabel={item.labels?.ariaLabel ?? item.node.name}\n searchPlaceholder={item.labels?.searchPlaceholder ?? ''}\n searchAriaLabel={item.labels?.searchAriaLabel ?? ''}\n emptyLabel={item.labels?.emptyLabel ?? ''}\n emptyMatchesLabel={item.labels?.emptyMatchesLabel ?? ''}\n />\n </li>,\n );\n }\n\n const breadcrumbsWithSeparators = breadcrumbItems.flatMap((item, index) => {\n if (index === 0) {\n return [item];\n }\n return [\n <li\n key={`separator-${index}`}\n className={styles.breadcrumbSeparator}\n aria-hidden=\"true\"\n >\n /{/* <ChevronRightSvg width={16} height={16} /> */}\n </li>,\n item,\n ];\n });\n\n return (\n <nav\n className={cx(styles.breadcrumb, className)}\n aria-label={ariaLabel ?? t('navigation.breadcrumb')}\n >\n <ol className={styles.breadcrumbList}>{breadcrumbsWithSeparators}</ol>\n </nav>\n );\n};\n\nexport type {\n BreadcrumbNavigationItem,\n BreadcrumbNode,\n BreadcrumbMenuItem,\n BreadcrumbMenuConfig,\n BreadcrumbMenuLabels,\n} from './types.js';\n","import { type ComponentProps, type JSX, type ReactNode } from 'react';\n\nimport { Button } from '../../atoms/button/Button.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nexport type FormActionsProps = {\n onCancel: () => void;\n cancelLabel?: string;\n submitLabel?: string;\n submitLoadingLabel?: string;\n isSubmitting?: boolean;\n submitDisabled?: boolean;\n className?: string;\n renderSubmitContent?: (isSubmitting: boolean) => ReactNode;\n submitButtonProps?: Omit<ComponentProps<typeof Button>, 'children' | 'type'>;\n cancelButtonProps?: Omit<\n ComponentProps<typeof Button>,\n 'children' | 'type' | 'variant'\n >;\n};\n\nexport const FormActions = ({\n onCancel,\n cancelLabel,\n submitLabel,\n submitLoadingLabel,\n isSubmitting = false,\n submitDisabled = false,\n className,\n renderSubmitContent,\n submitButtonProps,\n cancelButtonProps,\n}: FormActionsProps): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedCancelLabel = cancelLabel ?? t('common.actions.cancel');\n const resolvedSubmitLabel = submitLabel ?? t('common.actions.save');\n const resolvedSubmitLoadingLabel =\n submitLoadingLabel ?? t('common.actions.saving');\n const cancelProps = cancelButtonProps ?? {};\n const {\n className: cancelClassName,\n disabled: cancelDisabled,\n ...restCancelButtonProps\n } = cancelProps;\n\n const submitProps = submitButtonProps ?? {};\n const {\n className: submitClassName,\n disabled: submitDisabledOverride,\n ...restSubmitButtonProps\n } = submitProps;\n\n let submitContent: ReactNode;\n\n if (renderSubmitContent != null) {\n submitContent = renderSubmitContent(isSubmitting);\n } else if (isSubmitting) {\n submitContent = resolvedSubmitLoadingLabel;\n } else {\n submitContent = resolvedSubmitLabel;\n }\n\n const isCancelDisabled = Boolean(cancelDisabled);\n const isSubmitDisabled =\n Boolean(submitDisabled) || isSubmitting || submitDisabledOverride === true;\n\n return (\n <div className={className}>\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={onCancel}\n disabled={isCancelDisabled}\n className={cancelClassName}\n {...restCancelButtonProps}\n >\n {resolvedCancelLabel}\n </Button>\n <Button\n type=\"submit\"\n variant=\"primary\"\n disabled={isSubmitDisabled}\n className={submitClassName}\n {...restSubmitButtonProps}\n >\n {submitContent}\n </Button>\n </div>\n );\n};\n","import { createVar, fallbackVar, style } from '@vanilla-extract/css';\n\nimport { vars } from '../../../theme/themeContract.js';\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const checkboxFieldMarginBottomVar = createVar();\nexport const checkboxLabelMarginLeftVar = createVar();\n\nexport const checkboxField = style([\n sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n }),\n {\n marginBottom: fallbackVar(checkboxFieldMarginBottomVar, vars.spacing[4]),\n },\n]);\n\nexport const checkboxWrapper = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const labelWrapper = style({\n marginLeft: fallbackVar(checkboxLabelMarginLeftVar, vars.spacing[1]),\n});\n\nexport const helperText = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n marginTop: 0.5,\n});\n","import React, { type JSX } from 'react';\n\nimport { Checkbox, type CheckboxProps } from '../../atoms/checkbox/Checkbox.js';\nimport { ErrorMessage } from '../../atoms/error_message/ErrorMessage.js';\nimport { Label } from '../../atoms/label/Label.js';\nimport {\n checkboxField,\n checkboxWrapper,\n labelWrapper,\n helperText as helperTextClassName,\n} from './checkboxField.css.js';\n\nexport type Props = Omit<CheckboxProps, 'label'> & {\n id?: string;\n label?: React.ReactNode;\n error?: string;\n helperText?: string;\n};\n\nexport const CheckboxField = (props: Props): JSX.Element => {\n const { id, label, error, helperText, ...rest } = props;\n let checkboxId = `checkbox-${Math.random().toString(36).substring(2, 9)}`;\n\n if (id != null && id !== '') {\n checkboxId = id;\n }\n\n let helperTextElement: JSX.Element | null = null;\n\n if (helperText != null && helperText !== '') {\n helperTextElement = <div className={helperTextClassName}>{helperText}</div>;\n }\n\n let errorElement: JSX.Element | null = null;\n\n if (error != null && error !== '') {\n errorElement = <ErrorMessage>{error}</ErrorMessage>;\n }\n\n let labelSection: JSX.Element | null = null;\n\n if (label != null) {\n labelSection = (\n <div className={labelWrapper}>\n <Label htmlFor={checkboxId}>{label}</Label>\n {helperTextElement}\n {errorElement}\n </div>\n );\n }\n\n return (\n <div className={checkboxField}>\n <div className={checkboxWrapper}>\n <Checkbox id={checkboxId} {...rest} />\n {labelSection}\n </div>\n </div>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const FormErrorAlertSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...rest}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n </svg>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const formError = sprinkles({\n alignItems: 'center',\n borderRadius: 'md',\n color: 'error',\n display: 'flex',\n fontSize: 'sm',\n fontWeight: 'medium',\n marginBottom: 6,\n padding: 4,\n backgroundColor: 'error-10',\n});\n\nexport const icon = sprinkles({\n marginRight: 2,\n flexShrink: 0,\n});\n\nexport const message = sprinkles({\n flexGrow: 'default',\n});\n","import React, { type JSX } from 'react';\n\nimport { FormErrorAlertSvg } from '../../../icons/FormErrorAlertSvg.js';\n\nimport { formError, icon, message } from './formError.css.js';\n\ntype Props = {\n children: React.ReactNode;\n className?: string;\n};\n\nexport const FormError = ({ children, ...rest }: Props): JSX.Element | null => {\n if (children == null) {\n return null;\n }\n\n return (\n <div className={formError} role=\"alert\" {...rest}>\n <span className={icon}>\n <FormErrorAlertSvg width={16} height={16} />\n </span>\n <div className={message}>{children}</div>\n </div>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const formField = sprinkles({\n marginBottom: 6,\n width: 'full',\n});\n","import type { ComponentProps, JSX } from 'react';\n\nimport { Label } from '../../atoms/label/Label.js';\nimport { Input } from '../../atoms/input/Input.js';\nimport { ErrorMessage } from '../../atoms/error_message/ErrorMessage.js';\nimport { formField } from './formField.css.js';\n\ntype Props = Omit<ComponentProps<typeof Input>, 'id'> & {\n id?: string;\n label?: string;\n error?: string;\n required?: boolean;\n};\n\nexport const FormField = (props: Props): JSX.Element => {\n const { id, label, error, required = false, variant, ...rest } = props;\n let resolvedId = id;\n\n if (resolvedId == null || resolvedId === '') {\n let slug = 'generic';\n\n if (label != null && label !== '') {\n slug = label.toLowerCase().replace(/\\s+/g, '-');\n }\n\n resolvedId = `field-${slug}`;\n }\n\n const hasError = error != null && error !== '';\n const ariaInvalid = hasError;\n let describedById: string | undefined;\n\n if (hasError) {\n describedById = `${resolvedId}-error`;\n }\n\n let labelVariant: 'error' | 'default' = 'default';\n\n if (hasError) {\n labelVariant = 'error';\n }\n\n let inputVariant: NonNullable<Props['variant']> | 'default' = 'default';\n\n if (hasError) {\n inputVariant = 'error';\n } else if (variant != null) {\n inputVariant = variant;\n }\n\n let labelElement: JSX.Element | null = null;\n\n if (label != null) {\n labelElement = (\n <Label htmlFor={resolvedId} required={required} variant={labelVariant}>\n {label}\n </Label>\n );\n }\n\n let errorElement: JSX.Element | null = null;\n\n if (hasError) {\n errorElement = (\n <ErrorMessage id={`${resolvedId}-error`}>{error}</ErrorMessage>\n );\n }\n\n return (\n <div className={formField}>\n {labelElement}\n <Input\n id={resolvedId}\n variant={inputVariant}\n aria-invalid={ariaInvalid}\n aria-describedby={describedById}\n fullWidth\n {...rest}\n />\n {errorElement}\n </div>\n );\n};\n","import { style, keyframes } from '@vanilla-extract/css';\n\nimport { vars } from '../../../theme/themeContract.js';\nimport {\n checkboxFieldMarginBottomVar,\n checkboxLabelMarginLeftVar,\n} from '../checkbox_field/checkboxField.css.js';\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const form = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const createProjectTheme = style({\n vars: {\n [vars.colors.primary]: vars.colors.brandPrimaryRed,\n [vars.colors.primaryLight]:\n `color-mix(in srgb, ${vars.colors.brandPrimaryRed} 12%, transparent)`,\n },\n});\n\nexport const formGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const input = style([\n sprinkles({\n backgroundColor: 'background',\n borderColor: 'border',\n borderRadius: 'xl',\n borderStyle: 'solid',\n borderWidth: 'default',\n color: 'text',\n fontSize: 'sm',\n padding: 4,\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n ':focus': {\n outline: 'none',\n borderColor: vars.colors.primary,\n boxShadow: `0 0 0 1px ${vars.colors.primaryLight}`,\n },\n '::placeholder': {\n color: vars.colors.textMuted,\n },\n ':disabled': {\n backgroundColor: vars.colors.backgroundModifier,\n cursor: 'not-allowed',\n },\n },\n]);\n\nexport const errorMessage = sprinkles({\n color: 'error',\n fontSize: 'xs',\n marginTop: 1,\n});\n\nexport const formActions = sprinkles({\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 3,\n marginTop: 2,\n});\n\nexport const button = style([\n sprinkles({\n borderRadius: 'md',\n cursor: 'pointer',\n fontSize: 'sm',\n fontWeight: 'medium',\n paddingY: 2,\n paddingX: 6,\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n ':disabled': {\n opacity: 0.7,\n cursor: 'not-allowed',\n },\n },\n]);\n\nconst spin = keyframes({\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' },\n});\n\nexport const spinnerContainer = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n});\n\nexport const spinner = style([\n sprinkles({\n display: 'inline-block',\n width: 4,\n height: 4,\n border: 'spinner',\n borderRadius: '1/2',\n borderTopColor: 'white',\n }),\n {\n animation: `${spin} 0.8s linear infinite`,\n },\n]);\n\nexport const checkboxSection = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n }),\n {\n vars: {\n [checkboxFieldMarginBottomVar]: '0px',\n [checkboxLabelMarginLeftVar]: vars.spacing[2],\n },\n },\n]);\n\nexport const checkboxItem = style([\n sprinkles({\n paddingY: 3,\n paddingX: 0,\n }),\n {\n selectors: {\n '&:not(:last-child)': {\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'border',\n },\n },\n },\n]);\n","import React, {\n type Ref,\n type ComponentPropsWithoutRef,\n type FormEvent,\n type JSX,\n} from 'react';\n\nimport * as styles from './formStyles.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n onSubmit: (event: FormEvent<HTMLFormElement>) => void;\n className?: string;\n children: React.ReactNode;\n ref?: Ref<HTMLFormElement>;\n} & Omit<\n ComponentPropsWithoutRef<'form'>,\n 'onSubmit' | 'className' | 'children'\n>;\n\nexport const Form = (props: Props): JSX.Element => {\n const { onSubmit, className, children, ref, ...rest } = props;\n\n return (\n <form\n {...rest}\n ref={ref}\n onSubmit={onSubmit}\n className={cx(styles.form, className)}\n >\n {children}\n </form>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n borderRadius: 'sm',\n color: 'error',\n fontSize: 'sm',\n lineHeight: 1.4,\n marginBottom: 4,\n paddingY: 3,\n paddingX: 4,\n backgroundColor: 'error-8',\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'error-35',\n});\n","import { type HTMLAttributes, type JSX } from 'react';\n\nimport * as styles from './FormErrorBanner.css.js';\n\ntype Props = HTMLAttributes<HTMLDivElement> & {\n message?: string | null;\n};\n\nexport const FormErrorBanner = ({\n message,\n className,\n ...rest\n}: Props): JSX.Element | null => {\n const content = message?.trim();\n\n if (content == null || content === '') {\n return null;\n }\n\n const classNames = [styles.root, className]\n .filter((value) => {\n return value != null && value !== '';\n })\n .join(' ');\n\n return (\n <div className={classNames} role=\"alert\" aria-live=\"assertive\" {...rest}>\n {content}\n </div>\n );\n};\n\nexport default FormErrorBanner;\n","import {\n type Ref,\n type ComponentPropsWithoutRef,\n type JSX,\n type ReactNode,\n} from 'react';\n\nimport * as styles from './formStyles.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n className?: string;\n children: ReactNode;\n ref?: Ref<HTMLDivElement>;\n} & Omit<ComponentPropsWithoutRef<'div'>, 'className' | 'children'>;\n\nexport const FormGroup = (props: Props): JSX.Element => {\n const { className, children, ref, ...rest } = props;\n\n return (\n <div {...rest} ref={ref} className={cx(styles.formGroup, className)}>\n {children}\n </div>\n );\n};\n","import { Suspense, lazy, type JSX } from 'react';\n\nimport { useUiTranslation } from '../../../../i18n/useUiTranslation.js';\nimport { HighlightCode } from '../../highlight/HighlightCode.js';\n\ntype Props = {\n code: string;\n language?: string | null;\n badgeLabel?: string | null;\n};\n\nconst MarkdownCodeBlock = lazy(async () => {\n const module = await import('./MarkdownCodeBlock.js');\n return { default: module.MarkdownCodeBlock };\n});\n\nconst resolveBadgeLabel = (\n language: string | null | undefined,\n badgeLabel: string | null | undefined,\n): string => {\n const trimmedBadgeLabel = badgeLabel?.trim();\n if (trimmedBadgeLabel != null && trimmedBadgeLabel !== '') {\n return trimmedBadgeLabel;\n }\n const trimmedLanguage = language?.trim();\n if (trimmedLanguage != null && trimmedLanguage !== '') {\n return trimmedLanguage.toUpperCase();\n }\n return 'CODE';\n};\n\nexport const LazyMarkdownCodeBlock = ({\n code,\n language,\n badgeLabel,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedBadgeLabel = resolveBadgeLabel(language, badgeLabel);\n\n return (\n <Suspense\n fallback={\n <HighlightCode\n badgeLabel={resolvedBadgeLabel}\n copyCode={code}\n fallbackCodeText={code}\n placeholderText={t('markdown.code.loadingBlock')}\n />\n }\n >\n <MarkdownCodeBlock\n badgeLabel={badgeLabel}\n code={code}\n language={language}\n />\n </Suspense>\n );\n};\n\nexport default LazyMarkdownCodeBlock;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const fallback = sprinkles({\n overflowWrap: 'anywhere',\n whiteSpace: 'pre-wrap',\n});\n","import { Suspense, lazy, type JSX } from 'react';\n\nimport * as styles from './LazyMarkdownRenderer.css.js';\n\ntype Props = {\n content: string;\n};\n\nconst MarkdownRenderer = lazy(async () => {\n const module = await import('./MarkdownRenderer.js');\n return { default: module.MarkdownRenderer };\n});\n\nconst FallbackRenderer = ({ content }: Props): JSX.Element => {\n return <div className={styles.fallback}>{content}</div>;\n};\n\nexport const LazyMarkdownRenderer = ({ content }: Props): JSX.Element => {\n return (\n <Suspense fallback={<FallbackRenderer content={content} />}>\n <MarkdownRenderer content={content} />\n </Suspense>\n );\n};\n\nexport default LazyMarkdownRenderer;\n","import { createVar } from '@vanilla-extract/css';\n\nexport const markdownTextColorVar = createVar();\nexport const markdownFontSizeVar = createVar();\nexport const markdownLinkColorVar = createVar();\nexport const markdownLinkHoverColorVar = createVar();\nexport const markdownLinkIconColorVar = createVar();\nexport const markdownLinkDisabledColorVar = createVar();\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const content = sprinkles({\n width: 'full',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 2,\n textAlign: 'center',\n});\n\nexport const icon = sprinkles({\n fontSize: 'xl',\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: 'lg',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const description = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n maxWidth: 'md',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n justifyContent: 'center',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Card } from '../card/Card.js';\nimport * as styles from './EmptyState.css.js';\n\ntype Props = {\n title: string;\n description: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const EmptyState = ({\n title,\n description,\n icon,\n actions,\n className,\n}: Props): JSX.Element => {\n let iconElement: JSX.Element | null = null;\n if (icon != null) {\n iconElement = <div className={styles.icon}>{icon}</div>;\n }\n\n let actionsElement: JSX.Element | null = null;\n if (actions != null) {\n actionsElement = <div className={styles.actions}>{actions}</div>;\n }\n\n return (\n <Card className={className} contentClassName={styles.content}>\n {iconElement}\n <h2 className={styles.title}>{title}</h2>\n <p className={styles.description}>{description}</p>\n {actionsElement}\n </Card>\n );\n};\n\nexport default EmptyState;\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n justifyContent: 'center',\n});\n\nconst tabBase = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n borderTopLeftRadius: 'md',\n borderTopRightRadius: 'md',\n paddingX: 4,\n paddingY: 2,\n fontSize: 'sm',\n color: 'textSecondary',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n borderBottomWidth: 2,\n borderBottomColor: 'transparent',\n fontWeight: 'medium',\n textDecoration: 'none',\n outline: 'none',\n position: 'relative',\n }),\n {\n marginBottom: '-1px',\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n color: vars.colors.primary,\n borderBottomColor: vars.colors.primary,\n },\n },\n },\n]);\n\nexport const tabRecipe = recipe({\n base: tabBase,\n variants: {\n state: {\n default: style({\n selectors: {\n '&:hover': {\n color: vars.colors.primary,\n borderBottomColor: vars.colors.primaryLight,\n },\n },\n }),\n active: sprinkles({\n color: 'primary',\n borderBottomColor: 'primary',\n fontWeight: 'semibold',\n }),\n disabled: sprinkles({\n color: 'textMuted',\n pointerEvents: 'none',\n cursor: 'not-allowed',\n }),\n },\n },\n defaultVariants: {\n state: 'default',\n },\n});\n\nexport type TabRecipeVariants = RecipeVariants<typeof tabRecipe>;\n","import {\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type JSX,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { Link, useLocation } from '@plumile/router';\n\nimport * as styles from './tabs.css.js';\n\nexport type TabsSelectEvent = MouseEvent<HTMLButtonElement | HTMLAnchorElement>;\n\ntype LinkComponentProps = ComponentPropsWithoutRef<typeof Link>;\ntype RouterLinkProps = LinkComponentProps &\n AnchorHTMLAttributes<HTMLAnchorElement>;\nconst RouterLink = Link as unknown as (props: RouterLinkProps) => JSX.Element;\n\ntype BaseTabItem = {\n id: string;\n label: ReactNode;\n disabled?: boolean;\n};\n\ntype NavigationTabItem = BaseTabItem & {\n to: NonNullable<LinkComponentProps['to']>;\n};\n\nexport type TabItem = NavigationTabItem;\n\nexport type TabsProps = {\n items: TabItem[];\n ariaLabel?: string;\n};\n\nexport const Tabs = (props: TabsProps): JSX.Element => {\n const { items, ariaLabel } = props;\n const { pathname } = useLocation();\n\n return (\n <nav aria-label={ariaLabel} className={styles.container}>\n {items.map((item) => {\n const { disabled, id, label, to } = item;\n const isActive = pathname === to;\n\n let ariaDisabled: true | undefined;\n if (disabled) {\n ariaDisabled = true;\n }\n\n type TabState = NonNullable<\n Parameters<typeof styles.tabRecipe>[0]\n >['state'];\n let tabState: TabState = 'default';\n let tabIndex: number | undefined;\n if (disabled) {\n tabState = 'disabled';\n tabIndex = -1;\n } else if (isActive) {\n tabState = 'active';\n }\n\n const handleLinkClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (disabled) {\n event.preventDefault();\n }\n };\n\n let ariaCurrent: 'page' | undefined;\n if (isActive) {\n ariaCurrent = 'page';\n }\n\n return (\n <RouterLink\n key={id}\n exact\n aria-current={ariaCurrent}\n aria-disabled={ariaDisabled}\n className={styles.tabRecipe({ state: tabState })}\n to={to}\n tabIndex={tabIndex}\n onClick={handleLinkClick}\n >\n {label}\n </RouterLink>\n );\n })}\n </nav>\n );\n};\n","import { keyframes, style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const viewport = sprinkles({\n position: 'fixed',\n right: 4,\n bottom: 4,\n zIndex: 'modal',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nconst slideIn = keyframes({\n from: { transform: 'translateY(10px)', opacity: 0 },\n to: { transform: 'translateY(0)', opacity: 1 },\n});\n\nexport const toast = style([\n sprinkles({\n backgroundColor: 'white',\n borderColor: 'border',\n borderStyle: 'solid',\n borderWidth: 'default',\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n paddingX: 4,\n paddingY: 3,\n borderRadius: 'lg',\n boxShadow: 'lg',\n }),\n {\n width: 'min(28rem, calc(100vw - 2rem))',\n animation: `${slideIn} 140ms ease-out`,\n },\n]);\n\nexport const kindRecipe = recipe({\n variants: {\n kind: {\n info: { borderColor: vars.colors['blue-200'] },\n warning: { borderColor: vars.colors['amber-200'] },\n error: { borderColor: vars.colors['red-200'] },\n },\n },\n defaultVariants: {\n kind: 'info',\n },\n});\n\nexport type KindVariants = RecipeVariants<typeof kindRecipe>;\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 2,\n});\n\nexport const title = sprinkles({\n fontWeight: 'semibold',\n});\n\nexport const message = sprinkles({\n fontSize: 'sm',\n});\n\nexport const actions = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n marginTop: 1,\n});\n\nexport const closeButton = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n borderStyle: 'none',\n borderWidth: 0,\n backgroundColor: 'transparent',\n cursor: 'pointer',\n }),\n]);\n\nexport const progressTrack = style([\n sprinkles({\n marginTop: 1,\n borderRadius: 'full',\n }),\n {\n height: 4,\n backgroundColor: vars.colors['blue-50'],\n overflow: 'hidden',\n },\n]);\n\nconst progressFill = keyframes({\n from: { width: '0%' },\n to: { width: '100%' },\n});\n\nexport const progressBar = style([\n {\n height: '100%',\n width: '0%',\n backgroundColor: vars.colors['blue-400'],\n animationName: progressFill,\n animationTimingFunction: 'linear',\n animationFillMode: 'forwards',\n },\n]);\n","export const INFO_TOAST_DURATION_MS = 15_000;\n","import { type JSX, type ReactNode, useMemo } from 'react';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\nimport { Button } from '../../atoms/button/Button.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nimport * as styles from './toast.css.js';\nimport { cx } from '../../../theme/tools.js';\nimport { INFO_TOAST_DURATION_MS } from './constants.js';\n\nexport type ToastKind = NonNullable<\n NonNullable<RecipeVariants<typeof styles.kindRecipe>>['kind']\n>;\n\nexport type ToastAction = {\n id: string;\n label: string;\n onClick: () => void;\n};\n\nexport type ToastItem = {\n id: string;\n kind?: ToastKind;\n title: ReactNode;\n message?: ReactNode;\n actions?: readonly ToastAction[];\n};\n\nexport type ToastViewportProps = {\n toasts: readonly ToastItem[];\n onDismiss: (toastId: string) => void;\n dismissLabel?: string;\n className?: string;\n};\n\nexport const ToastViewport = ({\n toasts,\n onDismiss,\n dismissLabel,\n className,\n}: ToastViewportProps): JSX.Element | null => {\n const { t } = useUiTranslation();\n const resolvedDismissLabel = dismissLabel ?? t('toast.dismissAriaLabel');\n\n const items = useMemo(() => {\n return toasts.map((toast) => {\n const kind = toast.kind ?? 'info';\n const actions = toast.actions ?? [];\n\n let messageNode: JSX.Element | null = null;\n if (toast.message != null) {\n messageNode = <div className={styles.message}>{toast.message}</div>;\n }\n\n let actionsNode: JSX.Element | null = null;\n if (actions.length > 0) {\n actionsNode = (\n <div className={styles.actions}>\n {actions.map((action) => {\n return (\n <Button\n key={action.id}\n type=\"button\"\n size=\"small\"\n variant=\"secondary\"\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n );\n })}\n </div>\n );\n }\n\n let progressNode: JSX.Element | null = null;\n if (kind === 'info') {\n progressNode = (\n <div className={styles.progressTrack} aria-hidden=\"true\">\n <div\n className={styles.progressBar}\n style={{ animationDuration: `${INFO_TOAST_DURATION_MS}ms` }}\n />\n </div>\n );\n }\n\n return (\n <div\n key={toast.id}\n className={cx(styles.toast, styles.kindRecipe({ kind }))}\n >\n <div className={styles.header}>\n <div className={styles.title}>{toast.title}</div>\n <button\n type=\"button\"\n className={styles.closeButton}\n aria-label={resolvedDismissLabel}\n onClick={() => {\n onDismiss(toast.id);\n }}\n >\n <ModalCloseSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n </div>\n {messageNode}\n {actionsNode}\n {progressNode}\n </div>\n );\n });\n }, [onDismiss, resolvedDismissLabel, toasts]);\n\n if (toasts.length === 0) {\n return null;\n }\n\n return <div className={cx(styles.viewport, className)}>{items}</div>;\n};\n","import {\n createContext,\n useEffect,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type JSX,\n type ReactNode,\n} from 'react';\n\nimport {\n ToastViewport,\n type ToastItem,\n type ToastKind,\n} from './ToastViewport.js';\nimport { INFO_TOAST_DURATION_MS } from './constants.js';\n\nexport type ToastApi = {\n push: (toast: Omit<ToastItem, 'id'> & { id?: string }) => string;\n dismiss: (toastId: string) => void;\n clear: () => void;\n info: (title: ReactNode, message?: ReactNode) => string;\n warning: (title: ReactNode, message?: ReactNode) => string;\n error: (title: ReactNode, message?: ReactNode) => string;\n};\n\nexport type ToastProviderProps = {\n children: ReactNode;\n maxToasts?: number;\n};\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nconst pushWithKind = (api: ToastApi, kind: ToastKind) => {\n return (title: ReactNode, message?: ReactNode): string => {\n return api.push({ kind, title, message });\n };\n};\n\nexport const __test = {\n pushWithKind,\n} as const;\n\nexport const ToastProvider = ({\n children,\n maxToasts = 4,\n}: ToastProviderProps): JSX.Element => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const counter = useRef(0);\n const infoToastTimers = useRef(\n new Map<string, ReturnType<typeof setTimeout>>(),\n );\n\n const dismiss = useCallback((toastId: string) => {\n const timer = infoToastTimers.current.get(toastId);\n if (timer != null) {\n clearTimeout(timer);\n infoToastTimers.current.delete(toastId);\n }\n setToasts((prev) => {\n return prev.filter((t) => {\n return t.id !== toastId;\n });\n });\n }, []);\n\n const clear = useCallback(() => {\n infoToastTimers.current.forEach((timer) => {\n clearTimeout(timer);\n });\n infoToastTimers.current.clear();\n setToasts([]);\n }, []);\n\n const push = useCallback(\n (toast: Omit<ToastItem, 'id'> & { id?: string }): string => {\n const id = toast.id ?? `toast-${counter.current++}`;\n setToasts((prev) => {\n const next = [...prev, { ...toast, kind: toast.kind ?? 'info', id }];\n if (next.length > maxToasts) {\n return next.slice(next.length - maxToasts);\n }\n return next;\n });\n return id;\n },\n [maxToasts],\n );\n\n useEffect(() => {\n const activeInfoToastIds = new Set<string>();\n toasts.forEach((toast) => {\n if (toast.kind !== 'info') {\n return;\n }\n activeInfoToastIds.add(toast.id);\n if (infoToastTimers.current.has(toast.id)) {\n return;\n }\n const timer = setTimeout(() => {\n infoToastTimers.current.delete(toast.id);\n setToasts((prev) => {\n return prev.filter((item) => {\n return item.id !== toast.id;\n });\n });\n }, INFO_TOAST_DURATION_MS);\n infoToastTimers.current.set(toast.id, timer);\n });\n\n infoToastTimers.current.forEach((timer, toastId) => {\n if (activeInfoToastIds.has(toastId)) {\n return;\n }\n clearTimeout(timer);\n infoToastTimers.current.delete(toastId);\n });\n }, [toasts]);\n\n useEffect(() => {\n const timers = infoToastTimers.current;\n return () => {\n timers.forEach((timer) => {\n clearTimeout(timer);\n });\n timers.clear();\n };\n }, []);\n\n const api = useMemo<ToastApi>(() => {\n const base: ToastApi = {\n push,\n dismiss,\n clear,\n info: () => {\n return '';\n },\n warning: () => {\n return '';\n },\n error: () => {\n return '';\n },\n };\n return {\n ...base,\n info: pushWithKind(base, 'info'),\n warning: pushWithKind(base, 'warning'),\n error: pushWithKind(base, 'error'),\n };\n }, [clear, dismiss, push]);\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <ToastViewport toasts={toasts} onDismiss={dismiss} />\n </ToastContext.Provider>\n );\n};\n\nexport const useToast = (): ToastApi => {\n const value = useContext(ToastContext);\n if (value == null) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return value;\n};\n","/* eslint-disable no-ternary */\nimport { useState, type ChangeEvent, type FormEvent } from 'react';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\ninterface LoginFormData {\n email: string;\n password: string;\n}\n\ninterface LoginFormState {\n formData: LoginFormData;\n errors: {\n email?: string;\n password?: string;\n form?: string;\n };\n isSubmitting: boolean;\n}\n\ninterface UseLoginFormResult {\n formData: LoginFormData;\n errors: LoginFormState['errors'];\n isSubmitting: boolean;\n handleChange: (event: ChangeEvent<HTMLInputElement>) => void;\n handleSubmit: (event: FormEvent<HTMLFormElement>) => Promise<void>;\n}\n\nexport interface LoginFormAuthAdapter {\n login: (\n credentials: LoginFormData,\n ) => Promise<'success' | 'mfa-required' | 'error'>;\n beginAuthentication?: (email: string) => Promise<{\n methods: readonly string[];\n lockedUntil: string | null;\n }>;\n isLoading: boolean;\n nextStep?: string | null;\n error: { message: string } | null;\n lockedUntil?: string | null;\n availableMethods?: string[];\n}\n\n/**\n * Handles login form state, validation, and submission workflow.\n */\nexport function useLoginForm(\n auth: LoginFormAuthAdapter,\n onSuccess?: () => void,\n defaultEmail?: string,\n): UseLoginFormResult {\n const { t } = useUiTranslation();\n const [state, setState] = useState<LoginFormState>({\n formData: {\n email: defaultEmail ?? '',\n password: '',\n },\n errors: {},\n isSubmitting: false,\n });\n\n /** Validates the form data and updates error state when needed. */\n function validateForm(): boolean {\n const errors: LoginFormState['errors'] = {};\n let isValid = true;\n\n if (state.formData.email.trim().length === 0) {\n errors.email = t('auth.loginForm.errors.emailRequired');\n isValid = false;\n }\n\n if (state.formData.password.length === 0) {\n errors.password = t('auth.loginForm.errors.passwordRequired');\n isValid = false;\n } else if (state.formData.password.length < 6) {\n errors.password = t('auth.loginForm.errors.passwordMinLength', {\n minLength: 6,\n });\n isValid = false;\n }\n\n setState((prev) => {\n return {\n ...prev,\n errors,\n };\n });\n return isValid;\n }\n\n /** Handles updates to form fields and clears related errors. */\n function handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { name, value, type, checked } = event.target;\n let fieldValue: string | boolean = value;\n\n if (type === 'checkbox') {\n fieldValue = checked;\n }\n\n setState((prev) => {\n return {\n ...prev,\n formData: {\n ...prev.formData,\n [name]: fieldValue,\n },\n errors: {\n ...prev.errors,\n [name]: undefined,\n form: undefined,\n },\n };\n });\n }\n\n /** Submits the login form through the authentication hook. */\n async function handleSubmit(\n event: FormEvent<HTMLFormElement>,\n ): Promise<void> {\n event.preventDefault();\n\n if (!validateForm()) {\n return;\n }\n\n setState((prev) => {\n return {\n ...prev,\n isSubmitting: true,\n };\n });\n\n try {\n if (auth.beginAuthentication != null) {\n const result = await auth.beginAuthentication(\n state.formData.email.trim(),\n );\n const methodList = Array.isArray(result.methods) ? result.methods : [];\n if (methodList.length === 0) {\n const formErrorMessage =\n result.lockedUntil != null\n ? t('auth.loginForm.errors.lockedWithTime', {\n time: new Date(result.lockedUntil).toLocaleString(),\n })\n : t('auth.loginForm.errors.locked');\n setState((prev) => {\n return {\n ...prev,\n errors: {\n ...prev.errors,\n form: formErrorMessage,\n },\n };\n });\n return;\n }\n }\n\n const status = await auth.login({\n email: state.formData.email,\n password: state.formData.password,\n });\n\n if (status === 'success') {\n onSuccess?.();\n }\n } catch {\n // Error handling is done by the useAuth hook,\n // but we can set a form-level error here if needed\n const fallbackMessage = t('auth.loginForm.errors.loginFailed');\n const authMessage = auth.error?.message;\n let formErrorMessage = fallbackMessage;\n\n if (authMessage != null && authMessage !== '') {\n formErrorMessage = authMessage;\n }\n\n setState((prev) => {\n return {\n ...prev,\n errors: {\n ...prev.errors,\n form: formErrorMessage,\n },\n };\n });\n } finally {\n setState((prev) => {\n return {\n ...prev,\n isSubmitting: false,\n };\n });\n }\n }\n\n return {\n formData: state.formData,\n errors: state.errors,\n isSubmitting: auth.isLoading || state.isSubmitting,\n handleChange,\n handleSubmit,\n };\n}\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const form = sprinkles({\n width: 'full',\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const options = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n});\n\nexport const forgotPassword = sprinkles({\n fontSize: 'sm',\n});\n\nexport const link = sprinkles({\n color: 'primary',\n textDecoration: 'none',\n fontWeight: 'medium',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n","/* eslint-disable @typescript-eslint/no-misused-promises */\nimport type { JSX } from 'react';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\nimport { FormField } from '../../molecules/form_field/FormField.js';\nimport { Button } from '@plumile/ui';\nimport { FormError } from '../../molecules/form_error/FormError.js';\nimport { useLoginForm, type LoginFormAuthAdapter } from './useLoginForm.js';\nimport { form } from './loginForm.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n auth: LoginFormAuthAdapter;\n onSuccess?: () => void;\n defaultEmail?: string;\n submitButtonClassName?: string;\n className?: string;\n};\n\nexport const LoginForm = (props: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const { auth, onSuccess, defaultEmail, submitButtonClassName, className } =\n props;\n const { formData, errors, isSubmitting, handleChange, handleSubmit } =\n useLoginForm(auth, onSuccess, defaultEmail);\n\n let formError: JSX.Element | null = null;\n if (errors.form != null) {\n formError = <FormError>{errors.form}</FormError>;\n }\n\n return (\n <form className={cx(form, className)} onSubmit={handleSubmit} noValidate>\n {formError}\n <div>\n <FormField\n label={t('auth.loginForm.labels.email')}\n name=\"email\"\n type=\"text\"\n value={formData.email}\n onChange={handleChange}\n error={errors.email}\n placeholder={t('auth.loginForm.placeholders.email')}\n autoComplete=\"email\"\n autoFocus\n required\n />\n <FormField\n label={t('auth.loginForm.labels.password')}\n name=\"password\"\n type=\"password\"\n value={formData.password}\n onChange={handleChange}\n error={errors.password}\n placeholder={t('auth.loginForm.placeholders.password')}\n autoComplete=\"current-password\"\n required\n />\n </div>\n <Button\n type=\"submit\"\n width=\"full\"\n size=\"large\"\n className={cx(submitButtonClassName)}\n isLoading={isSubmitting}\n >\n {t('auth.loginForm.actions.submit')}\n </Button>\n </form>\n );\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst EASE_IN_OUT = 'ease-in-out';\n\nexport const sidebar = sprinkles({\n display: 'flex',\n height: 'screen',\n flexDirection: 'column',\n overflow: 'hidden',\n padding: 3,\n transitionProperty: 'width',\n transitionDuration: 300,\n transitionTimingFunction: EASE_IN_OUT,\n});\n\nexport const sidebarWidthRecipe = recipe({\n variants: {\n state: {\n collapsed: { width: vars.width[16] },\n expanded: { width: vars.width[60] },\n },\n },\n defaultVariants: {\n state: 'expanded',\n },\n});\n\nexport type SidebarWidthVariants = RecipeVariants<typeof sidebarWidthRecipe>;\n\nexport const content = sprinkles({\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n});\n\nexport const headerRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: 2,\n marginBottom: 3,\n marginTop: 0,\n padding: 2,\n borderRadius: 'xl',\n backgroundImage: 'brandDiagonal',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n transitionProperty: 'opacity',\n transitionDuration: 300,\n transitionTimingFunction: EASE_IN_OUT,\n});\n\nexport const headerActions = sprinkles({\n display: 'flex',\n width: 'full',\n justifyContent: 'flex-start',\n gap: 2,\n marginBottom: 3,\n});\n\nexport const nav = sprinkles({\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n gap: 2,\n transitionProperty: 'gap',\n transitionDuration: 300,\n transitionTimingFunction: EASE_IN_OUT,\n paddingTop: 4,\n});\n\nexport const navCollapsed = sprinkles({\n gap: 1,\n});\n\nexport const footer = sprinkles({\n marginTop: 4,\n});\n\nexport const footerCollapsed = sprinkles({\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const defaultHeaderButton = style([\n sprinkles({\n borderRadius: 'md',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'brandWhite',\n backgroundImage: 'brandDiagonal',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n boxShadow: `0 10px 20px color-mix(in srgb, ${vars.colors.black} 8%, transparent)`,\n selectors: {\n '&:hover': {\n boxShadow: `0 12px 24px color-mix(in srgb, ${vars.colors.black} 12%, transparent)`,\n transform: 'translateY(-1px)',\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.brandSecondaryOrange}`,\n },\n },\n },\n]);\n\nconst navigationLinkBase = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n borderRadius: 'lg',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n lineHeight: 1.2,\n textDecoration: 'none',\n backgroundColor: 'transparent',\n color: 'brandDarkGray',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const organizationLink = style([\n navigationLinkBase,\n sprinkles({ fontWeight: 'semibold' }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.brandLightGray,\n borderColor: vars.colors.brandSecondaryOrange,\n },\n },\n },\n]);\n\nexport const organizationLinkActive = sprinkles({\n backgroundImage: 'brandDiagonal',\n color: 'brandWhite',\n borderRadius: 'xl',\n});\n\nexport const organizationIcon = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 5,\n height: 5,\n color: 'inherit',\n fontWeight: 'semibold',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const linkLabel = sprinkles({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './sidebar.css.js';\n\nexport type SidebarContainerProps = {\n children: ReactNode;\n headerSlot?: ReactNode;\n footerSlot?: ReactNode;\n hideHeader?: boolean;\n isCollapsed?: boolean;\n showDefaultHeaderAction?: boolean;\n};\n\nexport const SidebarContainer = ({\n children,\n headerSlot,\n footerSlot,\n hideHeader = false,\n isCollapsed = false,\n}: SidebarContainerProps): JSX.Element => {\n let headerAction: ReactNode | null = null;\n if (!isCollapsed) {\n headerAction = headerSlot;\n }\n\n const shouldRenderHeader = !hideHeader && headerAction != null;\n\n let widthState: NonNullable<\n NonNullable<RecipeVariants<typeof styles.sidebarWidthRecipe>>['state']\n > = 'expanded';\n if (isCollapsed) {\n widthState = 'collapsed';\n }\n\n return (\n <aside\n className={cx(\n styles.sidebar,\n styles.sidebarWidthRecipe({ state: widthState }),\n )}\n >\n <div className={styles.content}>\n {shouldRenderHeader && (\n <div className={styles.headerActions}>{headerAction}</div>\n )}\n <nav\n className={cx(styles.nav, {\n [styles.navCollapsed]: isCollapsed,\n })}\n >\n {children}\n </nav>\n </div>\n {footerSlot != null && (\n <div\n className={cx(styles.footer, {\n [styles.footerCollapsed]: isCollapsed,\n })}\n >\n {footerSlot}\n </div>\n )}\n </aside>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChevronLeftSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChevronRightSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const GlobeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.94-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ProjectsFolderSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M22 19C22 19.5304 21.7893 20.0391 21.4142 20.4142C21.0391 20.7893 20.5304 21 20 21H4C3.46957 21 2.96086 20.7893 2.58579 20.4142C2.21071 20.0391 2 19.5304 2 19V5C2 4.46957 2.21071 3.96086 2.58579 3.58579C2.96086 3.21071 3.46957 3 4 3H9L11 6H20C20.5304 6 21.0391 6.21071 21.4142 6.58579C21.7893 6.96086 22 7.46957 22 8V19Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarInitiativesSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M19 3H5C3.89543 3 3 3.89543 3 5V19C3 20.1046 3.89543 21 5 21H19C20.1046 21 21 20.1046 21 19V5C21 3.89543 20.1046 3 19 3Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 9H21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 21V9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarPlusSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 5V19\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 12H19\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarSearchSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M11 19C15.4183 19 19 15.4183 19 11C19 6.58172 15.4183 3 11 3C6.58172 3 3 6.58172 3 11C3 15.4183 6.58172 19 11 19Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M21 21L16.65 16.65\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarSettingsSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarTasksSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M9 11L12 14L22 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M21 12V19C21 19.5304 20.7893 20.0391 20.4142 20.4142C20.0391 20.7893 19.5304 21 19 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 19V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarTeamSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M17 21V19C17 17.9391 16.5786 16.9217 15.8284 16.1716C15.0783 15.4214 14.0609 15 13 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 11C11.2091 11 13 9.20914 13 7C13 4.79086 11.2091 3 9 3C6.79086 3 5 4.79086 5 7C5 9.20914 6.79086 11 9 11Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M23 21V19C22.9993 18.1137 22.7044 17.2528 22.1614 16.5523C21.6184 15.8519 20.8581 15.3516 20 15.13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 3.13C16.8604 3.35031 17.623 3.85071 18.1676 4.55232C18.7122 5.25392 19.0078 6.11683 19.0078 7.005C19.0078 7.89318 18.7122 8.75608 18.1676 9.45769C17.623 10.1593 16.8604 10.6597 16 10.88\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\nimport { ChevronDownSvg } from '../../../icons/ChevronDownSvg.js';\nimport { ChevronLeftSvg } from '../../../icons/ChevronLeftSvg.js';\nimport { ChevronRightSvg } from '../../../icons/ChevronRightSvg.js';\nimport { GlobeSvg } from '../../../icons/GlobeSvg.js';\nimport { ProjectsFolderSvg } from '../../../icons/ProjectsFolderSvg.js';\nimport { SidebarHomeSvg } from '../../../icons/SidebarHomeSvg.js';\nimport { SidebarInitiativesSvg } from '../../../icons/SidebarInitiativesSvg.js';\nimport { SidebarPlusSvg } from '../../../icons/SidebarPlusSvg.js';\nimport { SidebarSearchSvg } from '../../../icons/SidebarSearchSvg.js';\nimport { SidebarSettingsSvg } from '../../../icons/SidebarSettingsSvg.js';\nimport { SidebarTasksSvg } from '../../../icons/SidebarTasksSvg.js';\nimport { SidebarTeamSvg } from '../../../icons/SidebarTeamSvg.js';\n\ntype Props = {\n size?: number;\n className?: string;\n};\n\nexport const HomeIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarHomeSvg width={size} height={size} className={className} />;\n};\n\nexport const TasksIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarTasksSvg width={size} height={size} className={className} />;\n};\n\nexport const InitiativesIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return (\n <SidebarInitiativesSvg width={size} height={size} className={className} />\n );\n};\n\nexport const TeamIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarTeamSvg width={size} height={size} className={className} />;\n};\n\nexport const DocumentationIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <GlobeSvg width={size} height={size} className={className} />;\n};\n\nexport const SettingsIcon = ({ size = 24, className }: Props): JSX.Element => {\n return (\n <SidebarSettingsSvg width={size} height={size} className={className} />\n );\n};\n\nexport const ProjectsIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <ProjectsFolderSvg width={size} height={size} className={className} />;\n};\n\nexport const ChevronDownIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <ChevronDownSvg width={size} height={size} className={className} />;\n};\n\nexport const ChevronRightIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <ChevronRightSvg width={size} height={size} className={className} />;\n};\n\nexport const ChevronLeftIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <ChevronLeftSvg width={size} height={size} className={className} />;\n};\n\nexport const SearchIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarSearchSvg width={size} height={size} className={className} />;\n};\n\nexport const PlusIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarPlusSvg width={size} height={size} className={className} />;\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const collapseButton = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n color: 'brandPrimaryRed',\n backgroundColor: 'brandWhite',\n height: 10,\n transitionProperty: 'default',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.brandSecondaryOrange,\n color: vars.colors.brandWhite,\n boxShadow: vars.boxShadow.brandGlow,\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.brandSecondaryOrange}`,\n },\n },\n },\n]);\n\nexport const collapseButtonStateRecipe = recipe({\n variants: {\n state: {\n collapsed: {\n width: vars.spacing[10],\n paddingInline: 0,\n },\n expanded: {\n paddingInline: vars.spacing[3],\n width: 'auto',\n },\n },\n },\n defaultVariants: {\n state: 'expanded',\n },\n});\n\nexport type CollapseButtonStateVariants = RecipeVariants<\n typeof collapseButtonStateRecipe\n>;\n\nexport const collapseButtonLabel = sprinkles({\n marginLeft: 2,\n fontSize: 'sm',\n fontWeight: 'medium',\n});\n\nexport const collapsibleSection = sprinkles({\n display: 'grid',\n transitionProperty: 'gridTemplateRowsOpacity',\n transitionDuration: 300,\n transitionTimingFunction: 'ease-in-out',\n});\n\nexport const collapsibleStateRecipe = recipe({\n variants: {\n state: {\n expanded: {\n gridTemplateRows: '1fr',\n opacity: 1,\n },\n collapsed: {\n gridTemplateRows: '0fr',\n opacity: 0,\n pointerEvents: 'none',\n },\n },\n },\n defaultVariants: {\n state: 'collapsed',\n },\n});\n\nexport type CollapsibleStateVariants = RecipeVariants<\n typeof collapsibleStateRecipe\n>;\n\nexport const collapsibleContent = sprinkles({\n marginTop: 1,\n marginLeft: 5,\n borderLeftWidth: 2,\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n paddingLeft: 3,\n overflow: 'hidden',\n});\n\nexport const collapsibleItem = style({\n selectors: {\n '&:not(:first-child)': {\n marginTop: vars.spacing[1],\n },\n },\n});\n\nexport const itemWrapper = sprinkles({\n position: 'relative',\n});\n\nconst interactiveBase = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n width: 'full',\n borderRadius: 'lg',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n lineHeight: 1.2,\n textAlign: 'left',\n backgroundColor: 'transparent',\n transitionProperty: 'default',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.brandLightGray,\n borderColor: vars.colors.brandSecondaryOrange,\n },\n '&:focus-visible': {\n outline: 'none',\n },\n },\n },\n]);\n\nexport const navButton = style([\n interactiveBase,\n sprinkles({ fontWeight: 'bold', color: 'brandDarkGray' }),\n]);\n\nconst navLinkBase = style([\n interactiveBase,\n sprinkles({ fontWeight: 'semibold', textDecoration: 'none' }),\n]);\n\nexport const navLinkRecipe = recipe({\n base: navLinkBase,\n variants: {\n state: {\n default: sprinkles({\n color: 'brandDarkGray',\n }),\n active: sprinkles({\n backgroundImage: 'brandDiagonal',\n color: 'brandWhite',\n borderColor: 'brandPrimaryRed',\n borderRadius: 'xl',\n }),\n },\n },\n defaultVariants: {\n state: 'default',\n },\n});\n\nexport type NavLinkVariants = RecipeVariants<typeof navLinkRecipe>;\n\nexport const navGapRecipe = recipe({\n variants: {\n state: {\n collapsed: sprinkles({ columnGap: 0 }),\n expanded: sprinkles({ columnGap: 3 }),\n },\n },\n defaultVariants: {\n state: 'expanded',\n },\n});\n\nexport type NavGapVariants = RecipeVariants<typeof navGapRecipe>;\n\nexport const navWithTrailingAction = sprinkles({\n paddingRight: 12,\n});\n\nexport const label = sprinkles({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n transitionProperty: 'opacity',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n});\n\nexport const iconWrapper = sprinkles({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 5,\n height: 5,\n flexShrink: 0,\n});\n\nconst fadingLayer = sprinkles({\n transitionProperty: 'opacity',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n});\n\nexport const iconBaseLayer = fadingLayer;\n\nexport const iconHiddenOnHover = style([\n fadingLayer,\n {\n selectors: {\n [`${itemWrapper}:hover &`]: { opacity: 0 },\n [`${itemWrapper}:focus-visible &`]: { opacity: 0 },\n [`${itemWrapper}:focus-within &`]: { opacity: 0 },\n },\n },\n]);\n\nexport const iconVisibleOnHover = style([\n fadingLayer,\n sprinkles({ opacity: 0 }),\n {\n selectors: {\n [`${itemWrapper}:hover &`]: { opacity: 1 },\n [`${itemWrapper}:focus-visible &`]: { opacity: 1 },\n [`${itemWrapper}:focus-within &`]: { opacity: 1 },\n },\n },\n]);\n\nexport const trailingIconWrapper = sprinkles({\n position: 'relative',\n marginLeft: 'auto',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 5,\n height: 5,\n});\n\nexport const trailingActionButton = style([\n sprinkles({\n position: 'absolute',\n top: '1/2',\n right: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n backgroundColor: 'brandWhite',\n color: 'brandPrimaryRed',\n opacity: 0,\n transitionProperty: 'default',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n transform: 'translateY(-50%)',\n selectors: {\n [`${itemWrapper}:hover &`]: { opacity: 1 },\n [`${itemWrapper}:focus-within &`]: { opacity: 1 },\n '&:hover': {\n backgroundColor: vars.colors.brandSecondaryOrange,\n color: vars.colors.brandWhite,\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.brandSecondaryOrange}`,\n opacity: 1,\n },\n },\n },\n]);\n\nexport const trailingActionIconWrapper = sprinkles({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 4,\n height: 4,\n});\n\nexport const trailingActionIconHidden = style([\n sprinkles({\n transitionProperty: 'opacity',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n [`${trailingActionButton}:hover &`]: { opacity: 0 },\n [`${trailingActionButton}:focus-visible &`]: { opacity: 0 },\n },\n },\n]);\n\nexport const trailingActionIconVisible = style([\n sprinkles({\n opacity: 0,\n transitionProperty: 'opacity',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n [`${trailingActionButton}:hover &`]: { opacity: 1 },\n [`${trailingActionButton}:focus-visible &`]: { opacity: 1 },\n },\n },\n]);\n\nconst childLinkBase = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n borderRadius: 'lg',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n fontWeight: 'medium',\n lineHeight: 1.2,\n textDecoration: 'none',\n transitionProperty: 'colors',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.brandLightGray,\n color: vars.colors.brandDarkGray,\n },\n },\n },\n]);\n\nexport const childLinkRecipe = recipe({\n base: childLinkBase,\n variants: {\n state: {\n default: sprinkles({\n color: 'brandDarkGray',\n }),\n active: sprinkles({\n backgroundColor: 'brandSecondaryOrange',\n color: 'brandWhite',\n fontWeight: 'semibold',\n }),\n },\n },\n defaultVariants: {\n state: 'default',\n },\n});\n\nexport type ChildLinkVariants = RecipeVariants<typeof childLinkRecipe>;\n\nexport const childIcon = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 4,\n height: 4,\n flexShrink: 0,\n color: 'brandPrimaryRed',\n});\n\nexport const childLabel = sprinkles({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n","import {\n type JSX,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport { Link, useLocation } from '@plumile/router';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\nimport { cx } from '../../../theme/tools.js';\nimport { ChevronLeftIcon, ChevronRightIcon } from './icons.js';\nimport * as styles from './navigationSidebar.css.js';\nimport { SidebarContainer } from './SidebarContainer.js';\n\ntype SidebarItemTrailingAction = {\n icon: ReactNode;\n hoverIcon?: ReactNode;\n label: string;\n onClick: () => void;\n};\n\ntype SidebarItem = {\n key: string;\n to: string;\n label: string;\n icon: ReactNode;\n exact?: boolean;\n hoverIcon?: ReactNode;\n trailingIcon?: ReactNode;\n trailingHoverIcon?: ReactNode;\n trailingAction?: SidebarItemTrailingAction;\n childItems?: SidebarChildItem[];\n defaultExpanded?: boolean;\n};\n\ntype SidebarChildItem = {\n key: string;\n to: string;\n label: string;\n icon?: ReactNode;\n};\n\ntype NavigationSidebarProps = {\n items: SidebarItem[];\n headerSlot?: ReactNode;\n isCollapsed?: boolean;\n onCollapsedChange?: (nextCollapsed: boolean) => void;\n showCollapseToggle?: boolean;\n};\n\nconst CollapsibleSection = ({\n id,\n isExpanded,\n children,\n}: {\n id: string;\n isExpanded: boolean;\n children: ReactNode;\n}): JSX.Element => {\n let collapsibleStateKey: NonNullable<\n NonNullable<RecipeVariants<typeof styles.collapsibleStateRecipe>>['state']\n > = 'collapsed';\n if (isExpanded) {\n collapsibleStateKey = 'expanded';\n }\n\n return (\n <div\n id={id}\n aria-hidden={!isExpanded}\n className={cx(\n styles.collapsibleSection,\n styles.collapsibleStateRecipe({ state: collapsibleStateKey }),\n )}\n >\n <div className={styles.collapsibleContent}>{children}</div>\n </div>\n );\n};\n\nconst NavigationSidebar = ({\n items,\n headerSlot,\n isCollapsed: isCollapsedProp,\n onCollapsedChange,\n showCollapseToggle = true,\n}: NavigationSidebarProps): JSX.Element => {\n const { t } = useUiTranslation();\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const [expandedState, setExpandedState] = useState<Record<string, boolean>>(\n {},\n );\n const isControlled = isCollapsedProp != null;\n const isCollapsed = isCollapsedProp ?? internalCollapsed;\n const { pathname } = useLocation();\n\n const isPathActive = (target: string, exact?: boolean): boolean => {\n if (exact === true) {\n return pathname === target;\n }\n if (pathname === target) {\n return true;\n }\n return pathname.startsWith(`${target}/`);\n };\n\n const handleToggle = useCallback((key: string, nextState: boolean) => {\n setExpandedState((prev) => {\n return {\n ...prev,\n [key]: nextState,\n };\n });\n }, []);\n\n const handleCollapseToggle = useCallback(() => {\n const nextState = !isCollapsed;\n if (!isControlled) {\n setInternalCollapsed(nextState);\n }\n onCollapsedChange?.(nextState);\n }, [isCollapsed, isControlled, onCollapsedChange]);\n\n let headerContent: ReactNode | undefined;\n if (!isCollapsed) {\n headerContent = headerSlot ?? undefined;\n }\n\n const collapseButton = useMemo(() => {\n if (!showCollapseToggle) {\n return null;\n }\n\n let CollapseIcon = ChevronLeftIcon;\n let buttonLabel = t('navigation.sidebar.actions.collapseAriaLabel');\n if (isCollapsed) {\n CollapseIcon = ChevronRightIcon;\n buttonLabel = t('navigation.sidebar.actions.expandAriaLabel');\n }\n\n let collapseState: NonNullable<\n NonNullable<\n RecipeVariants<typeof styles.collapseButtonStateRecipe>\n >['state']\n > = 'expanded';\n if (isCollapsed) {\n collapseState = 'collapsed';\n }\n\n let collapseLabel: JSX.Element | null = null;\n if (!isCollapsed) {\n collapseLabel = (\n <span className={styles.collapseButtonLabel}>\n {t('navigation.sidebar.actions.collapse')}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleCollapseToggle}\n className={cx(\n styles.collapseButton,\n styles.collapseButtonStateRecipe({ state: collapseState }),\n )}\n aria-label={buttonLabel}\n >\n <CollapseIcon size={20} />\n {collapseLabel}\n </button>\n );\n }, [handleCollapseToggle, isCollapsed, showCollapseToggle, t]);\n\n return (\n <SidebarContainer\n headerSlot={headerContent}\n footerSlot={collapseButton}\n isCollapsed={isCollapsed}\n showDefaultHeaderAction={false}\n >\n {items.map((item) => {\n const childItems = item.childItems ?? null;\n const hasChildren = childItems != null && childItems.length > 0;\n const storedExpanded = expandedState[item.key];\n let isExpanded = storedExpanded ?? item.defaultExpanded ?? false;\n const nextExpanded = !isExpanded;\n let childSectionId: string | undefined;\n const shouldRenderChildren = !isCollapsed && hasChildren;\n if (shouldRenderChildren) {\n childSectionId = `navigation-sidebar-${item.key}-children`;\n }\n\n if (hasChildren) {\n const hasActiveChild = childItems.some((child) => {\n return isPathActive(child.to);\n });\n\n if (hasActiveChild) {\n isExpanded = true;\n }\n }\n\n let trailingAction: SidebarItemTrailingAction | null = null;\n if (!isCollapsed && item.trailingAction != null) {\n trailingAction = item.trailingAction;\n }\n const showTrailingAction = trailingAction != null;\n const hasHoverIcon =\n item.hoverIcon !== undefined && item.hoverIcon !== null;\n const hasTrailingIcon =\n item.trailingIcon !== undefined && item.trailingIcon !== null;\n const hasTrailingHoverIcon =\n item.trailingHoverIcon !== undefined &&\n item.trailingHoverIcon !== null;\n const showTrailing =\n !isCollapsed &&\n !showTrailingAction &&\n (hasTrailingIcon || hasTrailingHoverIcon);\n\n let itemAriaLabel: string | undefined;\n if (isCollapsed) {\n itemAriaLabel = item.label;\n }\n\n let gapState: NonNullable<\n NonNullable<RecipeVariants<typeof styles.navGapRecipe>>['state']\n > = 'expanded';\n if (isCollapsed) {\n gapState = 'collapsed';\n }\n const gapClassName = styles.navGapRecipe({ state: gapState });\n\n let paddingClassName: string | undefined;\n if (showTrailingAction) {\n paddingClassName = styles.navWithTrailingAction;\n }\n\n let labelNode: JSX.Element | null = null;\n if (!isCollapsed) {\n labelNode = <span className={styles.label}>{item.label}</span>;\n }\n\n let hoverLayer: JSX.Element | null = null;\n if (hasHoverIcon) {\n hoverLayer = (\n <span className={styles.iconVisibleOnHover}>{item.hoverIcon}</span>\n );\n }\n\n const leadingIcon = (\n <span className={styles.iconWrapper}>\n <span\n className={cx(styles.iconBaseLayer, {\n [styles.iconHiddenOnHover]: hasHoverIcon,\n })}\n >\n {item.icon}\n </span>\n {hoverLayer}\n </span>\n );\n\n let trailingIcons: JSX.Element | null = null;\n if (showTrailing) {\n let trailingBaseLayer: JSX.Element | null = null;\n if (hasTrailingIcon) {\n trailingBaseLayer = (\n <span\n className={cx(styles.iconBaseLayer, {\n [styles.iconHiddenOnHover]: hasTrailingHoverIcon,\n })}\n >\n {item.trailingIcon}\n </span>\n );\n }\n\n let trailingHoverLayer: JSX.Element | null = null;\n if (hasTrailingHoverIcon) {\n trailingHoverLayer = (\n <span className={styles.iconVisibleOnHover}>\n {item.trailingHoverIcon}\n </span>\n );\n }\n\n trailingIcons = (\n <span className={styles.trailingIconWrapper}>\n {trailingBaseLayer}\n {trailingHoverLayer}\n </span>\n );\n }\n\n const commonContent = (\n <>\n {leadingIcon}\n {labelNode}\n {trailingIcons}\n </>\n );\n\n const handleClick = (): void => {\n if (!hasChildren || isCollapsed) {\n return;\n }\n handleToggle(item.key, nextExpanded);\n };\n\n let interactiveClassName: string;\n if (hasChildren) {\n interactiveClassName = cx(\n styles.navButton,\n gapClassName,\n paddingClassName,\n );\n } else {\n let navState: NonNullable<\n NonNullable<RecipeVariants<typeof styles.navLinkRecipe>>['state']\n > = 'default';\n if (isPathActive(item.to, item.exact)) {\n navState = 'active';\n }\n interactiveClassName = cx(\n styles.navLinkRecipe({ state: navState }),\n gapClassName,\n paddingClassName,\n );\n }\n\n let itemNode: JSX.Element;\n if (hasChildren) {\n itemNode = (\n <button\n type=\"button\"\n className={interactiveClassName}\n aria-expanded={isExpanded}\n aria-controls={childSectionId}\n aria-label={itemAriaLabel}\n onClick={handleClick}\n >\n {commonContent}\n </button>\n );\n } else {\n itemNode = (\n <Link\n to={item.to}\n className={interactiveClassName}\n exact={item.exact}\n aria-label={itemAriaLabel}\n >\n {commonContent}\n </Link>\n );\n }\n\n let trailingActionNode: JSX.Element | null = null;\n if (trailingAction != null) {\n const handleTrailingClick = (\n event: MouseEvent<HTMLButtonElement>,\n ): void => {\n event.preventDefault();\n event.stopPropagation();\n trailingAction.onClick();\n };\n\n const trailingHoverIcon = trailingAction.hoverIcon;\n const showTrailingHoverIcon =\n trailingHoverIcon !== undefined && trailingHoverIcon !== null;\n let trailingHoverContent: JSX.Element | null = null;\n if (showTrailingHoverIcon) {\n trailingHoverContent = (\n <span className={styles.trailingActionIconVisible}>\n {trailingHoverIcon}\n </span>\n );\n }\n\n trailingActionNode = (\n <button\n type=\"button\"\n aria-label={trailingAction.label}\n onClick={handleTrailingClick}\n className={styles.trailingActionButton}\n >\n <span className={styles.trailingActionIconWrapper}>\n <span className={styles.trailingActionIconHidden}>\n {trailingAction.icon}\n </span>\n {trailingHoverContent}\n </span>\n </button>\n );\n }\n\n let childList: JSX.Element | null = null;\n if (shouldRenderChildren && childSectionId != null) {\n childList = (\n <CollapsibleSection id={childSectionId} isExpanded={isExpanded}>\n {childItems.map((child) => {\n let leading: JSX.Element | null = null;\n if (child.icon != null) {\n leading = (\n <span className={styles.childIcon}>{child.icon}</span>\n );\n }\n\n let childState: NonNullable<\n NonNullable<\n RecipeVariants<typeof styles.childLinkRecipe>\n >['state']\n > = 'default';\n if (isPathActive(child.to)) {\n childState = 'active';\n }\n\n return (\n <div key={child.key} className={styles.collapsibleItem}>\n <Link\n to={child.to}\n className={styles.childLinkRecipe({ state: childState })}\n aria-label={child.label}\n >\n {leading}\n <span className={styles.childLabel}>{child.label}</span>\n </Link>\n </div>\n );\n })}\n </CollapsibleSection>\n );\n }\n\n return (\n <div key={item.key}>\n <div className={styles.itemWrapper}>\n {itemNode}\n {trailingActionNode}\n </div>\n {childList}\n </div>\n );\n })}\n </SidebarContainer>\n );\n};\n\nexport { NavigationSidebar };\nexport type {\n NavigationSidebarProps,\n SidebarChildItem,\n SidebarItem,\n SidebarItemTrailingAction,\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const mainStyle = sprinkles({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 'screen',\n width: 'full',\n backgroundColor: 'brandSecondaryOrange-10',\n});\n\nexport const formCardStyle = sprinkles({\n width: 'full',\n maxWidth: 'lg',\n borderRadius: 'xl',\n overflow: 'hidden',\n boxShadow: 'authCardGlow',\n});\n\nexport const headerStyle = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n padding: 8,\n textAlign: 'center',\n backgroundImage: 'brandBackgroundGradient',\n});\n\nexport const titleStyle = sprinkles({\n fontSize: '3xl',\n fontWeight: 'bold',\n lineHeight: 1.2,\n color: 'white',\n});\n\nexport const subtitleStyle = sprinkles({\n fontSize: 'sm',\n color: 'white',\n fontWeight: 'normal',\n opacity: 70,\n});\n\nexport const brandSubtitle = sprinkles({\n fontSize: 'base',\n fontWeight: 'normal',\n color: 'brandDarkGray',\n});\n\nexport const link = sprinkles({\n color: 'primary',\n textDecoration: 'none',\n fontWeight: 'medium',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n","import React, { type JSX } from 'react';\nimport {\n mainStyle,\n formCardStyle,\n headerStyle,\n titleStyle,\n subtitleStyle,\n} from './authLayout.css.js';\n\ntype Props = {\n title: string;\n subtitle?: string;\n children: React.ReactNode;\n};\n\nexport const AuthLayout = (props: Props): JSX.Element => {\n const { title: titleText, subtitle: subtitleText, children } = props;\n\n let subtitleElement: JSX.Element | null = null;\n if (subtitleText != null && subtitleText !== '') {\n subtitleElement = <p className={subtitleStyle}>{subtitleText}</p>;\n }\n\n return (\n <div className={mainStyle}>\n <div className={formCardStyle}>\n <div className={headerStyle}>\n <h1 className={titleStyle}>{titleText}</h1>\n {subtitleElement}\n </div>\n {children}\n </div>\n </div>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 4,\n flexWrap: 'wrap',\n});\n\nexport const left = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n flex: 1,\n});\n\nexport const headerRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n flexWrap: 'wrap',\n minWidth: 0,\n});\n\nexport const leftActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n flexShrink: 0,\n});\n\nexport const titleRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontSize: '2xl',\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'base',\n color: 'textSecondary',\n});\n\nexport const metaRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficePageHeader.css.js';\n\nexport type BackofficePageHeaderProps = {\n title: string;\n subtitle?: ReactNode;\n actions?: ReactNode;\n meta?: ReactNode;\n leftActions?: ReactNode;\n className?: string;\n};\n\nexport const BackofficePageHeader = ({\n title,\n subtitle,\n actions,\n meta,\n leftActions,\n className,\n}: BackofficePageHeaderProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <div className={styles.left}>\n <div className={styles.headerRow}>\n {leftActions != null && (\n <div className={styles.leftActions}>{leftActions}</div>\n )}\n <div className={styles.titleRow}>\n <h1 className={styles.title}>{title}</h1>\n {meta != null && <div className={styles.metaRow}>{meta}</div>}\n </div>\n </div>\n {subtitle != null &&\n (typeof subtitle !== 'string' || subtitle.trim() !== '') && (\n <p className={styles.subtitle}>{subtitle}</p>\n )}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </div>\n );\n};\n\nexport default BackofficePageHeader;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n alignItems: 'flex-start',\n width: 'full',\n alignSelf: 'stretch',\n paddingTop: 5,\n paddingX: 5,\n flex: 1,\n minHeight: 0,\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const secondaryActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const actionItem = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const primaryAction = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const content = sprinkles({\n width: 'full',\n display: 'flex',\n alignItems: 'flex-start',\n flexDirection: 'column',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { BackofficePageHeader } from '../../../backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './pageContainer.css.js';\n\nexport type PageContainerProps = {\n title: string;\n subtitle?: ReactNode;\n primaryAction?: ReactNode;\n secondaryActions?: readonly ReactNode[];\n leftAction?: ReactNode;\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n};\n\nexport const PageContainer = ({\n title,\n subtitle,\n primaryAction,\n secondaryActions,\n leftAction,\n children,\n className,\n contentClassName,\n}: PageContainerProps): JSX.Element => {\n const secondary = secondaryActions ?? [];\n const hasPrimaryAction = primaryAction != null;\n const hasSecondaryActions = secondary.length > 0;\n\n let actions: ReactNode | null = null;\n if (hasPrimaryAction || hasSecondaryActions) {\n actions = (\n <div className={styles.actions}>\n {hasSecondaryActions && (\n <div className={styles.secondaryActions}>\n {secondary.map((action, index) => {\n return (\n <div key={index} className={styles.actionItem}>\n {action}\n </div>\n );\n })}\n </div>\n )}\n {hasPrimaryAction && (\n <div className={styles.primaryAction}>{primaryAction}</div>\n )}\n </div>\n );\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <BackofficePageHeader\n title={title}\n subtitle={subtitle}\n actions={actions}\n leftActions={leftAction}\n />\n <div className={cx(styles.content, contentClassName)}>{children}</div>\n </div>\n );\n};\n\nexport default PageContainer;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n paddingLeft: 4,\n paddingTop: 4,\n});\n\nexport const headerSupplement = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const secondaryActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const actionItem = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const primaryAction = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const contentSection = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n","import { type ComponentPropsWithoutRef, type JSX, type ReactNode } from 'react';\n\nimport { BackofficePageHeader } from '../../../backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './detailPage.css.js';\n\nexport type DetailPageProps = {\n title: string;\n subtitle?: ReactNode;\n primaryAction?: ReactNode;\n secondaryActions?: readonly ReactNode[];\n headerSupplement?: ReactNode;\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n};\n\nexport type DetailPageContentProps = ComponentPropsWithoutRef<'div'> & {\n children: ReactNode;\n withBaseStyles?: boolean;\n};\n\nconst renderActions = (\n primaryAction?: ReactNode,\n secondaryActions?: readonly ReactNode[],\n): ReactNode | null => {\n const secondaryList = secondaryActions ?? [];\n const hasSecondary = secondaryList.length > 0;\n const hasPrimary = primaryAction != null;\n\n if (!hasPrimary && !hasSecondary) {\n return null;\n }\n\n return (\n <div className={styles.actions}>\n {hasSecondary && (\n <div className={styles.secondaryActions}>\n {secondaryList.map((action, index) => {\n return (\n <div key={index} className={styles.actionItem}>\n {action}\n </div>\n );\n })}\n </div>\n )}\n {hasPrimary && (\n <div className={styles.primaryAction}>{primaryAction}</div>\n )}\n </div>\n );\n};\n\nexport const DetailPage = ({\n title,\n subtitle,\n primaryAction,\n secondaryActions,\n headerSupplement,\n children,\n className,\n contentClassName,\n}: DetailPageProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <BackofficePageHeader\n title={title}\n subtitle={subtitle}\n actions={renderActions(primaryAction, secondaryActions)}\n />\n {headerSupplement != null && (\n <div className={styles.headerSupplement}>{headerSupplement}</div>\n )}\n <div className={cx(styles.content, contentClassName)}>{children}</div>\n </div>\n );\n};\n\nexport const DetailPageContent = ({\n children,\n className,\n withBaseStyles = true,\n ...rest\n}: DetailPageContentProps): JSX.Element => {\n let contentClassName: string | undefined;\n if (withBaseStyles) {\n contentClassName = cx(styles.contentSection, className);\n } else if (className != null) {\n contentClassName = className;\n }\n\n return (\n <div {...rest} className={contentClassName}>\n {children}\n </div>\n );\n};\n\nexport default DetailPage;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const chartContainer = sprinkles({\n width: 'full',\n height: {\n base: 340,\n md: 300,\n },\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'borderLight',\n borderRadius: 'lg',\n backgroundColor: 'surface',\n paddingY: 2,\n paddingX: 2,\n});\n\nexport const emptyState = sprinkles({\n width: 'full',\n minHeight: 60,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n color: 'textMuted',\n fontSize: 'sm',\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'borderLight',\n borderRadius: 'lg',\n backgroundColor: 'surface',\n paddingX: 4,\n paddingY: 4,\n});\n\nexport const tooltip = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'md',\n backgroundColor: 'surfaceElevated',\n paddingY: 2,\n paddingX: 2.5,\n boxShadow: 'lg',\n});\n\nexport const tooltipDate = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n fontWeight: 'medium',\n margin: 0,\n});\n\nexport const tooltipRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n fontSize: 'sm',\n color: 'text',\n});\n\nexport const tooltipRowLabel = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1.5,\n});\n\nexport const tooltipSwatch = sprinkles({\n width: 2,\n height: 2,\n borderRadius: 'full',\n});\n","import { ResponsiveLine, type SliceTooltipProps } from '@nivo/line';\nimport type { JSX } from 'react';\n\nimport * as styles from './metricHistoryChart.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nexport type MetricHistoryChartPoint = {\n x: string;\n y: number;\n};\n\nexport type MetricHistoryChartSerie = {\n id: string;\n label: string;\n color: string;\n unit?: string;\n data: readonly MetricHistoryChartPoint[];\n};\n\ntype SlicePointPayload = {\n seriesId: string;\n label: string;\n value: number;\n color: string;\n unit?: string;\n};\n\nexport type MetricHistoryChartProps = {\n series: readonly MetricHistoryChartSerie[];\n ariaLabel: string;\n formatValue?: (value: number, unit?: string) => string;\n formatTimestamp?: (value: string) => string;\n emptyMessage?: string;\n};\n\n/**\n * Formats metric values with an optional unit suffix.\n */\nfunction formatDefaultValue(value: number, unit?: string): string {\n const formatted = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 2,\n }).format(value);\n\n if (unit == null || unit.length === 0) {\n return formatted;\n }\n\n return `${formatted} ${unit}`;\n}\n\n/**\n * Formats an ISO timestamp for tooltip display.\n */\nfunction formatDefaultTimestamp(value: string): string {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return value;\n }\n\n return parsed.toLocaleString(undefined, {\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\n/**\n * Formats chart axis ticks as localized times.\n */\nfunction formatAxisTimestamp(value: Date): string {\n return value.toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport const MetricHistoryChart = ({\n ariaLabel,\n emptyMessage = 'No data',\n formatTimestamp = formatDefaultTimestamp,\n formatValue = formatDefaultValue,\n series,\n}: MetricHistoryChartProps): JSX.Element => {\n const visibleSeries = series.filter((serie) => {\n return serie.data.length > 0;\n });\n\n if (visibleSeries.length === 0) {\n return <div className={styles.emptyState}>{emptyMessage}</div>;\n }\n\n const metadataById = Object.fromEntries(\n visibleSeries.map((serie) => {\n return [\n serie.id,\n {\n color: serie.color,\n label: serie.label,\n unit: serie.unit,\n },\n ];\n }),\n );\n\n const data = visibleSeries.map((serie) => {\n return {\n id: serie.id,\n data: serie.data.map((point) => {\n return {\n x: new Date(point.x),\n y: point.y,\n };\n }),\n };\n });\n\n const legends = [\n {\n anchor: 'bottom' as const,\n direction: 'row' as const,\n translateY: 56,\n itemWidth: 110,\n itemHeight: 16,\n itemsSpacing: 8,\n symbolSize: 10,\n symbolShape: 'circle' as const,\n itemTextColor: vars.colors.textSecondary,\n data: visibleSeries.map((serie) => {\n return {\n id: serie.id,\n label: serie.label,\n color: serie.color,\n };\n }),\n },\n ];\n\n const sliceTooltip = ({\n slice,\n }: SliceTooltipProps<(typeof data)[number]>): JSX.Element => {\n const firstPoint = slice.points[0];\n let timestampValue = String(slice.id);\n if (firstPoint?.data.x instanceof Date) {\n timestampValue = firstPoint.data.x.toISOString();\n }\n\n const points = [...slice.points]\n .map((point): SlicePointPayload | null => {\n let value = Number(point.data.y);\n if (typeof point.data.y === 'number') {\n value = point.data.y;\n }\n\n if (Number.isNaN(value)) {\n return null;\n }\n\n const seriesId = String(point.seriesId);\n const metadata = metadataById[seriesId];\n\n return {\n seriesId,\n label: metadata?.label ?? seriesId,\n value,\n color: point.seriesColor,\n unit: metadata?.unit,\n };\n })\n .filter((point): point is SlicePointPayload => {\n return point != null;\n });\n\n return (\n <div className={styles.tooltip}>\n <p className={styles.tooltipDate}>{formatTimestamp(timestampValue)}</p>\n {points.map((point) => {\n return (\n <div\n key={`${point.seriesId}-${timestampValue}`}\n className={styles.tooltipRow}\n >\n <span className={styles.tooltipRowLabel}>\n <span\n className={styles.tooltipSwatch}\n style={{ backgroundColor: point.color }}\n aria-hidden\n />\n <span>{point.label}</span>\n </span>\n <strong>{formatValue(point.value, point.unit)}</strong>\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className={styles.chartContainer}>\n <ResponsiveLine\n data={data}\n margin={{ top: 14, right: 16, bottom: 74, left: 52 }}\n colors={(serie) => {\n return metadataById[String(serie.id)]?.color ?? vars.colors.primary;\n }}\n xScale={{\n type: 'time',\n format: 'native',\n precision: 'minute',\n useUTC: false,\n }}\n xFormat=\"time:%Y-%m-%dT%H:%M:%S.%LZ\"\n yScale={{ type: 'linear', min: 'auto', max: 'auto' }}\n curve=\"monotoneX\"\n lineWidth={2.5}\n pointSize={4}\n pointBorderWidth={2}\n pointBorderColor={{ from: 'seriesColor', modifiers: [['darker', 0.2]] }}\n enableArea\n areaOpacity={0.1}\n enableGridX={false}\n enableGridY\n axisTop={null}\n axisRight={null}\n axisBottom={{\n format: (value) => {\n if (!(value instanceof Date)) {\n return '';\n }\n\n return formatAxisTimestamp(value);\n },\n tickSize: 0,\n tickPadding: 10,\n tickValues: 'every 15 minutes',\n }}\n axisLeft={{\n tickSize: 0,\n tickPadding: 8,\n tickValues: 5,\n format: (value) => {\n if (typeof value !== 'number') {\n return '';\n }\n\n return new Intl.NumberFormat(undefined, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(value);\n },\n }}\n enablePoints\n useMesh\n legends={legends}\n theme={{\n grid: {\n line: {\n stroke: vars.colors.borderLight,\n },\n },\n axis: {\n ticks: {\n text: {\n fill: vars.colors.textMuted,\n fontSize: 12,\n },\n },\n },\n crosshair: {\n line: {\n stroke: vars.colors.border,\n strokeWidth: 1,\n strokeDasharray: '4 4',\n },\n },\n tooltip: {\n container: {\n background: 'transparent',\n boxShadow: 'none',\n padding: 0,\n },\n },\n }}\n sliceTooltip={sliceTooltip}\n enableSlices=\"x\"\n role=\"img\"\n ariaLabel={ariaLabel}\n />\n </div>\n );\n};\n\nexport default MetricHistoryChart;\n\nexport const __test = {\n formatDefaultValue,\n formatDefaultTimestamp,\n formatAxisTimestamp,\n} as const;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const chartContainer = sprinkles({\n width: 'full',\n height: {\n base: 340,\n md: 260,\n },\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'borderLight',\n borderRadius: 'lg',\n backgroundColor: 'surface',\n paddingY: 2,\n paddingX: 2,\n});\n\nexport const tooltip = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'md',\n backgroundColor: 'surfaceElevated',\n paddingY: 2,\n paddingX: 2.5,\n boxShadow: 'lg',\n});\n\nexport const tooltipDate = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n fontWeight: 'medium',\n margin: 0,\n});\n\nexport const tooltipRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n fontSize: 'sm',\n color: 'text',\n});\n\nexport const tooltipRowLabel = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1.5,\n});\n\nexport const tooltipSwatch = sprinkles({\n width: 2,\n height: 2,\n borderRadius: 'full',\n});\n","import { ResponsiveLine, type SliceTooltipProps } from '@nivo/line';\nimport type { JSX } from 'react';\n\nimport * as styles from './timeSeriesLineChart.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nexport type TimeSeriesLineChartPoint = {\n x: string;\n y: number;\n};\n\nexport type TimeSeriesLineChartSerie<Category extends string> = {\n id: Category;\n data: readonly TimeSeriesLineChartPoint[];\n};\n\ntype SlicePointPayload<Category extends string> = {\n seriesId: Category;\n data: {\n y: number;\n };\n color: string;\n};\n\nexport type TimeSeriesLineChartProps<Category extends string> = {\n series: readonly TimeSeriesLineChartSerie<Category>[];\n categoryOrder: readonly Category[];\n categoryColorById: Readonly<Record<Category, string>>;\n categoryLabel: (category: Category) => string;\n formatValue: (value: number) => string;\n ariaLabel: string;\n};\n\nconst MAX_X_TICKS = 6;\n\n/**\n * Limits the number of visible day ticks while always keeping the last point.\n */\nfunction getVisibleDayTicks<Category extends string>(\n series: readonly TimeSeriesLineChartSerie<Category>[],\n): readonly string[] {\n const firstSerie = series[0];\n if (firstSerie == null || firstSerie.data.length <= MAX_X_TICKS) {\n if (firstSerie == null) {\n return [];\n }\n\n return firstSerie.data.map((point) => {\n return point.x;\n });\n }\n\n const step = Math.ceil(firstSerie.data.length / MAX_X_TICKS);\n const visibleTicks = firstSerie.data\n .filter((_, index) => {\n return index % step === 0;\n })\n .map((point) => {\n return point.x;\n });\n\n const lastPoint = firstSerie.data.at(-1);\n if (lastPoint != null && visibleTicks.at(-1) !== lastPoint.x) {\n visibleTicks.push(lastPoint.x);\n }\n\n return visibleTicks;\n}\n\n/**\n * Formats a `YYYY-MM-DD` key into a short month/day label for the x-axis.\n */\nfunction formatDayTick(dayKey: string): string {\n const parsed = new Date(`${dayKey}T00:00:00Z`);\n return parsed.toLocaleDateString(undefined, {\n month: 'short',\n day: '2-digit',\n });\n}\n\nexport const TimeSeriesLineChart = <Category extends string>(\n props: TimeSeriesLineChartProps<Category>,\n): JSX.Element => {\n const {\n ariaLabel,\n categoryColorById,\n categoryLabel,\n categoryOrder,\n formatValue,\n series,\n } = props;\n\n const visibleTicks = getVisibleDayTicks(series);\n const categoryOrderString = categoryOrder as readonly string[];\n const isCategory = (value: string): value is Category => {\n return categoryOrderString.includes(value);\n };\n\n const legends = [\n {\n anchor: 'bottom' as const,\n direction: 'row' as const,\n translateY: 56,\n itemWidth: 90,\n itemHeight: 16,\n itemsSpacing: 8,\n symbolSize: 10,\n symbolShape: 'circle' as const,\n itemTextColor: vars.colors.textSecondary,\n data: categoryOrder.map((category) => {\n return {\n id: category,\n label: categoryLabel(category),\n color: categoryColorById[category],\n };\n }),\n },\n ];\n\n const colorById = (serie: { id: string | number }): string => {\n if (typeof serie.id !== 'string' || !isCategory(serie.id)) {\n return vars.colors.primary;\n }\n\n return categoryColorById[serie.id];\n };\n\n const sliceTooltip = ({\n slice,\n }: SliceTooltipProps<TimeSeriesLineChartSerie<Category>>): JSX.Element => {\n const dayKey = String(slice.id);\n const fallbackCategory = categoryOrder[0] ?? null;\n const points = [...slice.points]\n .map((point): SlicePointPayload<Category> | null => {\n let credits = 0;\n if (typeof point.data.y === 'number') {\n credits = point.data.y;\n }\n\n let seriesId = fallbackCategory;\n if (typeof point.seriesId === 'string' && isCategory(point.seriesId)) {\n seriesId = point.seriesId;\n }\n if (seriesId == null) {\n return null;\n }\n\n return {\n seriesId,\n data: { y: credits },\n color: point.seriesColor,\n };\n })\n .filter((point): point is SlicePointPayload<Category> => {\n return point != null;\n })\n .sort((left, right) => {\n const leftIndex = categoryOrder.indexOf(left.seriesId);\n const rightIndex = categoryOrder.indexOf(right.seriesId);\n\n return leftIndex - rightIndex;\n });\n\n return (\n <div className={styles.tooltip}>\n <p className={styles.tooltipDate}>{formatDayTick(dayKey)}</p>\n {points.map((point) => {\n return (\n <div\n key={`${dayKey}-${point.seriesId}`}\n className={styles.tooltipRow}\n >\n <span className={styles.tooltipRowLabel}>\n <span\n className={styles.tooltipSwatch}\n style={{ backgroundColor: point.color }}\n aria-hidden\n />\n <span>{categoryLabel(point.seriesId)}</span>\n </span>\n <strong>{formatValue(point.data.y)}</strong>\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className={styles.chartContainer}>\n <ResponsiveLine\n data={series}\n margin={{ top: 14, right: 16, bottom: 74, left: 52 }}\n colors={colorById}\n xScale={{ type: 'point' }}\n yScale={{ type: 'linear', min: 0, max: 'auto' }}\n curve=\"monotoneX\"\n lineWidth={2.5}\n pointSize={4}\n pointBorderWidth={2}\n pointBorderColor={{ from: 'seriesColor', modifiers: [['darker', 0.2]] }}\n enableArea\n areaOpacity={0.1}\n enableGridX={false}\n enableGridY\n axisTop={null}\n axisRight={null}\n axisBottom={{\n tickValues: visibleTicks,\n format: (value) => {\n return formatDayTick(String(value));\n },\n tickSize: 0,\n tickPadding: 10,\n }}\n axisLeft={{\n tickSize: 0,\n tickPadding: 8,\n tickValues: 5,\n format: (value) => {\n if (typeof value !== 'number') {\n return '';\n }\n\n return new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(value);\n },\n }}\n enablePoints\n useMesh\n legends={legends}\n theme={{\n grid: {\n line: {\n stroke: vars.colors.borderLight,\n },\n },\n axis: {\n ticks: {\n text: {\n fill: vars.colors.textMuted,\n fontSize: 12,\n },\n },\n },\n crosshair: {\n line: {\n stroke: vars.colors.border,\n strokeWidth: 1,\n strokeDasharray: '4 4',\n },\n },\n tooltip: {\n container: {\n background: 'transparent',\n boxShadow: 'none',\n padding: 0,\n },\n },\n }}\n sliceTooltip={sliceTooltip}\n enableSlices=\"x\"\n role=\"img\"\n ariaLabel={ariaLabel}\n />\n </div>\n );\n};\n\nexport default TimeSeriesLineChart;\n\nexport const __test = {\n formatDayTick,\n} as const;\n","import {\n createVar,\n fallbackVar,\n style,\n type StyleRule,\n} from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { vars } from '../../theme/themeContract.js';\n\nimport {\n DATA_TABLE_BREAKPOINT_ENTRIES,\n type DataTableBreakpoint,\n} from './tableBreakpoints.js';\nimport { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = recipe({\n base: sprinkles({\n display: 'flex',\n flexDirection: 'column',\n width: 'full',\n containerType: 'inline-size',\n }),\n variants: {\n kind: {\n default: sprinkles({\n backgroundColor: 'surface',\n borderColor: 'border',\n borderRadius: 'lg',\n borderStyle: 'solid',\n borderWidth: 'default',\n overflowX: 'auto',\n overflowY: 'hidden',\n }),\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n borderRadius: 'none',\n borderStyle: 'none',\n borderWidth: 0,\n overflow: 'visible',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const header = recipe({\n variants: {\n kind: {\n default: sprinkles({\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'borderSubtle',\n backgroundColor: 'surfaceMuted',\n }),\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'brandSecondaryOrange-20',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const headerRow = sprinkles({\n display: 'grid',\n width: 'full',\n alignItems: 'stretch',\n});\n\nexport const tableCellPaddingVar = createVar();\nexport const tableCellFontSizeVar = createVar();\nexport const tableEmptyRowPaddingVar = createVar();\nexport const tableRowMinHeightVar = createVar();\n\nexport const densityRecipe = recipe({\n variants: {\n density: {\n compact: {\n vars: {\n [tableCellPaddingVar]: `${vars.spacing[2]} ${vars.spacing[3]}`,\n [tableCellFontSizeVar]: vars.fontSize.sm,\n [tableEmptyRowPaddingVar]: `${vars.spacing[4]} ${vars.spacing[3]}`,\n [tableRowMinHeightVar]: vars.spacing[9],\n },\n },\n default: {\n vars: {\n [tableCellPaddingVar]: `${vars.spacing[3]} ${vars.spacing[4]}`,\n [tableCellFontSizeVar]: vars.fontSize.sm,\n [tableEmptyRowPaddingVar]: `${vars.spacing[6]} ${vars.spacing[4]}`,\n [tableRowMinHeightVar]: vars.spacing[10],\n },\n },\n comfortable: {\n vars: {\n [tableCellPaddingVar]: `${vars.spacing[3]} ${vars.spacing[5]}`,\n [tableCellFontSizeVar]: vars.fontSize.base,\n [tableEmptyRowPaddingVar]: `${vars.spacing[7]} ${vars.spacing[5]}`,\n [tableRowMinHeightVar]: vars.spacing[12],\n },\n },\n },\n },\n defaultVariants: {\n density: 'default',\n },\n});\n\nexport const headerCell = recipe({\n base: sprinkles({\n alignItems: 'center',\n display: 'flex',\n flexShrink: 0,\n gap: 2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n variants: {\n kind: {\n default: style([\n sprinkles({\n color: 'textSecondary',\n fontWeight: 'semibold',\n letterSpacing: 'capsNarrow',\n textTransform: 'uppercase',\n }),\n {\n padding: fallbackVar(\n tableCellPaddingVar,\n `${vars.spacing[3]} ${vars.spacing[4]}`,\n ),\n fontSize: fallbackVar(tableCellFontSizeVar, vars.fontSize.sm),\n minHeight: fallbackVar(tableRowMinHeightVar, vars.spacing[10]),\n selectors: {\n '&:last-child': {\n borderRight: 'none',\n },\n },\n },\n ]),\n brandTable: sprinkles({\n color: 'black-300',\n fontWeight: 'bold',\n fontSize: 'xs',\n letterSpacing: 'caps',\n textTransform: 'uppercase',\n paddingY: 4,\n paddingX: 0,\n borderRightWidth: 0,\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const body = recipe({\n base: sprinkles({\n display: 'flex',\n flexDirection: 'column',\n }),\n variants: {\n kind: {\n default: {},\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const row = recipe({\n base: sprinkles({\n alignItems: 'stretch',\n borderStyle: 'solid',\n borderWidth: 0,\n display: 'grid',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n variants: {\n kind: {\n default: style([\n sprinkles({\n backgroundColor: 'surface',\n borderBottomColor: 'borderLight',\n borderBottomWidth: 'default',\n }),\n {\n selectors: {\n '&:last-child': {\n borderBottomWidth: 0,\n },\n '&:hover': {\n backgroundColor: vars.colors.surfaceMuted,\n },\n },\n },\n ]),\n brandTable: style([\n sprinkles({\n backgroundColor: 'transparent',\n borderBottomColor: 'brandSecondaryOrange-20',\n borderBottomWidth: 'default',\n }),\n {\n selectors: {\n '&:last-child': {\n borderBottomWidth: 0,\n },\n '&:hover': {\n backgroundColor: 'transparent',\n },\n },\n },\n ]),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const rowEven = recipe({\n variants: {\n kind: {\n default: sprinkles({\n backgroundColor: 'surfaceSecondary',\n }),\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const rowOdd = recipe({\n variants: {\n kind: {\n default: sprinkles({\n backgroundColor: 'surface',\n }),\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const cell = recipe({\n base: sprinkles({\n alignItems: 'center',\n display: 'flex',\n gap: 2,\n minWidth: 0,\n overflow: 'hidden',\n }),\n variants: {\n kind: {\n default: style([\n sprinkles({\n color: 'textSecondary',\n }),\n {\n padding: fallbackVar(\n tableCellPaddingVar,\n `${vars.spacing[3]} ${vars.spacing[4]}`,\n ),\n fontSize: fallbackVar(tableCellFontSizeVar, vars.fontSize.sm),\n minHeight: fallbackVar(tableRowMinHeightVar, vars.spacing[10]),\n selectors: {\n '&:last-child': {\n borderRight: 'none',\n },\n },\n },\n ]),\n brandTable: sprinkles({\n color: 'text',\n fontWeight: 'semibold',\n fontSize: 'sm',\n paddingY: 4,\n paddingX: 0,\n borderRightWidth: 0,\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const primaryCell = sprinkles({\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const primaryHeaderCell = sprinkles({\n color: 'text',\n});\n\nexport const stickyHeader = style({\n position: 'sticky',\n top: 0,\n zIndex: vars.zIndex[10],\n});\n\nexport const alignRecipe = recipe({\n variants: {\n align: {\n left: sprinkles({\n justifyContent: 'flex-start',\n textAlign: 'left',\n }),\n center: sprinkles({\n justifyContent: 'center',\n textAlign: 'center',\n }),\n right: sprinkles({\n justifyContent: 'flex-end',\n textAlign: 'end',\n }),\n },\n },\n});\n\nexport const rowStateRecipe = recipe({\n variants: {\n state: {\n default: {},\n selected: {\n backgroundColor: vars.colors.primaryLight,\n },\n muted: {\n opacity: 0.72,\n },\n danger: {\n backgroundColor: vars.colors['red-50'],\n },\n },\n },\n});\n\nexport const emptyRow = style({\n padding: fallbackVar(\n tableEmptyRowPaddingVar,\n `${vars.spacing[6]} ${vars.spacing[4]}`,\n ),\n});\n\nexport const emptyCell = sprinkles({\n fontSize: 'base',\n color: 'textSecondary',\n textAlign: 'center',\n});\n\nconst hideBelowMap: Record<DataTableBreakpoint, StyleRule> = {} as Record<\n DataTableBreakpoint,\n StyleRule\n>;\n\nDATA_TABLE_BREAKPOINT_ENTRIES.forEach(([breakpoint, width]) => {\n hideBelowMap[breakpoint] = {\n '@container': {\n [`(max-width: ${width - 0.5}px)`]: {\n visibility: 'hidden',\n opacity: 0,\n pointerEvents: 'none',\n paddingInline: 0,\n paddingBlock: 0,\n borderRight: 'none',\n overflow: 'hidden',\n },\n },\n };\n});\n\nexport const hideBelowRecipe = recipe({\n variants: {\n minVisibleAt: hideBelowMap,\n },\n});\n","import { type CSSProperties, type JSX } from 'react';\n\nimport * as styles from './DataTable.css.js';\nimport type { DataTableBreakpoint } from './tableBreakpoints.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\nimport type { SlotClasses } from '../../styles/slots.js';\n\nexport type DataTableColumn<Row> = {\n id: string;\n header: JSX.Element | string;\n cell: (row: Row) => JSX.Element | string | null;\n minVisibleAt?: DataTableBreakpoint;\n className?: string;\n isPrimary?: boolean;\n align?: 'left' | 'center' | 'right';\n priority?: 'primary' | 'important' | 'secondary' | 'debug';\n mobileRole?:\n | 'title'\n | 'subtitle'\n | 'meta'\n | 'badge'\n | 'status'\n | 'action'\n | 'hidden';\n};\n\nexport type GetRowId<Row> = (row: Row, index: number) => string;\n\nexport type DataTableKind = NonNullable<\n Parameters<typeof styles.container>[0]\n>['kind'];\n\nexport type DataTableDensity = NonNullable<\n Parameters<typeof styles.densityRecipe>[0]\n>['density'];\n\nexport type DataTableRowState = NonNullable<\n Parameters<typeof styles.rowStateRecipe>[0]\n>['state'];\n\nexport type DataTableHeaderBehavior = {\n sticky?: boolean;\n offsetTop?: number;\n};\n\ntype DataTableSlot =\n | 'container'\n | 'header'\n | 'headerRow'\n | 'headerCell'\n | 'primaryHeaderCell'\n | 'body'\n | 'row'\n | 'rowEven'\n | 'rowOdd'\n | 'cell'\n | 'primaryCell'\n | 'emptyRow'\n | 'emptyCell';\n\nexport type DataTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n emptyState?: JSX.Element;\n className?: string;\n headerClassName?: string;\n bodyClassName?: string;\n rowClassName?: (row: Row, index: number) => string | null | undefined;\n gridTemplateClassName?: string;\n gridTemplateColumns?: string;\n kind?: DataTableKind;\n density?: DataTableDensity;\n headerBehavior?: DataTableHeaderBehavior;\n rowState?: (row: Row, index: number) => DataTableRowState;\n classes?: SlotClasses<DataTableSlot>;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n};\n\nconst DEFAULT_TEMPLATE_CELL = 'minmax(0, 1fr)';\n\nconst getVisibilityClass = (minVisibleAt?: DataTableBreakpoint) => {\n if (minVisibleAt == null) {\n return null;\n }\n\n return styles.hideBelowRecipe({ minVisibleAt });\n};\n\nconst buildInlineTemplate = (\n columnCount: number,\n gridTemplateColumns?: string,\n): CSSProperties => {\n if (typeof gridTemplateColumns === 'string' && gridTemplateColumns !== '') {\n return { gridTemplateColumns };\n }\n return {\n gridTemplateColumns: `repeat(${columnCount}, ${DEFAULT_TEMPLATE_CELL})`,\n };\n};\n\n/**\n * Generic responsive data table component.\n */\nexport const DataTable = <Row,>({\n columns,\n rows,\n getRowId,\n emptyState,\n className,\n headerClassName,\n bodyClassName,\n rowClassName,\n gridTemplateClassName,\n gridTemplateColumns,\n kind,\n density,\n headerBehavior,\n rowState,\n classes,\n ariaLabel,\n ariaLabelledBy,\n}: DataTableProps<Row>): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedKind: DataTableKind = kind ?? 'default';\n const resolvedAriaLabel = ariaLabel ?? t('common.table.label');\n let tableAriaLabel: string | undefined = resolvedAriaLabel;\n if (ariaLabelledBy != null) {\n tableAriaLabel = undefined;\n }\n const defaultEmptyState = (\n <div className={cx(styles.emptyCell, classes?.emptyCell)}>\n {t('common.table.empty')}\n </div>\n ) as JSX.Element;\n const resolvedEmptyState = emptyState ?? defaultEmptyState;\n const showEmpty = rows.length === 0;\n\n let inlineTemplateStyle: CSSProperties | undefined;\n if (gridTemplateClassName == null) {\n inlineTemplateStyle = buildInlineTemplate(\n columns.length,\n gridTemplateColumns,\n );\n }\n let headerStickyClass: string | null = null;\n if (headerBehavior?.sticky === true) {\n headerStickyClass = styles.stickyHeader;\n }\n let headerStyle: CSSProperties | undefined;\n if (headerBehavior?.offsetTop != null) {\n headerStyle = { top: headerBehavior.offsetTop };\n }\n\n const resolvedDensity: DataTableDensity = density ?? 'default';\n const sharedRowClasses: string[] = [\n styles.densityRecipe({ density: resolvedDensity }),\n ];\n if (gridTemplateClassName != null) {\n sharedRowClasses.push(gridTemplateClassName);\n }\n\n let rowsContent: JSX.Element;\n if (showEmpty) {\n rowsContent = (\n <div className={cx(styles.emptyRow, classes?.emptyRow)} role=\"row\">\n <div role=\"cell\">{resolvedEmptyState}</div>\n </div>\n );\n } else {\n rowsContent = (\n <>\n {rows.map((row, index) => {\n const rowId = getRowId(row, index);\n const rowClasses = [styles.row({ kind: resolvedKind }), classes?.row];\n const state = rowState?.(row, index);\n if (state != null) {\n rowClasses.push(styles.rowStateRecipe({ state }));\n }\n if (index % 2 === 0) {\n rowClasses.push(\n styles.rowEven({ kind: resolvedKind }),\n classes?.rowEven,\n );\n } else {\n rowClasses.push(\n styles.rowOdd({ kind: resolvedKind }),\n classes?.rowOdd,\n );\n }\n for (const sharedClass of sharedRowClasses) {\n rowClasses.push(sharedClass);\n }\n\n if (rowClassName != null) {\n const customClass = rowClassName(row, index);\n if (customClass != null) {\n rowClasses.push(customClass);\n }\n }\n\n return (\n <div\n key={rowId}\n role=\"row\"\n className={cx(...rowClasses)}\n style={inlineTemplateStyle}\n >\n {columns.map((column) => {\n const cellClasses = [\n styles.cell({ kind: resolvedKind }),\n classes?.cell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n\n if (visibilityClass != null) {\n cellClasses.push(visibilityClass);\n }\n\n if (column.className != null) {\n cellClasses.push(column.className);\n }\n if (column.isPrimary) {\n cellClasses.push(styles.primaryCell, classes?.primaryCell);\n }\n if (column.align != null) {\n cellClasses.push(styles.alignRecipe({ align: column.align }));\n }\n\n const content = column.cell(row);\n\n return (\n <div\n key={column.id}\n role=\"cell\"\n className={cx(...cellClasses)}\n >\n {content}\n </div>\n );\n })}\n </div>\n );\n })}\n </>\n );\n }\n\n return (\n <div\n className={cx(\n styles.container({ kind: resolvedKind }),\n classes?.container,\n className,\n )}\n role=\"table\"\n aria-label={tableAriaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n <div\n className={cx(\n styles.header({ kind: resolvedKind }),\n headerStickyClass,\n classes?.header,\n headerClassName,\n )}\n style={headerStyle}\n role=\"rowgroup\"\n >\n <div\n className={cx(\n styles.headerRow,\n classes?.headerRow,\n ...sharedRowClasses,\n )}\n role=\"row\"\n style={inlineTemplateStyle}\n >\n {columns.map((column) => {\n const headerClasses = [\n styles.headerCell({ kind: resolvedKind }),\n classes?.headerCell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n headerClasses.push(visibilityClass);\n }\n\n if (column.className != null) {\n headerClasses.push(column.className);\n }\n if (column.isPrimary) {\n headerClasses.push(\n styles.primaryHeaderCell,\n classes?.primaryHeaderCell,\n );\n }\n if (column.align != null) {\n headerClasses.push(styles.alignRecipe({ align: column.align }));\n }\n\n return (\n <div\n key={column.id}\n role=\"columnheader\"\n className={cx(...headerClasses)}\n >\n {column.header}\n </div>\n );\n })}\n </div>\n </div>\n\n <div\n className={cx(\n styles.body({ kind: resolvedKind }),\n classes?.body,\n bodyClassName,\n )}\n role=\"rowgroup\"\n >\n {rowsContent}\n </div>\n </div>\n );\n};\n\nexport const __test = {\n getVisibilityClass,\n buildInlineTemplate,\n} as const;\n","import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { adminSurfaceRecipe } from '../../admin/theme/adminSurface.css.js';\nimport { sprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nconst TABLET_MEDIA_QUERY = 'screen and (max-width: 767px)';\n\nexport const tableOnly = style({\n '@media': {\n [TABLET_MEDIA_QUERY]: {\n display: 'none',\n },\n },\n});\n\nexport const cardsOnly = style([\n sprinkles({\n display: 'none',\n }),\n {\n '@media': {\n [TABLET_MEDIA_QUERY]: {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n },\n },\n },\n]);\n\nexport const forceHidden = sprinkles({\n display: 'none',\n});\n\nexport const cards = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const card = recipe({\n base: style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n minWidth: 0,\n }),\n adminSurfaceRecipe({\n level: 'panel',\n radius: 'md',\n border: 'subtle',\n elevation: 'subtle',\n padding: 'md',\n }),\n {\n selectors: {\n '&:hover': {\n borderColor: vars.colors.border,\n boxShadow: vars.boxShadow.md,\n },\n },\n },\n ]),\n variants: {\n density: {\n compact: sprinkles({\n gap: 2,\n padding: 3,\n }),\n default: sprinkles({\n gap: 3,\n padding: 4,\n }),\n comfortable: sprinkles({\n gap: 3,\n padding: 4,\n }),\n },\n },\n defaultVariants: {\n density: 'compact',\n },\n});\n\nexport const cardHeader = sprinkles({\n alignItems: 'flex-start',\n display: 'flex',\n gap: 3,\n justifyContent: 'space-between',\n minWidth: 0,\n});\n\nexport const cardTitleGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const cardTitle = sprinkles({\n color: 'text',\n fontSize: 'sm',\n fontWeight: 'semibold',\n lineHeight: 'tight',\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n\nexport const cardSubtitle = sprinkles({\n color: 'textSecondary',\n fontSize: 'xs',\n lineHeight: 'tight',\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n\nexport const cardMetaGrid = sprinkles({\n display: 'grid',\n gap: 2,\n gridTemplateColumns: {\n base: 2,\n sm: 1,\n },\n});\n\nexport const cardMetaItem = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n minWidth: 0,\n});\n\nexport const cardMetaLabel = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n fontWeight: 'semibold',\n letterSpacing: 'caps',\n textTransform: 'uppercase',\n});\n\nexport const cardMetaValue = sprinkles({\n color: 'text',\n fontSize: 'sm',\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n\nexport const cardBadges = sprinkles({\n alignItems: 'center',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const cardActions = sprinkles({\n alignItems: 'center',\n display: 'flex',\n flexShrink: 0,\n justifyContent: 'flex-end',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport {\n DataTable,\n type DataTableColumn,\n type DataTableDensity,\n type DataTableProps,\n} from './DataTable.js';\nimport * as styles from './ResponsiveRecordList.css.js';\n\nexport type ResponsiveRecordListMode = 'table' | 'cards' | 'auto';\nexport type ResponsiveRecordListDensity = DataTableDensity;\n\nexport type ResponsiveRecordListColumn<Row> = DataTableColumn<Row> & {\n priority?: 'primary' | 'important' | 'secondary' | 'debug';\n mobileRole?:\n | 'title'\n | 'subtitle'\n | 'meta'\n | 'badge'\n | 'status'\n | 'action'\n | 'hidden';\n};\n\nexport type ResponsiveRecordListProps<Row> = Omit<\n DataTableProps<Row>,\n 'columns'\n> & {\n columns: readonly ResponsiveRecordListColumn<Row>[];\n mode?: ResponsiveRecordListMode;\n density?: ResponsiveRecordListDensity;\n renderAction?: (row: Row) => ReactNode;\n};\n\nconst renderCellText = <Row,>(\n column: ResponsiveRecordListColumn<Row> | null,\n row: Row,\n): ReactNode => {\n if (column == null) {\n return null;\n }\n return column.cell(row);\n};\n\nconst findColumn = <Row,>(\n columns: readonly ResponsiveRecordListColumn<Row>[],\n role: ResponsiveRecordListColumn<Row>['mobileRole'],\n): ResponsiveRecordListColumn<Row> | null => {\n return (\n columns.find((column) => {\n return column.mobileRole === role;\n }) ?? null\n );\n};\n\nconst isMetaColumn = <Row,>(\n column: ResponsiveRecordListColumn<Row>,\n): boolean => {\n if (column.mobileRole === 'hidden') {\n return false;\n }\n if (column.mobileRole === 'meta') {\n return true;\n }\n if (column.mobileRole != null) {\n return false;\n }\n return column.priority === 'important' || column.priority === 'secondary';\n};\n\nexport const ResponsiveRecordList = <Row,>({\n columns,\n rows,\n getRowId,\n mode = 'auto',\n density = 'compact',\n renderAction,\n className,\n ...tableProps\n}: ResponsiveRecordListProps<Row>): JSX.Element => {\n const titleColumn =\n findColumn(columns, 'title') ??\n columns.find((column) => {\n return column.isPrimary === true || column.priority === 'primary';\n }) ??\n columns[0] ??\n null;\n const subtitleColumn = findColumn(columns, 'subtitle');\n const badgeColumns = columns.filter((column) => {\n return column.mobileRole === 'badge' || column.mobileRole === 'status';\n });\n const metaColumns = columns.filter((column) => {\n return (\n column !== titleColumn &&\n column !== subtitleColumn &&\n isMetaColumn(column)\n );\n });\n\n let cards: JSX.Element = <>{tableProps.emptyState ?? null}</>;\n if (rows.length > 0) {\n cards = (\n <div className={styles.cards}>\n {rows.map((row, index) => {\n const rowId = getRowId(row, index);\n const title = renderCellText(titleColumn, row);\n const subtitle = renderCellText(subtitleColumn, row);\n const action = renderAction?.(row);\n let subtitleNode: JSX.Element | null = null;\n if (subtitle != null && subtitle !== '') {\n subtitleNode = (\n <div className={styles.cardSubtitle}>{subtitle}</div>\n );\n }\n let actionNode: JSX.Element | null = null;\n if (action != null) {\n actionNode = <div className={styles.cardActions}>{action}</div>;\n }\n let badgeNode: JSX.Element | null = null;\n if (badgeColumns.length > 0) {\n badgeNode = (\n <div className={styles.cardBadges}>\n {badgeColumns.map((column) => {\n return <span key={column.id}>{column.cell(row)}</span>;\n })}\n </div>\n );\n }\n let metaNode: JSX.Element | null = null;\n if (metaColumns.length > 0) {\n metaNode = (\n <dl className={styles.cardMetaGrid}>\n {metaColumns.map((column) => {\n return (\n <div key={column.id} className={styles.cardMetaItem}>\n <dt className={styles.cardMetaLabel}>{column.header}</dt>\n <dd className={styles.cardMetaValue}>\n {column.cell(row)}\n </dd>\n </div>\n );\n })}\n </dl>\n );\n }\n\n return (\n <article key={rowId} className={styles.card({ density })}>\n <div className={styles.cardHeader}>\n <div className={styles.cardTitleGroup}>\n <div className={styles.cardTitle}>{title}</div>\n {subtitleNode}\n </div>\n {actionNode}\n </div>\n {badgeNode}\n {metaNode}\n </article>\n );\n })}\n </div>\n );\n }\n\n if (mode === 'cards') {\n return <div className={className}>{cards}</div>;\n }\n\n if (mode === 'table') {\n return (\n <DataTable\n {...tableProps}\n rows={rows}\n columns={columns}\n getRowId={getRowId}\n className={className}\n density={density}\n />\n );\n }\n\n return (\n <div className={className}>\n <DataTable\n {...tableProps}\n rows={rows}\n columns={columns}\n getRowId={getRowId}\n density={density}\n className={styles.tableOnly}\n />\n <div className={styles.cardsOnly}>{cards}</div>\n </div>\n );\n};\n\nexport default ResponsiveRecordList;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const trigger = sprinkles({\n width: 'full',\n display: 'flex',\n justifyContent: 'center',\n paddingY: 2,\n});\n\nexport const loadingText = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { useEffect, useRef, type JSX } from 'react';\n\nimport * as styles from './infiniteScrollTrigger.css.js';\n\nexport type InfiniteScrollTriggerProps = {\n enabled: boolean;\n hasNext: boolean;\n isLoading: boolean;\n onTrigger: () => void;\n thresholdPx?: number;\n loadingLabel: string;\n};\n\nexport const InfiniteScrollTrigger = ({\n enabled,\n hasNext,\n isLoading,\n onTrigger,\n thresholdPx = 800,\n loadingLabel,\n}: InfiniteScrollTriggerProps): JSX.Element | null => {\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!enabled || !hasNext || isLoading) {\n return () => {};\n }\n const sentinel = sentinelRef.current;\n if (sentinel == null || typeof window === 'undefined') {\n return () => {};\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting === true) {\n onTrigger();\n }\n },\n {\n root: null,\n rootMargin: `${thresholdPx}px`,\n },\n );\n\n observer.observe(sentinel);\n\n return () => {\n observer.disconnect();\n };\n }, [enabled, hasNext, isLoading, onTrigger, thresholdPx]);\n\n if (!enabled || !hasNext) {\n return null;\n }\n\n return (\n <div ref={sentinelRef} className={styles.trigger} aria-hidden=\"true\">\n {isLoading && <span className={styles.loadingText}>{loadingLabel}</span>}\n </div>\n );\n};\n\nexport default InfiniteScrollTrigger;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nexport const tile = sprinkles({\n width: 'full',\n borderRadius: 'lg',\n backgroundColor: 'surfaceSecondary',\n padding: 4,\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const interactive = style([\n sprinkles({\n transitionProperty: 'default',\n transitionDuration: 160,\n transitionTimingFunction: 'ease',\n }),\n stateSprinkles({\n boxShadow: {\n hover: 'md',\n },\n }),\n {\n ':hover': {\n transform: 'translateY(-2px)',\n },\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: '2px',\n },\n },\n]);\n\nexport const interactiveLink = sprinkles({\n textDecoration: 'none',\n width: 'full',\n display: 'inline-flex',\n});\n\nexport const interactiveButton = sprinkles({\n all: 'unset',\n cursor: 'pointer',\n display: 'inline-flex',\n width: 'full',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 3,\n});\n\nexport const headingGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontSize: 'base',\n lineHeight: 1.4,\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'sm',\n fontWeight: 'extrabold',\n});\n\nexport const meta = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const body = sprinkles({\n fontSize: 'base',\n color: 'text',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const footer = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 3,\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n marginLeft: 'auto',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { Link } from '@plumile/router';\n\nimport * as styles from './InfoTile.css.js';\nimport { cx } from '../../theme/tools.js';\n\ntype InteractiveConfig =\n | {\n ariaLabel: string;\n href: string;\n onClick?: () => void;\n }\n | {\n ariaLabel: string;\n href?: undefined;\n onClick: () => void;\n };\n\nexport type InfoTileProps = {\n title?: ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n body?: ReactNode;\n footer?: ReactNode;\n actions?: ReactNode;\n children?: ReactNode;\n className?: string;\n interactive?: InteractiveConfig;\n};\n\nconst renderTitle = (value: ReactNode | undefined): ReactNode => {\n if (value == null) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return <p className={styles.title}>{value}</p>;\n }\n\n return <div className={styles.title}>{value}</div>;\n};\n\nconst renderSubtitle = (value: ReactNode | undefined): ReactNode => {\n if (value == null) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return <p className={styles.subtitle}>{value}</p>;\n }\n\n return <div className={styles.subtitle}>{value}</div>;\n};\n\nexport const InfoTile = (props: InfoTileProps): JSX.Element => {\n const {\n actions,\n body,\n children,\n className,\n footer,\n interactive,\n meta,\n subtitle,\n title,\n } = props;\n\n let headerActionsNode: JSX.Element | null = null;\n if (actions != null) {\n headerActionsNode = <div className={styles.actions}>{actions}</div>;\n }\n\n let metaNode: JSX.Element | null = null;\n if (meta != null) {\n metaNode = <div className={styles.meta}>{meta}</div>;\n }\n\n let footerNode: JSX.Element | null = null;\n if (footer != null) {\n footerNode = <div className={styles.footer}>{footer}</div>;\n }\n\n const content = (\n <article\n className={cx(\n styles.tile,\n {\n [styles.interactive]: interactive != null,\n },\n className,\n )}\n >\n {(title != null || subtitle != null || actions != null) && (\n <div className={styles.header}>\n <div className={styles.headingGroup}>\n {renderTitle(title)}\n {renderSubtitle(subtitle)}\n </div>\n {headerActionsNode}\n </div>\n )}\n\n {metaNode}\n\n {(body != null || children != null) && (\n <div className={styles.body}>\n {body}\n {children}\n </div>\n )}\n\n {footerNode}\n </article>\n );\n\n if (interactive == null) {\n return content;\n }\n\n if (interactive.href != null) {\n return (\n <Link\n to={interactive.href}\n aria-label={interactive.ariaLabel}\n className={styles.interactiveLink}\n onClick={interactive.onClick}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n aria-label={interactive.ariaLabel}\n className={styles.interactiveButton}\n onClick={interactive.onClick}\n >\n {content}\n </button>\n );\n};\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const stack = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n width: 'full',\n});\n\nexport const row = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n","import { type JSX } from 'react';\n\nimport { Button } from '../../atomic/atoms/button/Button.js';\nimport { ErrorMessage } from '../../atomic/atoms/error_message/ErrorMessage.js';\nimport { InfoTile } from '../tile/InfoTile.js';\n\nimport * as styles from './OperationFeedback.css.js';\n\nexport type OperationFeedbackProps = {\n errorMessage?: string | null;\n successMessage?: string | null;\n retryLabel?: string;\n onRetry?: () => void;\n};\n\nexport const OperationFeedback = ({\n errorMessage = null,\n successMessage = null,\n retryLabel,\n onRetry,\n}: OperationFeedbackProps): JSX.Element | null => {\n if (errorMessage == null && successMessage == null) {\n return null;\n }\n\n let retryAction: JSX.Element | null = null;\n if (errorMessage != null && onRetry != null && retryLabel != null) {\n retryAction = (\n <Button type=\"button\" variant=\"secondary\" onClick={onRetry}>\n {retryLabel}\n </Button>\n );\n }\n\n return (\n <div className={styles.stack}>\n {errorMessage != null && (\n <div className={styles.row} role=\"alert\">\n <ErrorMessage>{errorMessage}</ErrorMessage>\n {retryAction}\n </div>\n )}\n {successMessage != null && (\n <InfoTile\n title={successMessage}\n body={<div role=\"status\" aria-live=\"polite\" />}\n />\n )}\n </div>\n );\n};\n\nexport const MutationFeedback = OperationFeedback;\n\nexport default OperationFeedback;\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\n\nconst pulseAnimation = keyframes({\n '0%': { opacity: 0.45, transform: 'scaleX(0.94)' },\n '50%': { opacity: 1, transform: 'scaleX(1)' },\n '100%': { opacity: 0.45, transform: 'scaleX(0.94)' },\n});\n\nconst baseRoot = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: 'full',\n});\n\nexport const contentRoot = style([\n baseRoot,\n sprinkles({\n gap: 3,\n paddingTop: 10,\n paddingBottom: 10,\n borderRadius: '2xl',\n backgroundColor: 'surfaceMuted',\n }),\n {\n minHeight: '220px',\n },\n]);\n\nexport const pageRoot = style([\n baseRoot,\n sprinkles({\n minHeight: 'screen',\n gap: 4,\n backgroundColor: 'surfaceSecondary',\n }),\n]);\n\nexport const contentPulse = style([\n sprinkles({\n backgroundColor: 'borderLight',\n borderRadius: 'full',\n }),\n {\n width: '72px',\n height: '8px',\n animation: `${pulseAnimation} 1.1s ease-in-out infinite`,\n },\n]);\n\nexport const pagePulse = style([\n sprinkles({\n backgroundColor: 'surfaceMuted',\n borderRadius: 'full',\n }),\n {\n width: '96px',\n height: '10px',\n animation: `${pulseAnimation} 1.1s ease-in-out infinite`,\n },\n]);\n\nexport const label = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n margin: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { cx } from '../../theme/tools.js';\n\nimport * as styles from './routeFallback.css.js';\n\nexport type RouteFallbackVariant = 'content' | 'page';\n\nexport type RouteFallbackProps = {\n label?: ReactNode;\n className?: string;\n variant?: RouteFallbackVariant;\n};\n\n/** Displays an accessible loading fallback while route content is resolving. */\nexport function RouteFallback({\n label,\n className,\n variant = 'content',\n}: RouteFallbackProps): JSX.Element {\n const { t } = useTranslation('ui');\n const resolvedLabel = label ?? t('common.loading');\n let rootClassName = styles.contentRoot;\n let pulseClassName = styles.contentPulse;\n\n if (variant === 'page') {\n rootClassName = styles.pageRoot;\n pulseClassName = styles.pagePulse;\n }\n\n return (\n <div\n className={cx(rootClassName, className)}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <div className={pulseClassName} />\n <p className={styles.label}>{resolvedLabel}</p>\n </div>\n );\n}\n\nexport default RouteFallback;\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nconst slide = keyframes({\n '0%': { transform: 'translateX(-120%)' },\n '60%': { transform: 'translateX(30%)' },\n '100%': { transform: 'translateX(120%)' },\n});\n\nexport const root = style([\n sprinkles({\n backgroundColor: 'surfaceMuted',\n position: 'fixed',\n top: 0,\n left: 0,\n overflow: 'hidden',\n pointerEvents: 'none',\n width: 'full',\n zIndex: 50,\n }),\n {\n height: '3px',\n },\n]);\n\nexport const bar = style([\n sprinkles({\n height: 'full',\n width: '2/5',\n }),\n {\n background: `linear-gradient(90deg, ${vars.colors.primaryLight} 0%, ${vars.colors.primary} 60%, ${vars.colors.primaryLight} 100%)`,\n animation: `${slide} 1.1s ease-in-out infinite`,\n },\n]);\n","import { type JSX } from 'react';\n\nimport { cx } from '../../theme/tools.js';\n\nimport * as styles from './routePendingBar.css.js';\n\nexport type RoutePendingBarProps = {\n className?: string;\n};\n\n/** Displays a decorative indeterminate pending indicator for route transitions. */\nexport function RoutePendingBar({\n className,\n}: RoutePendingBarProps): JSX.Element {\n return (\n <div className={cx(styles.root, className)} aria-hidden=\"true\">\n <div className={styles.bar} />\n </div>\n );\n}\n\nexport default RoutePendingBar;\n","import { createContainer, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\n\nconst collectionContainer = createContainer();\n\nexport const root = style([\n sprinkles({\n width: 'full',\n minWidth: 0,\n }),\n {\n containerName: collectionContainer,\n containerType: 'inline-size',\n },\n]);\n\nexport const tableMode = style({\n display: 'block',\n '@container': {\n [`${collectionContainer} (max-width: 860px)`]: {\n display: 'none',\n },\n },\n});\n\nexport const cardsMode = style([\n sprinkles({\n display: 'none',\n }),\n {\n '@container': {\n [`${collectionContainer} (max-width: 860px)`]: {\n display: 'block',\n },\n },\n },\n]);\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './ResponsiveCollectionRenderer.css.js';\n\nexport type ResponsiveCollectionRendererProps = {\n renderTable: () => ReactNode;\n renderCards: () => ReactNode;\n};\n\nexport const ResponsiveCollectionRenderer = ({\n renderTable,\n renderCards,\n}: ResponsiveCollectionRendererProps): JSX.Element => {\n return (\n <div className={styles.root}>\n <div className={styles.tableMode}>{renderTable()}</div>\n <div className={styles.cardsMode}>{renderCards()}</div>\n </div>\n );\n};\n\nexport default ResponsiveCollectionRenderer;\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const base = sprinkles({\n width: 'full',\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n color: 'text',\n});\n\nexport const alignRecipe = recipe({\n variants: {\n align: {\n start: { justifyContent: 'flex-start', textAlign: 'left' },\n center: { justifyContent: 'center', textAlign: 'center' },\n end: { justifyContent: 'flex-end', textAlign: 'right' },\n },\n },\n defaultVariants: {\n align: 'start',\n },\n});\n\nexport type AlignRecipeVariants = RecipeVariants<typeof alignRecipe>;\n\nexport const text = sprinkles({\n color: 'text',\n});\n\nexport const number = sprinkles({\n color: 'text',\n whiteSpace: 'nowrap',\n});\n\nexport const date = sprinkles({\n color: 'text',\n whiteSpace: 'nowrap',\n});\n\nexport const muted = sprinkles({\n color: 'textSecondary',\n fontSize: 'xs',\n});\n\nexport const ellipsis = sprinkles({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const summary = sprinkles({\n whiteSpace: 'pre-wrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './TableCell.css.js';\nimport { cx } from '../../theme/tools.js';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\ntype Alignment = NonNullable<\n NonNullable<RecipeVariants<typeof styles.alignRecipe>>['align']\n>;\n\nexport type TableCellBaseProps = {\n children: ReactNode;\n className?: string;\n align?: Alignment;\n ellipsis?: boolean;\n};\n\nexport const TableCellBase = ({\n children,\n className,\n align = 'start',\n ellipsis = false,\n}: TableCellBaseProps): JSX.Element => {\n const classNames = [styles.base, styles.alignRecipe({ align }), className];\n\n if (ellipsis) {\n classNames.push(styles.ellipsis);\n }\n\n return <div className={cx(...classNames)}>{children}</div>;\n};\n","import { type JSX, type ReactNode, useMemo } from 'react';\n\nimport { Badge } from '../../atomic/atoms/badge/Badge.js';\nimport { FormattedDate } from '../../atomic/atoms/formatted-date/FormattedDate.js';\n\nimport * as styles from './TableCell.css.js';\nimport { TableCellBase, type TableCellBaseProps } from './TableCellBase.js';\nimport { cx } from '../../theme/tools.js';\n\ntype BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\n\ntype TextCellProps = {\n value?: string | null | undefined;\n fallback?: string;\n children?: ReactNode;\n ellipsis?: boolean;\n className?: string;\n};\n\ntype NumberCellProps = {\n value: number | null | undefined;\n fallback?: string;\n locale?: string;\n formatOptions?: Intl.NumberFormatOptions;\n};\n\ntype StatusCellProps = {\n label: string;\n tone: BadgeTone;\n isLoading?: boolean;\n};\n\ntype DateCellProps = {\n value: string | null | undefined;\n fallback?: string;\n locale?: string;\n options?: Intl.DateTimeFormatOptions;\n};\n\ntype BadgeCellProps = {\n label: string;\n tone: BadgeTone;\n};\n\ntype ActionsCellProps = TableCellBaseProps;\n\nconst FALLBACK_REFERENCE = '—';\nconst DEFAULT_TEXT_FALLBACK = FALLBACK_REFERENCE;\n\nconst DefaultNumberFormat: Intl.NumberFormatOptions = {\n maximumFractionDigits: 2,\n};\n\nconst DefaultDateOptions: Intl.DateTimeFormatOptions = {\n dateStyle: 'medium',\n timeStyle: 'short',\n};\n\nconst Text = ({\n value,\n fallback = DEFAULT_TEXT_FALLBACK,\n children,\n ellipsis = false,\n className,\n}: TextCellProps): JSX.Element => {\n let content: ReactNode = children ?? value;\n\n if (content == null) {\n content = fallback;\n } else if (typeof content === 'string') {\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n content = fallback;\n } else {\n content = trimmed;\n }\n }\n\n return (\n <TableCellBase ellipsis={ellipsis} className={cx(styles.text, className)}>\n {content}\n </TableCellBase>\n );\n};\n\nconst NumberCell = ({\n value,\n fallback = DEFAULT_TEXT_FALLBACK,\n locale,\n formatOptions = DefaultNumberFormat,\n}: NumberCellProps): JSX.Element => {\n const formatted = useMemo(() => {\n if (value == null || Number.isNaN(Number(value))) {\n return fallback;\n }\n\n try {\n return new Intl.NumberFormat(locale, formatOptions).format(value);\n } catch {\n return String(value);\n }\n }, [value, fallback, locale, formatOptions]);\n\n return (\n <TableCellBase align=\"end\" className={styles.number}>\n {formatted}\n </TableCellBase>\n );\n};\n\nconst Status = ({\n label,\n tone,\n isLoading = false,\n}: StatusCellProps): JSX.Element => {\n return (\n <TableCellBase>\n <Badge tone={tone} loading={isLoading}>\n {label}\n </Badge>\n </TableCellBase>\n );\n};\n\nconst DateCell = ({\n value,\n fallback = FALLBACK_REFERENCE,\n locale,\n options = DefaultDateOptions,\n}: DateCellProps): JSX.Element => {\n return (\n <TableCellBase className={styles.date}>\n <FormattedDate\n value={value}\n fallback={fallback}\n locale={locale}\n options={options}\n />\n </TableCellBase>\n );\n};\n\nconst BadgeCell = ({ label, tone }: BadgeCellProps): JSX.Element => {\n return (\n <TableCellBase>\n <Badge tone={tone}>{label}</Badge>\n </TableCellBase>\n );\n};\n\nconst Actions = ({ children, className }: ActionsCellProps): JSX.Element => {\n return (\n <TableCellBase align=\"end\" className={className}>\n {children}\n </TableCellBase>\n );\n};\n\nconst Muted = ({ children }: { children: ReactNode }): JSX.Element => {\n return <span className={styles.muted}>{children}</span>;\n};\n\nexport const TableCell = {\n Base: TableCellBase,\n Text,\n Number: NumberCell,\n Status,\n Date: DateCell,\n Badge: BadgeCell,\n Actions,\n Muted,\n};\n\nexport type { TextCellProps, NumberCellProps, StatusCellProps, DateCellProps };\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Card } from '../../atomic/molecules/card/Card.js';\n\nexport type PanelShellProps = {\n title?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n};\n\nexport const PanelShell = ({\n actions,\n children,\n className,\n contentClassName,\n title,\n}: PanelShellProps): JSX.Element => {\n return (\n <Card\n title={title}\n headerActions={actions}\n className={className}\n contentClassName={contentClassName}\n >\n {children}\n </Card>\n );\n};\n\nexport default PanelShell;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const description = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const feedback = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport { PanelShell } from './PanelShell.js';\nimport * as styles from './ActionPanel.css.js';\n\nexport type ActionPanelProps = {\n title: ReactNode;\n description?: ReactNode;\n children: ReactNode;\n actions?: ReactNode;\n feedback?: ReactNode;\n className?: string;\n};\n\nexport const ActionPanel = ({\n actions,\n children,\n className,\n description,\n feedback,\n title,\n}: ActionPanelProps): JSX.Element => {\n return (\n <PanelShell className={className}>\n <div className={styles.root}>\n <div className={styles.header}>\n <h3 className={styles.title}>{title}</h3>\n {description != null && (\n <div className={styles.description}>{description}</div>\n )}\n </div>\n <div className={styles.content}>{children}</div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n {feedback != null && (\n <div className={cx(styles.feedback)}>{feedback}</div>\n )}\n </div>\n </PanelShell>\n );\n};\n\nexport default ActionPanel;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n width: 'full',\n paddingX: 6,\n paddingY: 4,\n});\n\nexport const top = sprinkles({\n display: 'flex',\n flexDirection: { base: 'column', md: 'row' },\n alignItems: { base: 'flex-start', md: 'center' },\n justifyContent: 'space-between',\n gap: 4,\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: { base: '2xl', md: '3xl' },\n fontWeight: 'bold',\n color: 'text',\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n maxWidth: 720,\n});\n\nexport const meta = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n color: 'textSecondary',\n fontSize: 'sm',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const navStack = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './AppHeader.css.js';\n\nexport type AppHeaderProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n primaryNav?: ReactNode;\n secondaryNav?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const AppHeader = ({\n actions,\n className,\n meta,\n primaryNav,\n secondaryNav,\n subtitle,\n title,\n}: AppHeaderProps): JSX.Element => {\n return (\n <header className={cx(styles.root, className)}>\n <div className={styles.top}>\n <div className={styles.body}>\n <h1 className={styles.title}>{title}</h1>\n {subtitle != null && (\n <div className={styles.subtitle}>{subtitle}</div>\n )}\n {meta != null && <div className={styles.meta}>{meta}</div>}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </div>\n {(primaryNav != null || secondaryNav != null) && (\n <div className={styles.navStack}>\n {primaryNav}\n {secondaryNav}\n </div>\n )}\n </header>\n );\n};\n\nexport default AppHeader;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const section = sprinkles({\n width: 'full',\n display: 'flex',\n justifyContent: 'flex-start',\n});\n\nexport const inner = sprinkles({\n width: 'full',\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n});\n\nexport const headingGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontSize: '2xl',\n lineHeight: '2xl',\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const subheader = sprinkles({\n fontSize: 'base',\n color: 'textSecondary',\n margin: 0,\n});\n\nexport const metaRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const actionCluster = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n justifyContent: 'flex-end',\n});\n\nexport const actionClusterItem = sprinkles({\n display: 'inline-flex',\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const bottomFloatArea = sprinkles({\n position: 'fixed',\n left: 0,\n bottom: 6,\n width: 'full',\n display: 'flex',\n justifyContent: 'center',\n pointerEvents: 'none',\n paddingInline: 4,\n});\n\nexport const bottomFloatContent = sprinkles({\n pointerEvents: 'auto',\n});\n","import { type CSSProperties, type JSX, type ReactNode } from 'react';\n\nimport * as styles from './ContentLayout.css.js';\nimport { cx } from '../../theme/tools.js';\n\nexport type BottomFloatConfig = {\n node: ReactNode;\n reservedHeight?: number;\n};\n\ntype ContentLayoutSlot =\n | 'section'\n | 'inner'\n | 'header'\n | 'headingGroup'\n | 'title'\n | 'subheader'\n | 'metaRow'\n | 'actionCluster'\n | 'actionClusterItem'\n | 'body'\n | 'bottomFloatArea'\n | 'bottomFloatContent';\n\ntype SlotClasses<TSlot extends string> = Partial<Record<TSlot, string>>;\n\nexport type ContentLayoutProps = {\n title?: ReactNode;\n subheader?: ReactNode;\n mainAction?: ReactNode;\n secondaryActions?: ReactNode[];\n meta?: ReactNode;\n children: ReactNode;\n bottomFloat?: BottomFloatConfig;\n className?: string;\n contentClassName?: string;\n classes?: SlotClasses<ContentLayoutSlot>;\n};\n\nconst DEFAULT_BOTTOM_FLOAT_HEIGHT = 320;\nconst BOTTOM_FLOAT_BUFFER = 48;\n\nconst renderTitle = (\n title: ReactNode | undefined,\n className: string,\n): ReactNode => {\n if (title == null) {\n return null;\n }\n\n if (typeof title === 'string' || typeof title === 'number') {\n return <h1 className={className}>{title}</h1>;\n }\n\n return <div className={className}>{title}</div>;\n};\n\nconst renderSubheader = (\n subheader: ReactNode | undefined,\n className: string,\n): ReactNode => {\n if (subheader == null) {\n return null;\n }\n\n if (typeof subheader === 'string' || typeof subheader === 'number') {\n return <p className={className}>{subheader}</p>;\n }\n\n return <div className={className}>{subheader}</div>;\n};\n\nexport const ContentLayout = (props: ContentLayoutProps): JSX.Element => {\n const {\n bottomFloat,\n classes,\n children,\n className,\n contentClassName,\n mainAction,\n meta,\n secondaryActions = [],\n subheader,\n title,\n } = props;\n\n let reservedHeight = 0;\n if (bottomFloat != null) {\n const floatHeight =\n bottomFloat.reservedHeight ?? DEFAULT_BOTTOM_FLOAT_HEIGHT;\n reservedHeight = Math.max(floatHeight, 0);\n }\n\n let paddingStyles: CSSProperties | undefined;\n if (reservedHeight > 0) {\n paddingStyles = {\n paddingBottom: reservedHeight + BOTTOM_FLOAT_BUFFER,\n };\n }\n\n const shouldRenderActions = mainAction != null || secondaryActions.length > 0;\n let mainActionNode: JSX.Element | null = null;\n if (mainAction != null) {\n mainActionNode = (\n <div className={cx(styles.actionClusterItem, classes?.actionClusterItem)}>\n {mainAction}\n </div>\n );\n }\n\n let bottomFloatNode: JSX.Element | null = null;\n if (bottomFloat != null) {\n bottomFloatNode = (\n <div className={cx(styles.bottomFloatArea, classes?.bottomFloatArea)}>\n <div\n className={cx(styles.bottomFloatContent, classes?.bottomFloatContent)}\n >\n {bottomFloat.node}\n </div>\n </div>\n );\n }\n\n let actionClusterNode: JSX.Element | null = null;\n if (shouldRenderActions) {\n actionClusterNode = (\n <div className={cx(styles.actionCluster, classes?.actionCluster)}>\n {secondaryActions.map((action, index) => {\n return (\n <div\n key={`secondary-${index}`}\n className={cx(\n styles.actionClusterItem,\n classes?.actionClusterItem,\n )}\n >\n {action}\n </div>\n );\n })}\n {mainActionNode}\n </div>\n );\n }\n\n const titleClassName = cx(styles.title, classes?.title);\n const subheaderClassName = cx(styles.subheader, classes?.subheader);\n const metaClassName = cx(styles.metaRow, classes?.metaRow);\n let metaNode: ReactNode | null = null;\n if (meta != null) {\n metaNode = <div className={metaClassName}>{meta}</div>;\n }\n\n return (\n <section\n className={cx(styles.section, classes?.section, className)}\n style={paddingStyles}\n >\n <div className={cx(styles.inner, classes?.inner, contentClassName)}>\n {(title != null ||\n subheader != null ||\n meta != null ||\n shouldRenderActions) && (\n <div className={cx(styles.header, classes?.header)}>\n <div className={cx(styles.headingGroup, classes?.headingGroup)}>\n {renderTitle(title, titleClassName)}\n {renderSubheader(subheader, subheaderClassName)}\n {metaNode}\n </div>\n {actionClusterNode}\n </div>\n )}\n\n <div className={cx(styles.body, classes?.body)}>{children}</div>\n </div>\n\n {bottomFloatNode}\n </section>\n );\n};\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: { base: 'column', md: 'row' },\n justifyContent: 'space-between',\n alignItems: { base: 'flex-start', md: 'center' },\n gap: 3,\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: 'lg',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const meta = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './DetailSummaryHeader.css.js';\n\nexport type DetailSummaryHeaderProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const DetailSummaryHeader = ({\n actions,\n className,\n meta,\n subtitle,\n title,\n}: DetailSummaryHeaderProps): JSX.Element => {\n return (\n <div className={cx(styles.root, className)}>\n <div className={styles.body}>\n <h3 className={styles.title}>{title}</h3>\n {subtitle != null && <div className={styles.subtitle}>{subtitle}</div>}\n {meta != null && <div className={styles.meta}>{meta}</div>}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </div>\n );\n};\n\nexport default DetailSummaryHeader;\n","import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nconst MOBILE_MEDIA_QUERY = 'screen and (max-width: 1023px)';\n\nexport const shell = sprinkles({\n display: 'flex',\n width: 'full',\n backgroundColor: 'background',\n backgroundImage: 'pageShellSurface',\n});\n\nexport const page = sprinkles({\n paddingLeft: 2,\n paddingRight: 2,\n paddingTop: 2,\n paddingBottom: 2,\n height: {\n base: 'screen',\n max1023: 'auto',\n },\n flex: 1,\n minWidth: 0,\n});\n\nexport const pageWithSidePanel = sprinkles({\n display: 'flex',\n alignItems: 'stretch',\n gap: {\n base: 0,\n max1023: 3,\n },\n minWidth: 0,\n flexDirection: {\n base: 'row',\n max1023: 'column',\n },\n height: {\n base: 'full',\n max1023: 'auto',\n },\n});\n\nexport const sidebarColumn = sprinkles({\n position: 'sticky',\n top: 0,\n height: 'screen',\n flexShrink: 0,\n display: 'flex',\n overflow: 'hidden',\n});\n\nexport const sidebarColumnMobile = style({\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n position: 'fixed',\n top: 0,\n left: 0,\n bottom: 0,\n width: '20rem',\n maxWidth: '85vw',\n transform: 'translateX(-100%)',\n transitionProperty: 'transform',\n transitionDuration: vars.transitionDuration[200],\n transitionTimingFunction: vars.transitionTimingFunction.ease,\n zIndex: vars.zIndex[30],\n backgroundColor: vars.colors.surface,\n borderRight: `1px solid ${vars.colors.borderSubtle}`,\n },\n },\n});\n\nexport const sidebarColumnMobileOpen = style({\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n transform: 'translateX(0)',\n },\n },\n});\n\nexport const sidebarInner = style([\n sprinkles({\n display: 'flex',\n height: 'full',\n }),\n {\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n paddingTop: '3.75rem',\n },\n },\n },\n]);\n\nexport const mobileSidebarBackdrop = style({\n display: 'none',\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n display: 'block',\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(15, 23, 42, 0.32)',\n opacity: 0,\n pointerEvents: 'none',\n transitionProperty: 'opacity',\n transitionDuration: vars.transitionDuration[200],\n transitionTimingFunction: vars.transitionTimingFunction.ease,\n zIndex: vars.zIndex[20],\n },\n },\n});\n\nexport const mobileSidebarBackdropOpen = style({\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n opacity: 1,\n pointerEvents: 'auto',\n },\n },\n});\n\nexport const mobileSidebarToggle = sprinkles({\n display: {\n base: 'none',\n max1023: 'inline-flex',\n },\n alignItems: 'center',\n justifyContent: 'center',\n width: 10,\n height: 10,\n borderRadius: 'lg',\n borderStyle: 'solid',\n borderWidth: 'default',\n borderColor: 'border',\n backgroundColor: 'surface',\n color: 'text',\n cursor: 'pointer',\n flexShrink: 0,\n});\n\nexport const desktopSidebarToggle = style([\n sprinkles({\n display: {\n base: 'inline-flex',\n max1023: 'none',\n },\n alignItems: 'center',\n justifyContent: 'center',\n width: 10,\n height: 10,\n borderRadius: 'lg',\n borderStyle: 'solid',\n borderWidth: 'default',\n borderColor: 'border',\n backgroundColor: 'surface',\n color: 'text',\n cursor: 'pointer',\n flexShrink: 0,\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n borderColor: vars.colors.primaryLight,\n backgroundColor: vars.colors.surfaceMuted,\n color: vars.colors.primary,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const mobileSidebarClose = sprinkles({\n display: {\n base: 'none',\n max1023: 'inline-flex',\n },\n position: {\n base: 'static',\n max1023: 'absolute',\n },\n right: {\n base: 0,\n max1023: 3,\n },\n top: {\n base: 0,\n max1023: 3,\n },\n zIndex: 40,\n alignItems: 'center',\n justifyContent: 'center',\n width: 10,\n height: 10,\n borderRadius: 'lg',\n borderStyle: 'solid',\n borderWidth: 'default',\n borderColor: 'border',\n backgroundColor: 'surface',\n color: 'text',\n cursor: 'pointer',\n});\n\nexport const mainColumn = sprinkles({\n flex: 1,\n height: 'full',\n minWidth: 0,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: 'surface',\n overflow: 'hidden',\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n boxShadow: 'inkSoft',\n});\n\nexport const mainColumnWithSidePanel = sprinkles({\n height: {\n base: 'full',\n max1023: 'auto',\n },\n});\n\nexport const sidePanel = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n height: {\n base: 'full',\n max1023: 'auto',\n },\n});\n\nexport const sidePanelSurface = sprinkles({\n flex: 'none',\n backgroundColor: 'surface',\n borderRadius: 'xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n});\n\nexport const sidePanelResizable = style({\n minWidth: '360px',\n maxWidth: '50vw',\n});\n\nexport const sidePanelResizer = style([\n sprinkles({\n alignSelf: 'stretch',\n backgroundColor: 'transparent',\n cursor: 'col-resize',\n flex: 'none',\n minWidth: 4,\n position: 'relative',\n width: 4,\n }),\n {\n selectors: {\n '&::after': {\n content: '',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: '4px',\n height: '96px',\n transform: 'translate(-50%, -50%)',\n borderRadius: vars.borderRadius.full,\n backgroundColor: vars.colors.border,\n boxShadow: vars.boxShadow.sm,\n transitionProperty: 'default',\n transitionDuration: vars.transitionDuration[120],\n transitionTimingFunction: vars.transitionTimingFunction.ease,\n },\n '&:hover::after, &[data-active=\"true\"]::after': {\n backgroundColor: vars.colors.primary,\n boxShadow: `0 0 0 1px ${vars.colors.primaryLight}`,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const sidePanelResizerHiddenOnMobile = sprinkles({\n display: {\n base: 'block',\n max1023: 'none',\n },\n});\n\nexport const header = sprinkles({\n position: 'sticky',\n top: 0,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n backgroundColor: 'surface',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'borderSubtle',\n paddingLeft: 5,\n paddingRight: 5,\n paddingBottom: 2,\n paddingTop: 3,\n});\n\nexport const headerRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 4,\n width: 'full',\n});\n\nexport const headerLeading = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n flex: 1,\n minWidth: 0,\n});\n\nexport const breadcrumbNav = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n});\n\nexport const breadcrumbList = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: 2,\n rowGap: 1,\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n color: 'textSecondary',\n fontSize: 'xs',\n});\n\nexport const breadcrumbItem = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n maxWidth: '12rem',\n});\n\nexport const breadcrumbLink = style([\n sprinkles({\n color: 'text',\n textDecoration: 'none',\n fontWeight: 'medium',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n {\n selectors: {\n '&:hover': {\n color: vars.colors['blue-600'],\n },\n },\n },\n]);\n\nexport const breadcrumbCurrent = sprinkles({\n color: 'text',\n fontWeight: 'semibold',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const breadcrumbSeparator = sprinkles({\n color: 'borderLight',\n fontSize: 'xs',\n});\n\nexport const actionGroup = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n justifyContent: 'flex-end',\n});\n\nexport const secondaryAction = sprinkles({\n display: 'inline-flex',\n});\n\nexport const tabsRow = sprinkles({\n width: 'full',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nconst tabBase = style([\n sprinkles({\n alignItems: 'center',\n backgroundColor: 'surfaceMuted',\n borderRadius: 'lg',\n color: 'textSecondary',\n display: 'inline-flex',\n fontSize: 'sm',\n fontWeight: 'medium',\n paddingBlock: 1.5,\n paddingInline: 3,\n textDecoration: 'none',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n color: vars.colors.text,\n },\n },\n },\n]);\n\nexport const tabRecipe = recipe({\n base: tabBase,\n variants: {\n state: {\n default: {},\n active: sprinkles({\n backgroundColor: 'blue-500',\n color: 'white',\n boxShadow: 'sm',\n }),\n },\n mode: {\n link: {},\n static: sprinkles({\n cursor: 'default',\n }),\n },\n },\n defaultVariants: {\n state: 'default',\n mode: 'link',\n },\n});\n\nexport const content = sprinkles({\n flex: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'auto',\n padding: {\n base: 4,\n max1023: 3,\n },\n});\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const MenuSvg = ({\n width = 20,\n height = 20,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M4 7H20\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M4 12H20\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M4 17H20\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n","import { Link } from '@plumile/router';\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type JSX,\n type ReactNode,\n type KeyboardEvent,\n type CSSProperties,\n} from 'react';\n\nimport * as styles from './PageShell.css.js';\nimport { MenuSvg } from '../../icons/MenuSvg.js';\nimport { ModalCloseSvg } from '../../icons/ModalCloseSvg.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\n\nexport type BreadcrumbItem = {\n label: ReactNode;\n href?: string;\n};\n\nexport type PageShellTab = {\n id: string;\n label: ReactNode;\n href?: string;\n isActive?: boolean;\n};\n\nexport type PageShellActions = {\n main?: ReactNode;\n secondary?: ReactNode[];\n};\n\nconst DEFAULT_SIDE_PANEL_WIDTH = 520;\nconst MIN_SIDE_PANEL_WIDTH = 360;\nconst MAX_SIDE_PANEL_RATIO = 0.5;\nconst MIN_MAIN_WIDTH = 480;\nconst SPLIT_BREAKPOINT = 1024;\nconst SIDE_PANEL_WIDTH_STORAGE_KEY = 'plumile:page-shell:side-panel-width';\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nconst readStoredSidePanelWidth = (): number | null => {\n if (typeof window === 'undefined') {\n return null;\n }\n\n try {\n const stored = window.localStorage.getItem(SIDE_PANEL_WIDTH_STORAGE_KEY);\n if (stored == null) {\n return null;\n }\n const parsed = Number(stored);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst persistSidePanelWidth = (width: number): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n window.localStorage.setItem(SIDE_PANEL_WIDTH_STORAGE_KEY, String(width));\n } catch {\n // ignore quota / permission errors\n }\n};\n\nconst resolveMaxSidePanelWidth = (containerWidth: number): number => {\n let viewWidth = containerWidth;\n if (typeof window !== 'undefined') {\n viewWidth = window.innerWidth;\n }\n return viewWidth * MAX_SIDE_PANEL_RATIO;\n};\n\ntype ResizeMoveHandler = (event: MouseEvent | TouchEvent) => void;\ntype ResizeUpHandler = () => void;\ntype ActiveResizeHandlers = {\n move?: ResizeMoveHandler | null;\n up?: ResizeUpHandler | null;\n};\n\ntype Props = {\n sidebar: ReactNode;\n mobileSidebar?: ReactNode;\n desktopSidebarOpen?: boolean;\n onOpenDesktopSidebar?: () => void;\n openDesktopSidebarLabel?: string;\n children: ReactNode;\n breadcrumb?: BreadcrumbItem[];\n breadcrumbSlot?: ReactNode;\n tabs?: PageShellTab[];\n actions?: PageShellActions;\n sidePanel?: ReactNode;\n contentClassName?: string;\n};\n\nconst resolveIsActive = (tab: PageShellTab, pathname?: string): boolean => {\n if (typeof tab.isActive === 'boolean') {\n return tab.isActive;\n }\n\n if (tab.href != null && pathname != null) {\n return pathname === tab.href;\n }\n\n return false;\n};\n\nexport const PageShell = ({\n actions,\n breadcrumb,\n breadcrumbSlot,\n children,\n contentClassName,\n desktopSidebarOpen = true,\n mobileSidebar,\n onOpenDesktopSidebar,\n openDesktopSidebarLabel,\n sidebar,\n sidePanel,\n tabs,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const hasSidePanel = sidePanel != null;\n const pageRef = useRef<HTMLDivElement | null>(null);\n const mobileSidebarRef = useRef<HTMLDivElement | null>(null);\n const mobileSidebarToggleRef = useRef<HTMLButtonElement | null>(null);\n const mobileSidebarCloseRef = useRef<HTMLButtonElement | null>(null);\n const mobileSidebarPreviousFocusRef = useRef<HTMLElement | null>(null);\n const activeResizeHandlersRef = useRef<ActiveResizeHandlers | null>(null);\n const [sidePanelWidth, setSidePanelWidth] = useState(() => {\n const stored = readStoredSidePanelWidth();\n return stored ?? DEFAULT_SIDE_PANEL_WIDTH;\n });\n const sidePanelWidthSnapshotRef = useRef(sidePanelWidth);\n const [isResizingPanel, setIsResizingPanel] = useState(false);\n const [isStackedLayout, setIsStackedLayout] = useState(false);\n const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState(false);\n\n const closeMobileSidebar = useCallback(() => {\n setIsMobileSidebarOpen(false);\n }, []);\n\n const openMobileSidebar = useCallback(() => {\n if (typeof document !== 'undefined') {\n const { activeElement } = document;\n if (activeElement instanceof HTMLElement) {\n mobileSidebarPreviousFocusRef.current = activeElement;\n }\n }\n setIsMobileSidebarOpen(true);\n }, []);\n\n const clampSidePanelWidth = useCallback((candidateWidth: number): void => {\n const container = pageRef.current;\n if (container == null) {\n return;\n }\n\n const { width } = container.getBoundingClientRect();\n const maxWidth = Math.max(\n 0,\n Math.min(resolveMaxSidePanelWidth(width), width - MIN_MAIN_WIDTH),\n );\n const minWidth = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n let safeMin = minWidth;\n if (maxWidth <= 0) {\n safeMin = 0;\n }\n const safeMax = Math.max(safeMin, maxWidth);\n const clampedWidth = Math.max(safeMin, Math.min(candidateWidth, safeMax));\n sidePanelWidthSnapshotRef.current = clampedWidth;\n setSidePanelWidth(clampedWidth);\n }, []);\n\n const startResizing = useCallback(\n (startClientX: number): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (!hasSidePanel || isStackedLayout) {\n return;\n }\n\n const container = pageRef.current;\n if (container == null) {\n return;\n }\n\n const rect = container.getBoundingClientRect();\n const currentWidth = sidePanelWidth;\n setIsResizingPanel(true);\n\n const moveHandler: ResizeMoveHandler = (event) => {\n let clientX = 0;\n if ('touches' in event) {\n const touch = event.touches[0];\n if (touch == null) {\n return;\n }\n clientX = touch.clientX;\n } else {\n clientX = event.clientX;\n }\n\n const deltaX = startClientX - clientX;\n const nextWidth = currentWidth + deltaX;\n\n const maxWidth = Math.max(\n 0,\n Math.min(\n resolveMaxSidePanelWidth(rect.width),\n rect.width - MIN_MAIN_WIDTH,\n ),\n );\n const minWidth = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n let safeMin = minWidth;\n if (maxWidth <= 0) {\n safeMin = 0;\n }\n const safeMax = Math.max(safeMin, maxWidth);\n\n const clampedWidth = Math.max(safeMin, Math.min(nextWidth, safeMax));\n sidePanelWidthSnapshotRef.current = clampedWidth;\n setSidePanelWidth(clampedWidth);\n };\n\n const upHandler: ResizeUpHandler = () => {\n setIsResizingPanel(false);\n persistSidePanelWidth(sidePanelWidthSnapshotRef.current);\n const handlers = activeResizeHandlersRef.current;\n if (handlers?.move != null) {\n window.removeEventListener('mousemove', handlers.move);\n window.removeEventListener('touchmove', handlers.move);\n }\n if (handlers?.up != null) {\n window.removeEventListener('mouseup', handlers.up);\n window.removeEventListener('touchend', handlers.up);\n window.removeEventListener('touchcancel', handlers.up);\n }\n activeResizeHandlersRef.current = null;\n };\n\n activeResizeHandlersRef.current = { move: moveHandler, up: upHandler };\n\n window.addEventListener('mousemove', moveHandler);\n window.addEventListener('touchmove', moveHandler, { passive: false });\n window.addEventListener('mouseup', upHandler);\n window.addEventListener('touchend', upHandler);\n window.addEventListener('touchcancel', upHandler);\n },\n [hasSidePanel, isStackedLayout, sidePanelWidth],\n );\n\n useEffect(() => {\n sidePanelWidthSnapshotRef.current = sidePanelWidth;\n }, [sidePanelWidth]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return () => {};\n }\n const mediaQuery = window.matchMedia(\n `(max-width: ${SPLIT_BREAKPOINT - 1}px)`,\n );\n const handleMediaChange = () => {\n setIsStackedLayout(mediaQuery.matches);\n };\n\n handleMediaChange();\n mediaQuery.addEventListener('change', handleMediaChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleMediaChange);\n };\n }, []);\n\n useEffect(() => {\n if (hasSidePanel) {\n clampSidePanelWidth(sidePanelWidth);\n }\n }, [hasSidePanel, sidePanelWidth, clampSidePanelWidth]);\n\n useEffect(() => {\n if (!isStackedLayout && isMobileSidebarOpen) {\n closeMobileSidebar();\n }\n }, [closeMobileSidebar, isMobileSidebarOpen, isStackedLayout]);\n\n useEffect(() => {\n if (!isMobileSidebarOpen) {\n return () => {};\n }\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeMobileSidebar();\n return;\n }\n\n if (event.key !== 'Tab') {\n return;\n }\n\n const sidebarElement = mobileSidebarRef.current;\n if (sidebarElement == null) {\n return;\n }\n\n const focusableElements = Array.from(\n sidebarElement.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((element) => {\n return (\n element.offsetParent != null || element === document.activeElement\n );\n });\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (firstElement == null || lastElement == null) {\n event.preventDefault();\n return;\n }\n\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n return;\n }\n\n if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n };\n\n const fallbackFocusElement = mobileSidebarToggleRef.current;\n mobileSidebarCloseRef.current?.focus();\n\n window.addEventListener('keydown', handleEscape);\n return () => {\n window.removeEventListener('keydown', handleEscape);\n const previousFocus = mobileSidebarPreviousFocusRef.current;\n if (previousFocus != null && document.contains(previousFocus)) {\n previousFocus.focus();\n } else {\n fallbackFocusElement?.focus();\n }\n mobileSidebarPreviousFocusRef.current = null;\n };\n }, [closeMobileSidebar, isMobileSidebarOpen]);\n\n useEffect(() => {\n return () => {\n const handlers = activeResizeHandlersRef.current;\n if (handlers?.move != null) {\n window.removeEventListener('mousemove', handlers.move);\n window.removeEventListener('touchmove', handlers.move);\n }\n if (handlers?.up != null) {\n window.removeEventListener('mouseup', handlers.up);\n window.removeEventListener('touchend', handlers.up);\n window.removeEventListener('touchcancel', handlers.up);\n }\n };\n }, []);\n\n let currentPath: string | undefined;\n if (typeof window !== 'undefined') {\n currentPath = window.location.pathname;\n }\n\n const renderBreadcrumb = (): JSX.Element | null => {\n if (breadcrumbSlot != null) {\n return <div className={styles.breadcrumbNav}>{breadcrumbSlot}</div>;\n }\n\n if (breadcrumb == null || breadcrumb.length === 0) {\n return null;\n }\n\n const items = breadcrumb.flatMap((item, index) => {\n const isLast = index === breadcrumb.length - 1;\n const key = `${item.href ?? 'crumb'}-${index}`;\n let content: JSX.Element;\n if (item.href != null && !isLast) {\n content = (\n <Link to={item.href} className={styles.breadcrumbLink}>\n {item.label}\n </Link>\n );\n } else {\n let breadcrumbClass = styles.breadcrumbLink;\n if (isLast) {\n breadcrumbClass = styles.breadcrumbCurrent;\n }\n content = <span className={breadcrumbClass}>{item.label}</span>;\n }\n\n const renderedItem = (\n <li key={key} className={styles.breadcrumbItem}>\n {content}\n </li>\n );\n\n if (isLast) {\n return [renderedItem];\n }\n\n return [\n renderedItem,\n <li\n key={`${key}-sep`}\n className={styles.breadcrumbSeparator}\n aria-hidden=\"true\"\n >\n /\n </li>,\n ];\n });\n\n return (\n <nav\n className={styles.breadcrumbNav}\n aria-label={t('navigation.breadcrumb')}\n >\n <ol className={styles.breadcrumbList}>{items}</ol>\n </nav>\n );\n };\n\n const renderActions = (): JSX.Element | null => {\n if (\n actions == null ||\n (actions.main == null && (actions.secondary ?? []).length === 0)\n ) {\n return null;\n }\n\n const secondaryNodes = actions.secondary ?? [];\n\n let mainActionNode: JSX.Element | null = null;\n if (actions.main != null) {\n mainActionNode = (\n <div className={styles.secondaryAction}>{actions.main}</div>\n );\n }\n\n return (\n <div className={styles.actionGroup}>\n {secondaryNodes.map((node, index) => {\n return (\n <div key={`secondary-${index}`} className={styles.secondaryAction}>\n {node}\n </div>\n );\n })}\n {mainActionNode}\n </div>\n );\n };\n\n const renderTabs = (): JSX.Element | null => {\n if (tabs == null || tabs.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.tabsRow}>\n {tabs.map((tab) => {\n const isActive = resolveIsActive(tab, currentPath);\n let tabState: 'default' | 'active' = 'default';\n if (isActive) {\n tabState = 'active';\n }\n let tabMode: 'static' | 'link' = 'link';\n if (tab.href == null) {\n tabMode = 'static';\n }\n const className = styles.tabRecipe({\n state: tabState,\n mode: tabMode,\n });\n const key = tab.id;\n let ariaCurrent: 'page' | undefined;\n if (isActive) {\n ariaCurrent = 'page';\n }\n\n if (tab.href != null) {\n return (\n <Link\n key={key}\n to={tab.href}\n className={className}\n aria-current={ariaCurrent}\n >\n {tab.label}\n </Link>\n );\n }\n\n return (\n <span key={key} className={className} aria-current={ariaCurrent}>\n {tab.label}\n </span>\n );\n })}\n </div>\n );\n };\n\n const handleResizerKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (isStackedLayout) {\n return;\n }\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.preventDefault();\n let delta = 16;\n if (event.key === 'ArrowRight') {\n delta = -16;\n }\n clampSidePanelWidth(sidePanelWidth + delta);\n persistSidePanelWidth(sidePanelWidthSnapshotRef.current);\n }\n },\n [clampSidePanelWidth, isStackedLayout, sidePanelWidth],\n );\n\n let sidePanelNode: JSX.Element | null = null;\n if (hasSidePanel) {\n const sidePanelClasses = [styles.sidePanel, styles.sidePanelSurface];\n let sidePanelStyle: CSSProperties | undefined;\n if (!isStackedLayout) {\n sidePanelClasses.push(styles.sidePanelResizable);\n sidePanelStyle = {\n width: `${sidePanelWidth}px`,\n };\n }\n sidePanelNode = (\n <aside className={cx(...sidePanelClasses)} style={sidePanelStyle}>\n {sidePanel}\n </aside>\n );\n }\n\n let resizerNode: JSX.Element | null = null;\n if (hasSidePanel) {\n let resizerActive = 'false';\n if (isResizingPanel) {\n resizerActive = 'true';\n }\n let resizerMin = MIN_SIDE_PANEL_WIDTH;\n let resizerMax = Math.max(MIN_SIDE_PANEL_WIDTH, sidePanelWidth);\n const pageElement = pageRef.current;\n if (pageElement != null) {\n const { width } = pageElement.getBoundingClientRect();\n const maxWidth = Math.max(\n 0,\n Math.min(resolveMaxSidePanelWidth(width), width - MIN_MAIN_WIDTH),\n );\n resizerMin = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n if (maxWidth <= 0) {\n resizerMin = 0;\n }\n resizerMax = Math.max(resizerMin, maxWidth);\n }\n resizerNode = (\n <div\n className={cx(\n styles.sidePanelResizer,\n styles.sidePanelResizerHiddenOnMobile,\n )}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={t('layout.pageShell.resizeSidePanel')}\n aria-valuemin={Math.round(resizerMin)}\n aria-valuemax={Math.round(resizerMax)}\n aria-valuenow={Math.round(sidePanelWidth)}\n tabIndex={0}\n data-active={resizerActive}\n onMouseDown={(event) => {\n event.preventDefault();\n startResizing(event.clientX);\n }}\n onTouchStart={(event) => {\n const touch = event.touches[0];\n if (touch != null) {\n startResizing(touch.clientX);\n }\n }}\n onKeyDown={handleResizerKeyDown}\n />\n );\n }\n\n let sidebarContent = sidebar;\n if (isStackedLayout) {\n sidebarContent = mobileSidebar ?? sidebar;\n }\n const shouldRenderDesktopSidebar = desktopSidebarOpen || isStackedLayout;\n let resolvedOpenDesktopSidebarLabel = openDesktopSidebarLabel;\n resolvedOpenDesktopSidebarLabel ??= t('navigation.pageShell.openNavigation');\n\n return (\n <div className={styles.shell}>\n <div\n className={cx(styles.mobileSidebarBackdrop, {\n [styles.mobileSidebarBackdropOpen]:\n isStackedLayout && isMobileSidebarOpen,\n })}\n aria-hidden=\"true\"\n onClick={closeMobileSidebar}\n />\n {shouldRenderDesktopSidebar && (\n <div\n ref={mobileSidebarRef}\n className={cx(styles.sidebarColumn, styles.sidebarColumnMobile, {\n [styles.sidebarColumnMobileOpen]:\n isStackedLayout && isMobileSidebarOpen,\n })}\n aria-hidden={isStackedLayout && !isMobileSidebarOpen}\n inert={isStackedLayout && !isMobileSidebarOpen}\n >\n <button\n ref={mobileSidebarCloseRef}\n type=\"button\"\n className={styles.mobileSidebarClose}\n onClick={closeMobileSidebar}\n aria-label={t('navigation.pageShell.closeNavigation')}\n >\n <ModalCloseSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n <div className={styles.sidebarInner}>{sidebarContent}</div>\n </div>\n )}\n <div\n ref={pageRef}\n className={cx(styles.page, {\n [styles.pageWithSidePanel]: hasSidePanel,\n })}\n aria-hidden={isStackedLayout && isMobileSidebarOpen}\n inert={isStackedLayout && isMobileSidebarOpen}\n >\n <div\n className={cx(styles.mainColumn, {\n [styles.mainColumnWithSidePanel]: hasSidePanel,\n })}\n >\n <div className={styles.header}>\n <div className={styles.headerRow}>\n <div className={styles.headerLeading}>\n {!isStackedLayout && !desktopSidebarOpen && (\n <button\n type=\"button\"\n className={styles.desktopSidebarToggle}\n onClick={onOpenDesktopSidebar}\n aria-label={resolvedOpenDesktopSidebarLabel}\n title={resolvedOpenDesktopSidebarLabel}\n >\n <MenuSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n )}\n {isStackedLayout && (\n <button\n ref={mobileSidebarToggleRef}\n type=\"button\"\n className={styles.mobileSidebarToggle}\n onClick={openMobileSidebar}\n aria-expanded={isMobileSidebarOpen}\n aria-label={t('navigation.pageShell.openNavigation')}\n >\n <MenuSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n )}\n {renderBreadcrumb()}\n </div>\n {renderActions()}\n </div>\n {renderTabs()}\n </div>\n <div className={cx(styles.content, contentClassName)}>{children}</div>\n </div>\n {resizerNode}\n {sidePanelNode}\n </div>\n </div>\n );\n};\n\nexport const __test = {\n readStoredSidePanelWidth,\n resolveMaxSidePanelWidth,\n resolveIsActive,\n} as const;\n","import { type JSX, type ReactNode } from 'react';\n\nimport {\n PageShell,\n type PageShellActions,\n type PageShellTab,\n} from './PageShell.js';\n\nexport type AppShellProps = {\n sidebar: ReactNode;\n mobileSidebar?: ReactNode;\n desktopSidebarOpen?: boolean;\n onOpenDesktopSidebar?: () => void;\n openDesktopSidebarLabel?: string;\n children: ReactNode;\n breadcrumbSlot?: ReactNode;\n actions?: PageShellActions;\n tabs?: PageShellTab[];\n};\n\nexport const AppShell = ({\n sidebar,\n children,\n breadcrumbSlot,\n desktopSidebarOpen,\n mobileSidebar,\n onOpenDesktopSidebar,\n openDesktopSidebarLabel,\n actions,\n tabs,\n}: AppShellProps): JSX.Element => {\n return (\n <PageShell\n sidebar={sidebar}\n mobileSidebar={mobileSidebar}\n desktopSidebarOpen={desktopSidebarOpen}\n onOpenDesktopSidebar={onOpenDesktopSidebar}\n openDesktopSidebarLabel={openDesktopSidebarLabel}\n breadcrumbSlot={breadcrumbSlot}\n actions={actions}\n tabs={tabs}\n >\n {children}\n </PageShell>\n );\n};\n\nexport default AppShell;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const content = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n});\n\nexport const dot = sprinkles({\n width: 2,\n height: 2,\n borderRadius: 'full',\n backgroundColor: 'current',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Badge } from '@plumile/ui';\n\nimport * as styles from './statusBadge.css.js';\n\nexport type StatusTone =\n | 'active'\n | 'disabled'\n | 'pending'\n | 'error'\n | 'warning'\n | 'info';\n\nexport type StatusBadgeProps = {\n tone: StatusTone;\n children: ReactNode;\n showDot?: boolean;\n className?: string;\n loading?: boolean;\n};\n\ntype BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\n\nconst toneMap: Record<StatusTone, BadgeTone> = {\n active: 'success',\n disabled: 'neutral',\n pending: 'info',\n error: 'danger',\n warning: 'warning',\n info: 'info',\n};\n\nexport const StatusBadge = ({\n tone,\n children,\n showDot = false,\n className,\n loading,\n}: StatusBadgeProps): JSX.Element => {\n const badgeTone = toneMap[tone];\n\n let dotNode: JSX.Element | null = null;\n if (showDot) {\n dotNode = <span className={styles.dot} aria-hidden=\"true\" />;\n }\n\n return (\n <Badge tone={badgeTone} className={className} loading={loading}>\n <span className={styles.content}>\n {dotNode}\n {children}\n </span>\n </Badge>\n );\n};\n\nexport default StatusBadge;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const top = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const title = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const timestamp = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n});\n\nexport const summary = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { RelativeTimeText } from '../../../atomic/atoms/relative-time-text/RelativeTimeText.js';\nimport { StatusBadge } from '../../../backoffice/atoms/status_badge/StatusBadge.js';\nimport { PanelShell } from '../../layout/PanelShell.js';\nimport * as styles from './ActivityCard.css.js';\n\ntype ActivityTone =\n | 'active'\n | 'disabled'\n | 'pending'\n | 'error'\n | 'warning'\n | 'info';\n\nexport type ActivityCardProps = {\n title: ReactNode;\n status?: ReactNode;\n statusTone?: ActivityTone;\n timestamp?: string | Date;\n summary?: ReactNode;\n details?: ReactNode;\n className?: string;\n};\n\nexport const ActivityCard = ({\n className,\n details,\n status,\n statusTone,\n summary,\n timestamp,\n title,\n}: ActivityCardProps): JSX.Element => {\n let badgeNode: JSX.Element | null = null;\n if (status != null && statusTone != null) {\n badgeNode = <StatusBadge tone={statusTone}>{status}</StatusBadge>;\n }\n\n return (\n <PanelShell className={className}>\n <div className={styles.root}>\n <div className={styles.top}>\n <span className={styles.title}>{title}</span>\n {badgeNode}\n </div>\n {timestamp != null && (\n <span className={styles.timestamp}>\n <RelativeTimeText value={timestamp} />\n </span>\n )}\n {summary != null && <div className={styles.summary}>{summary}</div>}\n {details}\n </div>\n </PanelShell>\n );\n};\n\nexport default ActivityCard;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './ActivityFeed.css.js';\n\nexport type ActivityFeedProps = {\n children?: ReactNode;\n emptyState?: ReactNode;\n className?: string;\n};\n\nexport const ActivityFeed = ({\n children,\n className,\n emptyState,\n}: ActivityFeedProps): JSX.Element => {\n if (children == null) {\n return <>{emptyState ?? null}</>;\n }\n\n return <div className={cx(styles.root, className)}>{children}</div>;\n};\n\nexport default ActivityFeed;\n","import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = style([\n sprinkles({\n display: 'grid',\n gap: 4,\n width: 'full',\n minHeight: 0,\n }),\n]);\n\nexport const columns = {\n 1: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 1,\n },\n }),\n 2: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 2,\n },\n }),\n 3: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 3,\n },\n }),\n 4: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 4,\n },\n }),\n 12: style([\n sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 12,\n },\n }),\n {\n '@media': {\n 'screen and (min-width: 768px) and (max-width: 1199px)': {\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n },\n },\n },\n ]),\n uneven: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 'dashboardUneven',\n },\n }),\n} as const;\n\nexport const column = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n minHeight: 0,\n});\n\nexport const item = recipe({\n base: style({\n minWidth: 0,\n }),\n variants: {\n minHeight: {\n auto: style({\n minHeight: 0,\n }),\n sm: sprinkles({\n minHeight: 24,\n }),\n md: sprinkles({\n minHeight: 32,\n }),\n lg: sprinkles({\n minHeight: 40,\n }),\n },\n span: {\n span3: style({\n gridColumn: 'span 3 / span 3',\n '@media': {\n 'screen and (min-width: 768px) and (max-width: 1199px)': {\n gridColumn: 'span 3 / span 3',\n },\n 'screen and (max-width: 767px)': {\n gridColumn: '1 / -1',\n },\n },\n }),\n span4: style({\n gridColumn: 'span 4 / span 4',\n '@media': {\n 'screen and (min-width: 768px) and (max-width: 1199px)': {\n gridColumn: 'span 3 / span 3',\n },\n 'screen and (max-width: 767px)': {\n gridColumn: '1 / -1',\n },\n },\n }),\n span6: style({\n gridColumn: 'span 6 / span 6',\n '@media': {\n 'screen and (min-width: 768px) and (max-width: 1199px)': {\n gridColumn: 'span 6 / span 6',\n },\n 'screen and (max-width: 767px)': {\n gridColumn: '1 / -1',\n },\n },\n }),\n span8: style({\n gridColumn: 'span 8 / span 8',\n '@media': {\n 'screen and (min-width: 768px) and (max-width: 1199px)': {\n gridColumn: 'span 6 / span 6',\n },\n 'screen and (max-width: 767px)': {\n gridColumn: '1 / -1',\n },\n },\n }),\n span12: style({\n gridColumn: '1 / -1',\n }),\n },\n tabletSpan: {\n auto: style({}),\n tablet3: style({\n '@media': {\n 'screen and (min-width: 768px) and (max-width: 1199px)': {\n gridColumn: 'span 3 / span 3',\n },\n },\n }),\n tablet6: style({\n '@media': {\n 'screen and (min-width: 768px) and (max-width: 1199px)': {\n gridColumn: 'span 6 / span 6',\n },\n },\n }),\n },\n },\n defaultVariants: {\n minHeight: 'auto',\n span: 'span12',\n tabletSpan: 'auto',\n },\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './DashboardGrid.css.js';\n\nexport type DashboardGridColumns = 1 | 2 | 3 | 4 | 12 | 'uneven';\n\nexport type DashboardGridItemSpan = 3 | 4 | 6 | 8 | 12;\n\nexport type DashboardGridItemTabletSpan = 3 | 6;\n\nexport type DashboardGridItemMinHeight = 'auto' | 'sm' | 'md' | 'lg';\n\nexport type DashboardGridProps = {\n children: ReactNode;\n columns?: DashboardGridColumns;\n className?: string;\n};\n\nexport const DashboardGrid = ({\n children,\n className,\n columns = 3,\n}: DashboardGridProps): JSX.Element => {\n return (\n <div className={cx(styles.root, styles.columns[columns], className)}>\n {children}\n </div>\n );\n};\n\nexport type DashboardGridColumnProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const DashboardGridColumn = ({\n children,\n className,\n}: DashboardGridColumnProps): JSX.Element => {\n return <div className={cx(styles.column, className)}>{children}</div>;\n};\n\nexport type DashboardGridItemProps = {\n children: ReactNode;\n className?: string;\n minHeight?: DashboardGridItemMinHeight;\n span?: DashboardGridItemSpan;\n tabletSpan?: DashboardGridItemTabletSpan;\n};\n\nconst resolveItemSpan = (\n span: DashboardGridItemSpan,\n): 'span3' | 'span4' | 'span6' | 'span8' | 'span12' => {\n if (span === 3) {\n return 'span3';\n }\n if (span === 4) {\n return 'span4';\n }\n if (span === 6) {\n return 'span6';\n }\n if (span === 8) {\n return 'span8';\n }\n return 'span12';\n};\n\nconst resolveItemTabletSpan = (\n tabletSpan: DashboardGridItemTabletSpan | undefined,\n): 'auto' | 'tablet3' | 'tablet6' => {\n if (tabletSpan === 3) {\n return 'tablet3';\n }\n if (tabletSpan === 6) {\n return 'tablet6';\n }\n return 'auto';\n};\n\nexport const DashboardGridItem = ({\n children,\n className,\n minHeight = 'auto',\n span = 12,\n tabletSpan,\n}: DashboardGridItemProps): JSX.Element => {\n return (\n <div\n className={cx(\n styles.item({\n minHeight,\n span: resolveItemSpan(span),\n tabletSpan: resolveItemTabletSpan(tabletSpan),\n }),\n className,\n )}\n >\n {children}\n </div>\n );\n};\n\nexport default DashboardGrid;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const list = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const item = sprinkles({\n display: 'grid',\n gap: 3,\n gridTemplateColumns: 'metadataStripSplit',\n});\n\nexport const label = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n textTransform: 'uppercase',\n letterSpacing: 'capsNarrow',\n});\n\nexport const value = sprinkles({\n fontSize: 'sm',\n color: 'text',\n minWidth: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './MetadataStrip.css.js';\n\nexport type MetadataStripItem = {\n id: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport type MetadataStripProps = {\n items: readonly MetadataStripItem[];\n className?: string;\n};\n\nexport const MetadataStrip = ({\n className,\n items,\n}: MetadataStripProps): JSX.Element => {\n return (\n <dl className={cx(styles.list, className)}>\n {items.map((item) => {\n return (\n <div key={item.id} className={styles.item}>\n <dt className={styles.label}>{item.label}</dt>\n <dd className={styles.value}>{item.value}</dd>\n </div>\n );\n })}\n </dl>\n );\n};\n\nexport default MetadataStrip;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const top = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 3,\n});\n\nexport const label = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const value = sprinkles({\n margin: 0,\n fontSize: { base: '2xl', md: '3xl' },\n fontWeight: 'bold',\n color: 'text',\n});\n\nexport const hint = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const icon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { PanelShell } from '../../layout/PanelShell.js';\nimport * as styles from './MetricCard.css.js';\n\nexport type MetricCardProps = {\n label: ReactNode;\n value: ReactNode;\n hint?: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const MetricCard = ({\n actions,\n className,\n hint,\n icon,\n label,\n value,\n}: MetricCardProps): JSX.Element => {\n return (\n <PanelShell actions={actions} className={className}>\n <div className={styles.root}>\n <div className={styles.top}>\n <div>\n <p className={styles.label}>{label}</p>\n <p className={styles.value}>{value}</p>\n </div>\n {icon != null && <div className={styles.icon}>{icon}</div>}\n </div>\n {hint != null && <p className={styles.hint}>{hint}</p>}\n </div>\n </PanelShell>\n );\n};\n\nexport default MetricCard;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'grid',\n gap: 3,\n width: 'full',\n gridTemplateColumns: 'autoFitMinmax220',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './MetricTileGroup.css.js';\n\nexport type MetricTileGroupProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const MetricTileGroup = ({\n children,\n className,\n}: MetricTileGroupProps): JSX.Element => {\n return <div className={cx(styles.root, className)}>{children}</div>;\n};\n\nexport default MetricTileGroup;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: { base: 'column', md: 'row' },\n alignItems: { base: 'flex-start', md: 'center' },\n justifyContent: 'space-between',\n gap: 4,\n width: 'full',\n paddingX: 6,\n paddingY: 4,\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: { base: '2xl', md: '3xl' },\n fontWeight: 'bold',\n color: 'text',\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n maxWidth: 720,\n});\n\nexport const meta = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n color: 'textSecondary',\n fontSize: 'sm',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './PageHero.css.js';\n\nexport type PageHeroProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const PageHero = ({\n actions,\n className,\n meta,\n subtitle,\n title,\n}: PageHeroProps): JSX.Element => {\n return (\n <section className={cx(styles.root, className)}>\n <div className={styles.body}>\n <h1 className={styles.title}>{title}</h1>\n {subtitle != null && <div className={styles.subtitle}>{subtitle}</div>}\n {meta != null && <div className={styles.meta}>{meta}</div>}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </section>\n );\n};\n\nexport default PageHero;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const nav = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n width: 'full',\n});\n\nconst reset = sprinkles({\n all: 'unset',\n});\n\nexport const item = style([\n reset,\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n paddingX: 3,\n paddingY: 2,\n borderRadius: 'full',\n cursor: 'pointer',\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'textSecondary',\n backgroundColor: 'backgroundSecondary',\n transitionProperty: 'default',\n transitionDuration: 160,\n transitionTimingFunction: 'ease',\n textDecoration: 'none',\n }),\n stateSprinkles({\n color: {\n hover: 'text',\n },\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n }),\n {\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: '2px',\n },\n },\n]);\n\nexport const active = sprinkles({\n color: 'white',\n backgroundColor: 'primary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './SegmentedNav.css.js';\n\nexport type SegmentedNavItem = {\n id: string;\n label: ReactNode;\n href?: string;\n isActive?: boolean;\n onClick?: () => void;\n};\n\nexport type SegmentedNavProps = {\n items: readonly SegmentedNavItem[];\n className?: string;\n};\n\nexport const SegmentedNav = ({\n className,\n items,\n}: SegmentedNavProps): JSX.Element => {\n return (\n <nav className={cx(styles.nav, className)}>\n {items.map((item) => {\n const classes = cx(styles.item, {\n [styles.active]: item.isActive === true,\n });\n\n if (item.href != null) {\n return (\n <a key={item.id} href={item.href} className={classes}>\n {item.label}\n </a>\n );\n }\n\n return (\n <button\n key={item.id}\n type=\"button\"\n className={classes}\n onClick={item.onClick}\n >\n {item.label}\n </button>\n );\n })}\n </nav>\n );\n};\n\nexport default SegmentedNav;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const nav = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n width: 'full',\n});\n\nconst reset = sprinkles({\n all: 'unset',\n});\n\nexport const item = style([\n reset,\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n paddingX: 3,\n paddingY: 2,\n borderRadius: 'full',\n cursor: 'pointer',\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'textSecondary',\n backgroundColor: 'surface',\n transitionProperty: 'default',\n transitionDuration: 160,\n transitionTimingFunction: 'ease',\n textDecoration: 'none',\n }),\n stateSprinkles({\n color: {\n hover: 'text',\n },\n backgroundColor: {\n hover: 'backgroundSecondary',\n },\n }),\n {\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: '2px',\n },\n },\n]);\n\nexport const active = sprinkles({\n color: 'white',\n backgroundColor: 'primary',\n});\n","import { Link } from '@plumile/router';\nimport { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './SectionNav.css.js';\n\nexport type SectionNavItem = {\n id: string;\n label: ReactNode;\n href?: string;\n isActive?: boolean;\n onClick?: () => void;\n};\n\nexport type SectionNavProps = {\n items: readonly SectionNavItem[];\n className?: string;\n};\n\nexport const SectionNav = ({\n className,\n items,\n}: SectionNavProps): JSX.Element => {\n return (\n <nav className={cx(styles.nav, className)}>\n {items.map((item) => {\n const classes = cx(styles.item, {\n [styles.active]: item.isActive === true,\n });\n\n if (item.href != null) {\n return (\n <Link key={item.id} to={item.href} className={classes}>\n {item.label}\n </Link>\n );\n }\n\n return (\n <button\n key={item.id}\n type=\"button\"\n className={classes}\n onClick={item.onClick}\n >\n {item.label}\n </button>\n );\n })}\n </nav>\n );\n};\n\nexport default SectionNav;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const button = style([\n sprinkles({\n all: 'unset',\n width: 'full',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'md',\n backgroundColor: 'background',\n cursor: 'pointer',\n transitionProperty: 'default',\n transitionDuration: 160,\n transitionTimingFunction: 'ease',\n }),\n stateSprinkles({\n boxShadow: {\n hover: 'sm',\n },\n }),\n {\n ':hover': {\n transform: 'translateY(-1px)',\n },\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: '2px',\n },\n },\n]);\n\nexport const selected = sprinkles({\n borderColor: 'primary',\n backgroundColor: 'surfaceMuted',\n});\n\nexport const top = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const title = sprinkles({\n fontWeight: 'semibold',\n color: 'text',\n fontSize: 'sm',\n});\n\nexport const meta = sprinkles({\n color: 'textSecondary',\n fontSize: 'xs',\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './SelectableCard.css.js';\n\nexport type SelectableCardProps = {\n title: ReactNode;\n meta?: ReactNode;\n selected?: boolean;\n onSelect?: () => void;\n trailing?: ReactNode;\n children?: ReactNode;\n className?: string;\n};\n\nexport const SelectableCard = ({\n children,\n className,\n meta,\n onSelect,\n selected = false,\n title,\n trailing,\n}: SelectableCardProps): JSX.Element => {\n return (\n <button\n type=\"button\"\n className={cx(styles.button, className, {\n [styles.selected]: selected,\n })}\n onClick={onSelect}\n >\n <div className={styles.top}>\n <span className={styles.title}>{title}</span>\n {trailing}\n </div>\n {meta != null && <div className={styles.meta}>{meta}</div>}\n {children != null && <div className={styles.body}>{children}</div>}\n </button>\n );\n};\n\nexport default SelectableCard;\n","import { type JSX, type ReactNode } from 'react';\n\nimport {\n PageShell,\n type BreadcrumbItem,\n type PageShellActions,\n} from './PageShell.js';\n\ntype Props = {\n children: ReactNode;\n sidebar: ReactNode;\n breadcrumbItems?: BreadcrumbItem[];\n breadcrumb?: ReactNode;\n actions?: PageShellActions;\n sidePanel?: ReactNode;\n contentClassName?: string;\n};\n\nconst SidebarPageLayout = ({\n actions,\n breadcrumb,\n breadcrumbItems,\n children,\n contentClassName,\n sidebar,\n sidePanel,\n}: Props): JSX.Element => {\n return (\n <PageShell\n sidebar={sidebar}\n breadcrumb={breadcrumbItems}\n breadcrumbSlot={breadcrumb}\n actions={actions}\n sidePanel={sidePanel}\n contentClassName={contentClassName}\n >\n {children}\n </PageShell>\n );\n};\n\nexport { SidebarPageLayout };\nexport default SidebarPageLayout;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'grid',\n gap: 4,\n padding: 6,\n gridTemplateColumns: {\n base: 'settingsSplit',\n lg: 'detailSingle',\n },\n});\n\nexport const sidebar = sprinkles({\n borderRadius: 'lg',\n backgroundColor: 'background',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n overflow: 'hidden',\n});\n\nexport const content = sprinkles({\n borderRadius: 'lg',\n backgroundColor: 'background',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n overflow: 'hidden',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './SettingsLayout.css.js';\n\nexport type SettingsLayoutProps = {\n nav: ReactNode;\n children: ReactNode;\n className?: string;\n navClassName?: string;\n contentClassName?: string;\n};\n\nexport const SettingsLayout = ({\n nav,\n children,\n className,\n navClassName,\n contentClassName,\n}: SettingsLayoutProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <aside className={cx(styles.sidebar, navClassName)}>{nav}</aside>\n <section className={cx(styles.content, contentClassName)}>\n {children}\n </section>\n </div>\n );\n};\n\nexport default SettingsLayout;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const list = sprinkles({\n display: 'grid',\n gap: 2,\n});\n\nexport const item = sprinkles({\n display: 'grid',\n gridTemplateColumns: {\n base: 'keyValueSplit',\n md: 1,\n },\n gap: 2,\n alignItems: 'center',\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'lg',\n backgroundColor: 'surfaceMuted',\n});\n\nexport const itemSurface = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n});\n\nexport const label = sprinkles({\n color: 'textMuted',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n fontWeight: 'semibold',\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n\nexport const labelSize = sprinkles({\n fontSize: 'xs',\n});\n\nexport const value = sprinkles({\n fontSize: 'base',\n color: 'text',\n margin: 0,\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './backofficeKeyValueList.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type BackofficeKeyValueItem = {\n id: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport type BackofficeKeyValueListProps = {\n items: readonly BackofficeKeyValueItem[];\n};\n\nexport const BackofficeKeyValueList = ({\n items,\n}: BackofficeKeyValueListProps): JSX.Element => {\n return (\n <dl className={styles.list}>\n {items.map((item) => {\n return (\n <div key={item.id} className={cx(styles.item, styles.itemSurface)}>\n <dt className={cx(styles.label, styles.labelSize)}>{item.label}</dt>\n <dd className={styles.value}>{item.value}</dd>\n </div>\n );\n })}\n </dl>\n );\n};\n\nexport default BackofficeKeyValueList;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const row = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const help = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { RelativeTimeText } from '../../../atomic/atoms/relative-time-text/RelativeTimeText.js';\nimport { StatusBadge } from '../../../backoffice/atoms/status_badge/StatusBadge.js';\nimport {\n BackofficeKeyValueList,\n type BackofficeKeyValueItem,\n} from '../../../backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { PanelShell } from '../../layout/PanelShell.js';\n\nimport * as styles from './StatusSummaryPanel.css.js';\n\ntype PanelTone =\n | 'active'\n | 'disabled'\n | 'pending'\n | 'error'\n | 'warning'\n | 'info';\n\nexport type StatusSummaryPanelProps = {\n title?: ReactNode;\n status: ReactNode;\n statusTone: PanelTone;\n statusLabel?: ReactNode;\n items?: readonly BackofficeKeyValueItem[];\n help?: ReactNode;\n updatedAt?: string | Date;\n className?: string;\n};\n\nexport const StatusSummaryPanel = ({\n className,\n help,\n items = [],\n status,\n statusLabel,\n statusTone,\n title,\n updatedAt,\n}: StatusSummaryPanelProps): JSX.Element => {\n return (\n <PanelShell title={title} className={className}>\n <div className={styles.root}>\n <div className={styles.row}>\n <span>{statusLabel ?? status}</span>\n <StatusBadge tone={statusTone}>{status}</StatusBadge>\n </div>\n {updatedAt != null && <RelativeTimeText value={updatedAt} />}\n {items.length > 0 && <BackofficeKeyValueList items={items} />}\n {help != null && <div className={styles.help}>{help}</div>}\n </div>\n </PanelShell>\n );\n};\n\nexport default StatusSummaryPanel;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'md',\n padding: 3,\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n backgroundColor: 'backgroundSecondary',\n});\n\nexport const timestamp = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n});\n\nexport const summary = sprinkles({\n fontSize: 'sm',\n color: 'text',\n});\n\nexport const metrics = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n fontSize: 'xs',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { RelativeTimeText } from '../../../atomic/atoms/relative-time-text/RelativeTimeText.js';\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './TimelineEventRow.css.js';\n\nexport type TimelineEventRowMetric = {\n id: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport type TimelineEventRowProps = {\n timestamp: string | Date;\n summary?: ReactNode;\n metrics?: readonly TimelineEventRowMetric[];\n details?: ReactNode;\n className?: string;\n};\n\nexport const TimelineEventRow = ({\n className,\n details,\n metrics = [],\n summary,\n timestamp,\n}: TimelineEventRowProps): JSX.Element => {\n return (\n <article className={cx(styles.root, className)}>\n <span className={styles.timestamp}>\n <RelativeTimeText value={timestamp} />\n </span>\n {summary != null && <div className={styles.summary}>{summary}</div>}\n {metrics.length > 0 && (\n <div className={styles.metrics}>\n {metrics.map((metric) => {\n return (\n <span key={metric.id}>\n {metric.label}: {metric.value}\n </span>\n );\n })}\n </div>\n )}\n {details}\n </article>\n );\n};\n\nexport default TimelineEventRow;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'grid',\n gap: 4,\n padding: 6,\n gridTemplateColumns: {\n base: 'splitViewSplit',\n lg: 'detailSingle',\n },\n});\n\nexport const panel = sprinkles({\n borderRadius: 'lg',\n backgroundColor: 'background',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n overflow: 'hidden',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './SplitViewLayout.css.js';\n\nexport type SplitViewLayoutProps = {\n list: ReactNode;\n detail: ReactNode;\n className?: string;\n listClassName?: string;\n detailClassName?: string;\n};\n\nexport const SplitViewLayout = ({\n list,\n detail,\n className,\n listClassName,\n detailClassName,\n}: SplitViewLayoutProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <div className={cx(styles.panel, listClassName)}>{list}</div>\n <div className={cx(styles.panel, detailClassName)}>{detail}</div>\n </div>\n );\n};\n\nexport default SplitViewLayout;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const row = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: 3,\n width: 'full',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './ToolbarRow.css.js';\n\nexport type ToolbarRowProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const ToolbarRow = ({\n children,\n className,\n}: ToolbarRowProps): JSX.Element => {\n return <div className={cx(styles.row, className)}>{children}</div>;\n};\n\nexport default ToolbarRow;\n","/**\n * Trims markdown content and normalizes empty values to null.\n */\nexport function sanitizeAgentMarkdown(\n content: string | null | undefined,\n): string | null {\n const trimmed = content?.trim();\n if (trimmed == null || trimmed === '') {\n return null;\n }\n\n return trimmed;\n}\n\n/**\n * Trims plain-text answers and normalizes empty values to null.\n */\nexport function sanitizeAgentAnswer(\n answer: string | null | undefined,\n): string | null {\n const trimmed = answer?.trim();\n if (trimmed == null || trimmed === '') {\n return null;\n }\n\n return trimmed;\n}\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n width: '4/5',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: 'lg',\n fontWeight: 'semibold',\n});\n\nexport const emptyMessage = sprinkles({\n fontSize: 'sm',\n fontStyle: 'italic',\n margin: 0,\n});\n","import { type JSX } from 'react';\n\nimport { MarkdownRenderer } from '../../atomic/molecules/markdown/MarkdownRenderer.js';\nimport { sanitizeAgentMarkdown } from '../../shared/agentText.js';\nimport * as styles from './AgentMarkdownCard.css.js';\n\ntype Props = {\n title: string;\n content: string;\n emptyMessage: string;\n};\n\nexport const AgentMarkdownCard = ({\n content,\n emptyMessage,\n}: Props): JSX.Element => {\n const sanitizedContent = sanitizeAgentMarkdown(content);\n\n let body: JSX.Element;\n\n if (sanitizedContent != null) {\n body = <MarkdownRenderer content={sanitizedContent} />;\n } else {\n body = <p className={styles.emptyMessage}>{emptyMessage}</p>;\n }\n\n return <div className={styles.container}>{body}</div>;\n};\n\nexport default AgentMarkdownCard;\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nexport const container = recipe({\n base: sprinkles({\n position: 'relative',\n }),\n variants: {\n fullWidth: {\n true: sprinkles({ width: 'full' }),\n false: sprinkles({ width: 'auto' }),\n },\n },\n defaultVariants: {\n fullWidth: true,\n },\n});\n\nexport const label = sprinkles({\n display: 'block',\n marginBottom: 2,\n fontSize: 'xs',\n fontWeight: 'semibold',\n letterSpacing: 'wider',\n textTransform: 'uppercase',\n color: 'textMuted',\n});\n\nconst triggerBase = style([\n sprinkles({\n width: 'full',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'xl',\n fontSize: 'sm',\n fontWeight: 'semibold',\n textAlign: 'left',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:disabled': {\n opacity: 0.6,\n cursor: 'not-allowed',\n },\n },\n },\n]);\n\nconst defaultTrigger = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: 'none',\n borderColor: vars.colors.primary,\n boxShadow: `0 0 0 3px ${vars.colors.primaryLight}`,\n },\n },\n },\n]);\n\nconst errorTrigger = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'error',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus-visible': {\n boxShadow: `0 0 0 3px color-mix(in srgb, ${vars.colors.error} 20%, transparent)`,\n },\n },\n },\n]);\n\nconst brandTrigger = style([\n sprinkles({\n color: 'brandWhite',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n backgroundImage: 'brandDiagonal',\n }),\n {\n // boxShadow: `0 0 0 1px ${vars.colors.brandPrimaryRed}`,\n selectors: {\n '&:hover': {\n filter: 'brightness(0.98)',\n },\n '&:focus-visible': {\n outline: 'none',\n // borderColor: vars.colors.brandPrimaryRed,\n boxShadow: `0 0 0 2px ${vars.colors.brandSecondaryOrange}`,\n },\n },\n },\n]);\n\nexport const trigger = recipe({\n base: triggerBase,\n variants: {\n variant: {\n default: defaultTrigger,\n brand: brandTrigger,\n },\n state: {\n default: {},\n error: errorTrigger,\n },\n size: {\n small: sprinkles({\n paddingY: 1,\n paddingX: 2,\n fontSize: 'sm',\n }),\n medium: sprinkles({\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n }),\n large: sprinkles({\n paddingY: 3,\n paddingX: 4,\n fontSize: 'base',\n }),\n },\n },\n defaultVariants: {\n variant: 'default',\n state: 'default',\n size: 'medium',\n },\n compoundVariants: [\n {\n variants: {\n variant: 'brand',\n state: 'error',\n },\n style: brandTrigger,\n },\n ],\n});\n\nexport const triggerOpen = sprinkles({\n borderBottomLeftRadius: 'none',\n borderBottomRightRadius: 'none',\n});\n\nexport const valueText = sprinkles({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nexport const triggerIcon = sprinkles({\n display: 'grid',\n alignItems: 'center',\n justifyContent: 'center',\n width: 4,\n height: 4,\n color: 'textMuted',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const triggerIconOpen = sprinkles({\n rotate: 180,\n color: 'text',\n});\n\nexport const triggerIconBrand = sprinkles({\n color: 'brandWhite',\n});\n\nexport const menu = sprinkles({\n position: 'absolute',\n top: 'full',\n left: 0,\n right: 0,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n padding: 1,\n borderRadius: 'xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n boxShadow: 'lg',\n maxHeight: 72,\n overflowY: 'auto',\n});\n\nexport const menuOpen = sprinkles({\n borderTopLeftRadius: 'none',\n borderTopRightRadius: 'none',\n marginTop: '-px',\n});\n\nexport const optionButton = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 1,\n width: 'full',\n borderWidth: 0,\n borderStyle: 'none',\n borderRadius: 'lg',\n backgroundColor: 'transparent',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'text',\n textAlign: 'left',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceSecondary,\n },\n '&:focus-visible': {\n outline: 'none',\n backgroundColor: vars.colors.surfaceSecondary,\n boxShadow: `0 0 0 2px ${vars.colors.primaryLight}`,\n },\n },\n },\n]);\n\nexport const optionSelected = style([\n sprinkles({\n color: 'primary',\n }),\n {\n backgroundColor: vars.colors.primaryLight,\n },\n]);\n\nexport const optionDescription = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n});\n\nexport const menuSeparator = sprinkles({\n height: 'px',\n marginY: 1,\n marginX: 2,\n backgroundColor: 'border',\n});\n\nexport const actionsContainer = sprinkles({\n paddingY: 1,\n paddingX: 2,\n});\n\nexport type SimpleSelectVariants = RecipeVariants<typeof trigger>;\n","import {\n type JSX,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { ChevronDownSvg } from '../../icons/ChevronDownSvg.js';\n\nimport * as styles from './SimpleSelect.css.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\n\nexport type SimpleSelectOption = {\n id: string;\n label: string;\n value: string;\n description?: string | null;\n};\n\ntype ActionSlot = ReactNode | ((closeMenu: () => void) => ReactNode);\n\ntype Props = {\n options: readonly SimpleSelectOption[];\n value: string;\n onChange: (value: string) => void;\n label?: ReactNode;\n placeholder?: string;\n actionsSlot?: ActionSlot;\n isDisabled?: boolean;\n className?: string;\n variant?: 'default' | 'brand';\n size?: 'small' | 'medium' | 'large';\n state?: 'default' | 'error';\n fullWidth?: boolean;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n ariaInvalid?: boolean;\n};\n\nexport const SimpleSelect = ({\n ariaDescribedBy,\n ariaLabel,\n ariaLabelledBy,\n ariaInvalid,\n actionsSlot,\n className,\n fullWidth = true,\n isDisabled = false,\n label,\n onChange,\n options,\n placeholder,\n size = 'medium',\n state = 'default',\n value,\n variant = 'default',\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const resolvedPlaceholder = placeholder ?? t('common.select.placeholder');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const optionRefs = useRef(new Map<string, HTMLButtonElement | null>());\n const listboxId = useId();\n\n const selectedOption = useMemo(() => {\n return (\n options.find((option) => {\n return option.value === value;\n }) ?? null\n );\n }, [options, value]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const selectedIndex = options.findIndex((option) => {\n return option.value === value;\n });\n let nextIndex = 0;\n if (selectedIndex >= 0) {\n nextIndex = selectedIndex;\n }\n setFocusedIndex(nextIndex);\n }, [isOpen, options, value]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n if (focusedIndex < 0 || focusedIndex >= options.length) {\n return;\n }\n const option = options[focusedIndex];\n if (option == null) {\n return;\n }\n const node = optionRefs.current.get(option.id);\n node?.focus();\n }, [focusedIndex, isOpen, options]);\n\n useEffect(() => {\n if (!isOpen) {\n return () => {};\n }\n\n const handleClick = (event: MouseEvent) => {\n if (containerRef.current?.contains(event.target as Node)) {\n return;\n }\n setIsOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('mousedown', handleClick);\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen]);\n\n useEffect(() => {\n optionRefs.current.clear();\n }, [options]);\n\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n requestAnimationFrame(() => {\n triggerRef.current?.focus();\n });\n }, []);\n\n const handleToggle = (): void => {\n if (isDisabled) {\n return;\n }\n setIsOpen((prev) => {\n return !prev;\n });\n };\n\n const handleSelect = (nextValue: string): void => {\n onChange(nextValue);\n closeMenu();\n };\n\n const handleTriggerKeyDown = (\n event: ReactKeyboardEvent<HTMLButtonElement>,\n ) => {\n if (isDisabled) {\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setIsOpen(true);\n }\n };\n\n const moveFocus = (direction: 1 | -1): void => {\n if (options.length === 0) {\n return;\n }\n setFocusedIndex((prev) => {\n if (prev < 0) {\n let fallbackIndex = options.length - 1;\n if (direction === 1) {\n fallbackIndex = 0;\n }\n return fallbackIndex;\n }\n const nextIndex = (prev + direction + options.length) % options.length;\n return nextIndex;\n });\n };\n\n const handleListKeyDown = (event: ReactKeyboardEvent<HTMLUListElement>) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n moveFocus(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocus(-1);\n break;\n case 'Home':\n event.preventDefault();\n setFocusedIndex(0);\n break;\n case 'End':\n event.preventDefault();\n setFocusedIndex(options.length - 1);\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (focusedIndex >= 0 && focusedIndex < options.length) {\n const option = options[focusedIndex];\n if (option != null) {\n handleSelect(option.value);\n }\n }\n break;\n }\n case 'Escape':\n event.preventDefault();\n setIsOpen(false);\n triggerRef.current?.focus();\n break;\n default:\n break;\n }\n };\n\n const registerOptionRef = (optionId: string) => {\n return (node: HTMLButtonElement | null) => {\n optionRefs.current.set(optionId, node);\n };\n };\n\n let labelId: string | undefined;\n if (label != null) {\n labelId = `${listboxId}-label`;\n }\n const resolvedAriaLabelledBy = ariaLabelledBy ?? labelId;\n\n const renderActionsSlot = (): ReactNode | null => {\n if (typeof actionsSlot === 'function') {\n return actionsSlot(closeMenu);\n }\n return actionsSlot ?? null;\n };\n\n const optionItems = options.map((option, index) => {\n const isSelected = option.value === value;\n const optionDomId = `${listboxId}-option-${index}`;\n const optionClassName = cx(styles.optionButton, {\n [styles.optionSelected]: isSelected,\n });\n let optionTabIndex = -1;\n if (focusedIndex === index) {\n optionTabIndex = 0;\n }\n\n let descriptionNode: JSX.Element | null = null;\n if (option.description != null && option.description !== '') {\n descriptionNode = (\n <span className={styles.optionDescription}>{option.description}</span>\n );\n }\n\n return (\n <li key={option.id} role=\"presentation\">\n <button\n id={optionDomId}\n ref={registerOptionRef(option.id)}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className={optionClassName}\n tabIndex={optionTabIndex}\n onClick={() => {\n handleSelect(option.value);\n }}\n onMouseEnter={() => {\n setFocusedIndex(index);\n }}\n >\n <span>{option.label}</span>\n {descriptionNode}\n </button>\n </li>\n );\n });\n\n let activeOptionId: string | undefined;\n if (focusedIndex >= 0 && focusedIndex < options.length) {\n activeOptionId = `${listboxId}-option-${focusedIndex}`;\n }\n\n let labelNode: JSX.Element | null = null;\n if (label != null) {\n labelNode = (\n <span id={labelId} className={styles.label}>\n {label}\n </span>\n );\n }\n\n let ariaControls: string | undefined;\n if (isOpen) {\n ariaControls = listboxId;\n }\n\n let actionsSlotNode: ReactNode | null = null;\n if (actionsSlot != null) {\n actionsSlotNode = (\n <>\n <li role=\"presentation\">\n <div className={styles.menuSeparator} role=\"separator\" />\n </li>\n <li role=\"presentation\">\n <div className={styles.actionsContainer}>{renderActionsSlot()}</div>\n </li>\n </>\n );\n }\n\n let menuNode: JSX.Element | null = null;\n if (isOpen) {\n menuNode = (\n <ul\n id={listboxId}\n className={cx(styles.menu, styles.menuOpen)}\n role=\"listbox\"\n aria-activedescendant={activeOptionId}\n tabIndex={-1}\n onKeyDown={handleListKeyDown}\n >\n {optionItems}\n {actionsSlotNode}\n </ul>\n );\n }\n\n const triggerClassName = cx(styles.trigger({ size, state, variant }), {\n [styles.triggerOpen]: isOpen,\n });\n const triggerIconClassName = cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n [styles.triggerIconBrand]: variant === 'brand',\n });\n\n return (\n <div\n className={cx(styles.container({ fullWidth }), className)}\n ref={containerRef}\n >\n {labelNode}\n <button\n ref={triggerRef}\n type=\"button\"\n className={triggerClassName}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={ariaControls}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid}\n aria-label={ariaLabel}\n aria-labelledby={resolvedAriaLabelledBy}\n onClick={handleToggle}\n onKeyDown={handleTriggerKeyDown}\n disabled={isDisabled}\n >\n <span className={styles.valueText}>\n {selectedOption?.label ?? resolvedPlaceholder}\n </span>\n <span className={triggerIconClassName}>\n <ChevronDownSvg width={16} height={16} aria-hidden=\"true\" />\n </span>\n </button>\n {menuNode}\n </div>\n );\n};\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n paddingY: 3,\n paddingX: 4,\n borderRadius: 'md',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'amber-200',\n backgroundColor: 'amber-50',\n color: 'amber-900',\n});\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontWeight: 'semibold',\n fontSize: 'sm',\n});\n\nexport const message = sprinkles({\n margin: 0,\n fontSize: 'sm',\n lineHeight: 1.4,\n});\n","import { type JSX } from 'react';\n\nimport { Button } from '../../atomic/atoms/button/Button.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\n\nimport * as styles from './RefetchNeededBanner.css.js';\n\ntype Props = {\n reason: string;\n onReload: () => void;\n className?: string;\n};\n\nexport const RefetchNeededBanner = ({\n reason,\n onReload,\n className,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n let message = t('subscriptions.refetchNeeded.messages.default');\n if (reason === 'CURSOR_REPLAY_UNAVAILABLE') {\n message = t('subscriptions.refetchNeeded.messages.cursorReplayUnavailable');\n } else if (reason === 'BUFFER_OVERFLOW') {\n message = t('subscriptions.refetchNeeded.messages.bufferOverflow');\n }\n\n return (\n <div className={cx(styles.root, className)}>\n <div className={styles.content}>\n <p className={styles.title}>{t('subscriptions.refetchNeeded.title')}</p>\n <p className={styles.message}>{message}</p>\n </div>\n <Button type=\"button\" variant=\"secondary\" size=\"small\" onClick={onReload}>\n {t('subscriptions.refetchNeeded.actions.reload')}\n </Button>\n </div>\n );\n};\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const wrapper = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n width: 'full',\n});\n\nexport const tabsBar = sprinkles({\n width: 'full',\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const tabsInner = sprinkles({\n width: 'full',\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const panels = sprinkles({\n width: 'full',\n});\n\nexport const panel = sprinkles({\n width: 'full',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Tabs, type TabItem } from '../../atomic/molecules/tabs/Tabs.js';\nimport * as styles from './TabsContentLayout.css.js';\n\nexport type TabsContentLayoutProps = {\n tabs: TabItem[];\n ariaLabel?: string;\n children: ReactNode;\n};\n\nexport const TabsContentLayout = (\n props: TabsContentLayoutProps,\n): JSX.Element => {\n const { ariaLabel, children, tabs } = props;\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.tabsBar}>\n <div className={styles.tabsInner}>\n <Tabs items={tabs} ariaLabel={ariaLabel} />\n </div>\n </div>\n <div className={styles.panels}>\n <section role=\"tabpanel\" className={styles.panel}>\n {children}\n </section>\n </div>\n </div>\n );\n};\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nexport const previewButton = recipe({\n base: [\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'lg',\n overflow: 'hidden',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n cursor: 'pointer',\n padding: 0,\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.primaryLight}`,\n },\n },\n },\n ],\n variants: {\n size: {\n sm: sprinkles({ width: 24, height: 24 }),\n md: sprinkles({ width: 32, height: 32 }),\n lg: sprinkles({ width: 40, height: 40 }),\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport type PreviewButtonVariants = RecipeVariants<typeof previewButton>;\nexport type PreviewSize = 'sm' | 'md' | 'lg';\n\nexport const previewImage = sprinkles({\n display: 'block',\n width: 'full',\n height: 'full',\n objectFit: 'cover',\n});\n\nexport const modalBody = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const modalImage = sprinkles({\n display: 'block',\n maxWidth: 'full',\n maxHeight: '70vh',\n objectFit: 'contain',\n});\n","import { useState, type JSX } from 'react';\n\nimport { Modal } from '../../atomic/atoms/modal/Modal.js';\nimport { cx } from '../../theme/tools.js';\n\nimport * as styles from './imagePreviewModal.css.js';\nimport type { PreviewSize } from './imagePreviewModal.css.js';\n\nexport type ImagePreviewModalProps = {\n src: string;\n alt: string;\n title?: string;\n previewSize?: PreviewSize;\n className?: string;\n};\n\nexport const ImagePreviewModal = ({\n src,\n alt,\n title,\n previewSize = 'md',\n className,\n}: ImagePreviewModalProps): JSX.Element => {\n const [isOpen, setIsOpen] = useState(false);\n const resolvedTitle = title ?? alt;\n const previewClassName = cx(\n styles.previewButton({ size: previewSize }),\n className,\n );\n\n return (\n <>\n <button\n type=\"button\"\n className={previewClassName}\n onClick={() => {\n setIsOpen(true);\n }}\n aria-label={resolvedTitle}\n >\n <img\n src={src}\n alt={alt}\n className={styles.previewImage}\n loading=\"lazy\"\n />\n </button>\n <Modal\n isOpen={isOpen}\n onClose={() => {\n setIsOpen(false);\n }}\n title={resolvedTitle}\n >\n <div className={styles.modalBody}>\n <img src={src} alt={alt} className={styles.modalImage} />\n </div>\n </Modal>\n </>\n );\n};\n\nexport default ImagePreviewModal;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const singleLineCell = sprinkles({\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n});\n\nexport const bodyViewport = sprinkles({\n position: 'relative',\n});\n\nexport const spacer = sprinkles({\n width: 'full',\n});\n\nexport const sentinel = sprinkles({\n width: 'full',\n height: 1,\n});\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n} from 'react';\n\nimport type { DataTableBreakpoint } from './tableBreakpoints.js';\nimport type { DataTableColumn, DataTableKind, GetRowId } from './DataTable.js';\nimport * as dataTableStyles from './DataTable.css.js';\nimport * as styles from './VirtualizedConnectionTable.css.js';\n\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\nimport type { SlotClasses } from '../../styles/slots.js';\n\nexport type VirtualizationConfig = {\n enabled: boolean;\n rowHeightPx: number;\n overscan: number;\n};\n\nexport type InfiniteScrollConfig = {\n enabled: boolean;\n thresholdPx?: number;\n autoLoad?: boolean;\n};\n\ntype DataTableSlot =\n | 'container'\n | 'header'\n | 'headerRow'\n | 'headerCell'\n | 'primaryHeaderCell'\n | 'body'\n | 'row'\n | 'rowEven'\n | 'rowOdd'\n | 'cell'\n | 'primaryCell'\n | 'emptyRow'\n | 'emptyCell';\n\nexport type VirtualizedConnectionTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n emptyState?: JSX.Element;\n className?: string;\n gridTemplateColumns?: string;\n kind?: DataTableKind;\n classes?: SlotClasses<DataTableSlot>;\n\n virtualization?: VirtualizationConfig;\n\n infiniteScroll?: InfiniteScrollConfig;\n hasNextPage?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n};\n\nconst DEFAULT_TEMPLATE_CELL = 'minmax(0, 1fr)';\n\nconst buildInlineTemplate = (\n columnCount: number,\n gridTemplateColumns?: string,\n): CSSProperties => {\n if (typeof gridTemplateColumns === 'string' && gridTemplateColumns !== '') {\n return { gridTemplateColumns };\n }\n return {\n gridTemplateColumns: `repeat(${columnCount}, ${DEFAULT_TEMPLATE_CELL})`,\n };\n};\n\nconst getVisibilityClass = (minVisibleAt?: DataTableBreakpoint) => {\n if (minVisibleAt == null) {\n return null;\n }\n return dataTableStyles.hideBelowRecipe({ minVisibleAt });\n};\n\nconst findScrollParent = (el: HTMLElement | null): HTMLElement | null => {\n let current: HTMLElement | null = el;\n while (current != null) {\n const style = window.getComputedStyle(current);\n const { overflowY } = style;\n if (\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay'\n ) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n};\n\ntype VirtualWindow = {\n startIndex: number;\n endIndex: number;\n};\n\nconst clamp = (value: number, min: number, max: number): number => {\n return Math.min(max, Math.max(min, value));\n};\n\nexport const VirtualizedConnectionTable = <Row,>({\n columns,\n rows,\n getRowId,\n emptyState,\n className,\n gridTemplateColumns,\n kind,\n classes,\n virtualization,\n infiniteScroll,\n hasNextPage = false,\n isLoadingMore = false,\n onLoadMore,\n ariaLabel,\n ariaLabelledBy,\n}: VirtualizedConnectionTableProps<Row>): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedKind: DataTableKind = kind ?? 'default';\n const resolvedAriaLabel = ariaLabel ?? t('common.table.label');\n let tableAriaLabel: string | undefined = resolvedAriaLabel;\n if (ariaLabelledBy != null) {\n tableAriaLabel = undefined;\n }\n const containerRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const scrollParentRef = useRef<HTMLElement | null>(null);\n const rafRef = useRef<number | null>(null);\n const loadMoreCooldownRef = useRef(false);\n\n const isVirtualized = virtualization?.enabled === true;\n const rowHeightPx = useMemo(() => {\n if (!isVirtualized) {\n return null;\n }\n\n const configuredRowHeight = virtualization.rowHeightPx;\n if (\n typeof configuredRowHeight === 'number' &&\n Number.isFinite(configuredRowHeight) &&\n configuredRowHeight > 0\n ) {\n return configuredRowHeight;\n }\n\n return 56;\n }, [isVirtualized, virtualization]);\n\n const overscan = useMemo(() => {\n if (!isVirtualized) {\n return 0;\n }\n\n let nextOverscan = 10;\n const configuredOverscan = virtualization.overscan;\n if (\n typeof configuredOverscan === 'number' &&\n Number.isFinite(configuredOverscan)\n ) {\n nextOverscan = configuredOverscan;\n }\n return Math.max(0, nextOverscan);\n }, [isVirtualized, virtualization]);\n\n const thresholdPx = infiniteScroll?.thresholdPx ?? 800;\n const autoLoad = infiniteScroll?.autoLoad ?? true;\n const infiniteEnabled = infiniteScroll?.enabled === true;\n\n const canLoadMore =\n infiniteEnabled && hasNextPage && !isLoadingMore && onLoadMore != null;\n\n const triggerLoadMore = useCallback(() => {\n if (onLoadMore == null) {\n return;\n }\n onLoadMore();\n }, [onLoadMore]);\n\n const [windowState, setWindowState] = useState<VirtualWindow>(() => {\n return { startIndex: 0, endIndex: Math.min(rows.length, 50) };\n });\n\n const inlineTemplateStyle = useMemo(() => {\n return buildInlineTemplate(columns.length, gridTemplateColumns);\n }, [columns.length, gridTemplateColumns]);\n\n const renderRow = useCallback(\n (row: Row, index: number, heightPx?: number | null): JSX.Element => {\n const rowId = getRowId(row, index);\n const rowClasses = [\n dataTableStyles.row({ kind: resolvedKind }),\n classes?.row,\n ];\n if (index % 2 === 0) {\n rowClasses.push(\n dataTableStyles.rowEven({ kind: resolvedKind }),\n classes?.rowEven,\n );\n } else {\n rowClasses.push(\n dataTableStyles.rowOdd({ kind: resolvedKind }),\n classes?.rowOdd,\n );\n }\n const rowStyle: CSSProperties = { ...inlineTemplateStyle };\n if (typeof heightPx === 'number') {\n rowStyle.height = heightPx;\n }\n return (\n <div\n key={rowId}\n role=\"row\"\n className={cx(...rowClasses)}\n style={rowStyle}\n >\n {columns.map((column) => {\n const cellClasses = [\n dataTableStyles.cell({ kind: resolvedKind }),\n styles.singleLineCell,\n classes?.cell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n cellClasses.push(visibilityClass);\n }\n if (column.className != null) {\n cellClasses.push(column.className);\n }\n if (column.isPrimary) {\n cellClasses.push(\n dataTableStyles.primaryCell,\n classes?.primaryCell,\n );\n }\n if (column.align != null) {\n cellClasses.push(\n dataTableStyles.alignRecipe({ align: column.align }),\n );\n }\n return (\n <div key={column.id} role=\"cell\" className={cx(...cellClasses)}>\n {column.cell(row)}\n </div>\n );\n })}\n </div>\n );\n },\n [classes, columns, getRowId, inlineTemplateStyle, resolvedKind],\n );\n\n const computeVirtualWindow = useCallback(() => {\n if (!isVirtualized) {\n return;\n }\n const height = rowHeightPx;\n if (height == null) {\n return;\n }\n const bodyEl = bodyRef.current;\n if (bodyEl == null) {\n return;\n }\n\n const scrollParent = scrollParentRef.current;\n const viewportHeight = scrollParent?.clientHeight ?? window.innerHeight;\n const parentRectTop = scrollParent?.getBoundingClientRect().top ?? 0;\n const bodyRectTop = bodyEl.getBoundingClientRect().top;\n const relativeTop = bodyRectTop - parentRectTop;\n const visibleTop = Math.max(0, -relativeTop);\n const visibleBottom = visibleTop + viewportHeight;\n\n const totalHeight = rows.length * height;\n const clampedBottom = clamp(visibleBottom, 0, totalHeight);\n const clampedTop = clamp(visibleTop, 0, totalHeight);\n\n const rawStart = Math.floor(clampedTop / height) - overscan;\n const rawEnd = Math.ceil(clampedBottom / height) + overscan;\n\n const startIndex = clamp(rawStart, 0, rows.length);\n const endIndex = clamp(rawEnd, startIndex, rows.length);\n\n setWindowState((prev) => {\n if (prev.startIndex === startIndex && prev.endIndex === endIndex) {\n return prev;\n }\n return { startIndex, endIndex };\n });\n\n if (\n autoLoad &&\n canLoadMore &&\n totalHeight - clampedBottom <= thresholdPx &&\n !loadMoreCooldownRef.current\n ) {\n loadMoreCooldownRef.current = true;\n triggerLoadMore();\n window.setTimeout(() => {\n loadMoreCooldownRef.current = false;\n }, 250);\n }\n }, [\n autoLoad,\n canLoadMore,\n isVirtualized,\n overscan,\n rowHeightPx,\n rows.length,\n thresholdPx,\n triggerLoadMore,\n ]);\n\n const scheduleCompute = useCallback(() => {\n if (rafRef.current != null) {\n return;\n }\n rafRef.current = window.requestAnimationFrame(() => {\n rafRef.current = null;\n computeVirtualWindow();\n });\n }, [computeVirtualWindow]);\n\n useLayoutEffect(() => {\n if (!isVirtualized) {\n return;\n }\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n scrollParentRef.current = findScrollParent(container);\n scheduleCompute();\n }, [isVirtualized, scheduleCompute]);\n\n useEffect(() => {\n if (!isVirtualized) {\n return undefined;\n }\n const scrollParent = scrollParentRef.current;\n const target: HTMLElement | Window = scrollParent ?? window;\n\n const handler = () => {\n scheduleCompute();\n };\n\n target.addEventListener('scroll', handler, { passive: true });\n window.addEventListener('resize', handler);\n\n return () => {\n target.removeEventListener('scroll', handler);\n window.removeEventListener('resize', handler);\n };\n }, [isVirtualized, scheduleCompute]);\n\n useEffect(() => {\n if (isVirtualized) {\n return undefined;\n }\n if (!infiniteEnabled || !autoLoad || !canLoadMore) {\n return undefined;\n }\n const sentinel = sentinelRef.current;\n if (sentinel == null) {\n return undefined;\n }\n\n const scrollParent = scrollParentRef.current;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const [entry] = entries;\n if (entry == null) {\n return;\n }\n\n if (entry.isIntersecting && !loadMoreCooldownRef.current) {\n loadMoreCooldownRef.current = true;\n triggerLoadMore();\n window.setTimeout(() => {\n loadMoreCooldownRef.current = false;\n }, 250);\n }\n },\n {\n root: scrollParent,\n rootMargin: `0px 0px ${thresholdPx}px 0px`,\n },\n );\n\n observer.observe(sentinel);\n return () => {\n observer.disconnect();\n };\n }, [\n autoLoad,\n canLoadMore,\n infiniteEnabled,\n isVirtualized,\n thresholdPx,\n triggerLoadMore,\n ]);\n\n useLayoutEffect(() => {\n if (isVirtualized) {\n return;\n }\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n scrollParentRef.current = findScrollParent(container);\n }, [isVirtualized]);\n\n const headerRow = (\n <div\n className={cx(\n dataTableStyles.header({ kind: resolvedKind }),\n classes?.header,\n )}\n role=\"rowgroup\"\n >\n <div\n className={cx(dataTableStyles.headerRow, classes?.headerRow)}\n role=\"row\"\n style={inlineTemplateStyle}\n >\n {columns.map((column) => {\n const headerClasses = [\n dataTableStyles.headerCell({ kind: resolvedKind }),\n classes?.headerCell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n headerClasses.push(visibilityClass);\n }\n if (column.className != null) {\n headerClasses.push(column.className);\n }\n if (column.isPrimary) {\n headerClasses.push(\n dataTableStyles.primaryHeaderCell,\n classes?.primaryHeaderCell,\n );\n }\n if (column.align != null) {\n headerClasses.push(\n dataTableStyles.alignRecipe({ align: column.align }),\n );\n }\n return (\n <div\n key={column.id}\n role=\"columnheader\"\n className={cx(...headerClasses)}\n >\n {column.header}\n </div>\n );\n })}\n </div>\n </div>\n );\n\n let bodyRows: JSX.Element;\n if (rows.length === 0) {\n bodyRows = (\n <div\n className={cx(dataTableStyles.emptyRow, classes?.emptyRow)}\n role=\"row\"\n >\n <div role=\"cell\">\n {emptyState ?? (\n <div className={cx(dataTableStyles.emptyCell, classes?.emptyCell)}>\n {t('common.table.empty')}\n </div>\n )}\n </div>\n </div>\n );\n } else if (isVirtualized && rowHeightPx != null) {\n const { startIndex, endIndex } = windowState;\n const topSpacerHeight = startIndex * rowHeightPx;\n const bottomSpacerHeight = (rows.length - endIndex) * rowHeightPx;\n const slice = rows.slice(startIndex, endIndex);\n bodyRows = (\n <div className={styles.bodyViewport} ref={bodyRef}>\n <div className={styles.spacer} style={{ height: topSpacerHeight }} />\n {slice.map((row, sliceIndex) => {\n const absoluteIndex = startIndex + sliceIndex;\n return renderRow(row, absoluteIndex, rowHeightPx);\n })}\n <div className={styles.spacer} style={{ height: bottomSpacerHeight }} />\n </div>\n );\n } else {\n bodyRows = (\n <div ref={bodyRef}>\n {rows.map((row, index) => {\n return renderRow(row, index, null);\n })}\n </div>\n );\n }\n\n let sentinelNode: JSX.Element | null = null;\n if (!isVirtualized && infiniteEnabled && autoLoad) {\n sentinelNode = <div ref={sentinelRef} className={styles.sentinel} />;\n }\n\n return (\n <div\n ref={containerRef}\n className={cx(\n dataTableStyles.container({ kind: resolvedKind }),\n classes?.container,\n className,\n )}\n role=\"table\"\n aria-label={tableAriaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {headerRow}\n <div\n className={cx(\n dataTableStyles.body({ kind: resolvedKind }),\n classes?.body,\n )}\n role=\"rowgroup\"\n >\n {bodyRows}\n {sentinelNode}\n </div>\n </div>\n );\n};\n\nexport const __test = {\n buildInlineTemplate,\n getVisibilityClass,\n clamp,\n} as const;\n","/** Copies text using the legacy `document.execCommand('copy')` fallback. */\nexport function copyWithExecCommand(text: string): boolean {\n try {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', 'true');\n textarea.style.position = 'fixed';\n textarea.style.top = '-1000px';\n textarea.style.left = '-1000px';\n document.body.appendChild(textarea);\n textarea.select();\n const ok = document.execCommand('copy');\n document.body.removeChild(textarea);\n return ok;\n } catch {\n return false;\n }\n}\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n minWidth: 0,\n});\n\nexport const value = sprinkles({\n overflow: 'hidden',\n fontSize: 'sm',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 'md',\n minWidth: 0,\n});\n\nexport const valueNoTruncate = sprinkles({\n maxWidth: 'none',\n whiteSpace: 'normal',\n overflow: 'visible',\n textOverflow: 'clip',\n});\n\nexport const feedback = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n});\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type JSX,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button, cx } from '@plumile/ui';\nimport { copyWithExecCommand } from '../../shared/copyWithExecCommand.js';\n\nimport * as styles from './copyableText.css.js';\n\nexport type CopyableTextProps = {\n value: string;\n copyValue?: string;\n className?: string;\n truncate?: boolean;\n copyLabel?: string;\n copiedLabel?: string;\n};\n\nexport const CopyableText = ({\n value,\n copyValue,\n className,\n truncate = true,\n copyLabel,\n copiedLabel,\n}: CopyableTextProps): JSX.Element => {\n const { t } = useTranslation('ui', { useSuspense: false });\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<number | null>(null);\n const resolvedCopyLabel =\n copyLabel ??\n t('backoffice.copyableText.copy', {\n defaultValue: 'Copy',\n });\n const resolvedCopiedLabel =\n copiedLabel ??\n t('backoffice.copyableText.copied', {\n defaultValue: 'Copied',\n });\n\n const resolvedCopyValue = copyValue ?? value;\n\n const displayClassName = useMemo(() => {\n let noTruncateClass: string | null = null;\n if (!truncate) {\n noTruncateClass = styles.valueNoTruncate;\n }\n return cx(styles.value, noTruncateClass, className);\n }, [className, truncate]);\n\n const clearTimer = useCallback(() => {\n if (timeoutRef.current != null) {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return () => {\n clearTimer();\n };\n }, [clearTimer]);\n\n const handleCopy = useCallback(async () => {\n clearTimer();\n let ok = false;\n try {\n if (typeof navigator !== 'undefined') {\n const { clipboard } = navigator;\n await clipboard.writeText(resolvedCopyValue);\n ok = true;\n }\n } catch {\n ok = false;\n }\n\n if (!ok) {\n ok = copyWithExecCommand(resolvedCopyValue);\n }\n\n if (ok) {\n setCopied(true);\n timeoutRef.current = window.setTimeout(() => {\n setCopied(false);\n timeoutRef.current = null;\n }, 1400);\n }\n }, [clearTimer, resolvedCopyValue]);\n\n const handleCopyClick = () => {\n handleCopy().catch(() => {});\n };\n\n let feedbackNode: JSX.Element | null = null;\n if (copied) {\n feedbackNode = (\n <span className={styles.feedback} role=\"status\" aria-live=\"polite\">\n {resolvedCopiedLabel}\n </span>\n );\n }\n\n return (\n <span className={styles.root}>\n <span className={displayClassName} title={value}>\n {value}\n </span>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleCopyClick}\n >\n {resolvedCopyLabel}\n </Button>\n {feedbackNode}\n </span>\n );\n};\n\nexport default CopyableText;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n minWidth: 0,\n});\n","import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { CopyableText } from '../copyable_text/CopyableText.js';\n\nimport * as styles from './backofficeIdBadge.css.js';\n\nexport type BackofficeIdBadgeProps = {\n id: string;\n className?: string;\n copyLabel?: string;\n copiedLabel?: string;\n truncate?: boolean;\n};\n\nexport const BackofficeIdBadge = ({\n id,\n className,\n copyLabel,\n copiedLabel,\n truncate = true,\n}: BackofficeIdBadgeProps): JSX.Element => {\n const { t } = useTranslation('ui', { useSuspense: false });\n const resolvedCopyLabel =\n copyLabel ??\n t('backoffice.idBadge.copy', {\n defaultValue: 'Copy ID',\n });\n const resolvedCopiedLabel =\n copiedLabel ??\n t('backoffice.copyableText.copied', {\n defaultValue: 'Copied',\n });\n\n return (\n <span className={styles.container}>\n <CopyableText\n value={id}\n className={className}\n copyLabel={resolvedCopyLabel}\n copiedLabel={resolvedCopiedLabel}\n truncate={truncate}\n />\n </span>\n );\n};\n\nexport default BackofficeIdBadge;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const label = sprinkles({\n textTransform: 'uppercase',\n});\n","import { type JSX } from 'react';\n\nimport { Badge } from '@plumile/ui';\n\nimport * as styles from './environmentBadge.css.js';\n\nexport type EnvironmentBadgeEnvironment = 'dev' | 'staging' | 'prod';\n\nexport type EnvironmentBadgeProps = {\n environment: EnvironmentBadgeEnvironment;\n className?: string;\n label?: string;\n};\n\ntype BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\n\nconst badgeToneMap: Record<EnvironmentBadgeEnvironment, BadgeTone> = {\n dev: 'neutral',\n staging: 'warning',\n prod: 'danger',\n};\n\nconst defaultLabelMap: Record<EnvironmentBadgeEnvironment, string> = {\n dev: 'DEV',\n staging: 'STAGING',\n prod: 'PROD',\n};\n\nexport const EnvironmentBadge = ({\n environment,\n className,\n label,\n}: EnvironmentBadgeProps): JSX.Element => {\n const badgeTone = badgeToneMap[environment];\n const resolvedLabel = label ?? defaultLabelMap[environment];\n\n return (\n <Badge tone={badgeTone} className={className}>\n <span className={styles.label}>{resolvedLabel}</span>\n </Badge>\n );\n};\n\nexport default EnvironmentBadge;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n});\n\nexport const key = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n paddingX: 1.5,\n paddingY: 0.5,\n borderRadius: 'sm',\n fontSize: '2xs',\n fontWeight: 'medium',\n lineHeight: 'none',\n});\n","import { type JSX } from 'react';\n\nimport * as styles from './shortcutHint.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type ShortcutHintProps = {\n keys: readonly string[] | string;\n className?: string;\n};\n\nexport const ShortcutHint = ({\n keys,\n className,\n}: ShortcutHintProps): JSX.Element => {\n let parts: string[] = [];\n if (typeof keys === 'string') {\n parts = keys.split(' ');\n } else {\n parts = [...keys];\n }\n\n return (\n <span className={cx(styles.container, className)} aria-hidden=\"true\">\n {parts.map((part, index) => {\n return (\n <kbd key={`${part}-${index}`} className={styles.key}>\n {part}\n </kbd>\n );\n })}\n </span>\n );\n};\n\nexport default ShortcutHint;\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nconst shimmer = keyframes({\n '0%': { backgroundPosition: '100% 0' },\n '100%': { backgroundPosition: '-100% 0' },\n});\n\nexport const base = style([\n sprinkles({\n display: 'block',\n borderRadius: 'md',\n backgroundSize: 'skeleton',\n willChange: 'background-position',\n }),\n {\n animation: `${shimmer} 1.1s ease-in-out infinite`,\n },\n]);\n\nexport const variant = {\n text: sprinkles({ borderRadius: 'sm' }),\n block: sprinkles({ borderRadius: 'md' }),\n circle: sprinkles({ borderRadius: 'full' }),\n} as const;\n\nexport const linesContainer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import type { SkeletonVariant } from './Skeleton.js';\n\nexport const toCssSize = (\n value: number | string | undefined,\n): string | undefined => {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'number') {\n return `${value}px`;\n }\n return value;\n};\n\nexport const defaultHeightForVariant = (variant: SkeletonVariant): string => {\n if (variant === 'text') {\n return '0.875rem';\n }\n if (variant === 'circle') {\n return '2.25rem';\n }\n return '6rem';\n};\n\nexport const __test = {\n toCssSize,\n defaultHeightForVariant,\n} as const;\n","import { type CSSProperties, type JSX } from 'react';\n\nimport * as styles from './skeleton.css.js';\nimport { cx } from '@plumile/ui';\nimport { defaultHeightForVariant, toCssSize } from './Skeleton.helpers.js';\n\nexport type SkeletonVariant = 'text' | 'block' | 'circle';\n\nexport type SkeletonProps = {\n variant?: SkeletonVariant;\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n lines?: number;\n};\n\nexport const Skeleton = ({\n variant = 'text',\n width,\n height,\n className,\n style,\n lines,\n}: SkeletonProps): JSX.Element => {\n const resolvedHeight = toCssSize(height) ?? defaultHeightForVariant(variant);\n const resolvedWidth = toCssSize(width);\n\n const baseStyle: CSSProperties = {\n width: resolvedWidth,\n height: resolvedHeight,\n ...style,\n };\n\n const shouldRenderLines = variant === 'text' && (lines ?? 1) > 1;\n\n if (!shouldRenderLines) {\n return (\n <span\n aria-hidden=\"true\"\n className={cx(styles.base, styles.variant[variant], className)}\n style={baseStyle}\n />\n );\n }\n\n const count = Math.max(1, lines ?? 1);\n\n return (\n <span aria-hidden=\"true\" className={styles.linesContainer}>\n {Array.from({ length: count }, (_, index) => {\n const isLast = index === count - 1;\n let lineWidth = resolvedWidth ?? '100%';\n if (isLast) {\n lineWidth = '70%';\n }\n return (\n <span\n key={`line-${index}`}\n className={cx(styles.base, styles.variant.text, className)}\n style={{\n ...baseStyle,\n width: lineWidth,\n height: resolvedHeight,\n }}\n />\n );\n })}\n </span>\n );\n};\n\nexport default Skeleton;\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nconst spin = keyframes({\n to: { transform: 'rotate(360deg)' },\n});\n\nexport const root = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const icon = style({\n animation: `${spin} 0.9s linear infinite`,\n // color: vars.colors['slate-600'],\n});\n","import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { ButtonLoadingSpinnerSvg } from '../../../icons/ButtonLoadingSpinnerSvg.js';\n\nimport * as styles from './spinner.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type SpinnerProps = {\n size?: number;\n className?: string;\n ariaLabel?: string;\n};\n\nexport const Spinner = ({\n size = 18,\n className,\n ariaLabel,\n}: SpinnerProps): JSX.Element => {\n const { t } = useTranslation('ui', { useSuspense: false });\n const resolvedAriaLabel =\n ariaLabel ?? t('common.loading', { defaultValue: 'Loading...' });\n\n return (\n <span\n className={cx(styles.root, className)}\n role=\"status\"\n aria-label={resolvedAriaLabel}\n >\n <ButtonLoadingSpinnerSvg\n className={styles.icon}\n width={size}\n height={size}\n />\n </span>\n );\n};\n\nexport default Spinner;\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst rootBase = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n paddingY: 1,\n paddingX: 2,\n borderRadius: 'full',\n fontSize: 'xs',\n fontWeight: 'medium',\n});\n\nconst toneNeutral = sprinkles({ backgroundColor: 'brandLightGray' });\nconst toneInfo = sprinkles({\n backgroundColor: 'primaryLight',\n color: 'brandPrimaryRed',\n});\nconst toneSuccess = sprinkles({\n backgroundColor: 'green-100',\n color: 'green-700',\n});\nconst toneWarning = sprinkles({\n backgroundColor: 'amber-100',\n color: 'amber-700',\n});\nconst toneDanger = sprinkles({\n backgroundColor: 'red-100',\n color: 'red-700',\n});\n\nexport const rootRecipe = recipe({\n base: rootBase,\n variants: {\n tone: {\n neutral: toneNeutral,\n info: toneInfo,\n success: toneSuccess,\n warning: toneWarning,\n danger: toneDanger,\n },\n },\n defaultVariants: {\n tone: 'neutral',\n },\n});\n\nexport type RootRecipeVariants = RecipeVariants<typeof rootRecipe>;\n\nexport const removeButton = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'full',\n borderWidth: 0,\n borderStyle: 'none',\n backgroundColor: 'transparent',\n color: 'inherit',\n padding: 0,\n cursor: 'pointer',\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n","import { type JSX, type ReactNode, useId } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\n\nimport * as styles from './tag.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type TagTone = NonNullable<\n NonNullable<RecipeVariants<typeof styles.rootRecipe>>['tone']\n>;\n\nexport type TagProps = {\n children: ReactNode;\n tone?: TagTone;\n className?: string;\n onRemove?: () => void;\n removeLabel?: string;\n};\n\nexport const Tag = ({\n children,\n tone = 'neutral',\n className,\n onRemove,\n removeLabel,\n}: TagProps): JSX.Element => {\n const { t } = useTranslation('ui', { useSuspense: false });\n const labelId = useId();\n const isRemovable = typeof onRemove === 'function';\n const resolvedRemoveLabel =\n removeLabel ?? t('backoffice.tag.remove', { defaultValue: 'Remove' });\n\n let removeButtonNode: JSX.Element | null = null;\n if (isRemovable) {\n removeButtonNode = (\n <button\n type=\"button\"\n className={styles.removeButton}\n onClick={onRemove}\n aria-label={resolvedRemoveLabel}\n aria-describedby={labelId}\n >\n <ModalCloseSvg width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n }\n\n return (\n <span className={cx(styles.rootRecipe({ tone }), className)}>\n <span id={labelId}>{children}</span>\n {removeButtonNode}\n </span>\n );\n};\n\nexport default Tag;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const layout = sprinkles({\n display: 'grid',\n gridTemplateColumns: {\n base: 'detailAside320',\n lg: 'detailSingle',\n },\n alignItems: 'flex-start',\n gap: 4,\n});\n\nexport const primary = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n minWidth: 0,\n});\n\nexport const secondary = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const stacked = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeDetailLayout.css.js';\n\nexport type BackofficeDetailLayoutProps = {\n header: ReactNode;\n content: ReactNode;\n aside?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeDetailLayout = ({\n header,\n content,\n aside,\n className,\n}: BackofficeDetailLayoutProps): JSX.Element => {\n let headerNode: JSX.Element | null = null;\n if (header != null) {\n headerNode = <div className={styles.header}>{header}</div>;\n }\n\n if (aside == null) {\n return (\n <div className={cx(styles.container, className)}>\n {headerNode}\n <div className={styles.stacked}>{content}</div>\n </div>\n );\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {headerNode}\n <div className={styles.layout}>\n <div className={styles.primary}>{content}</div>\n <aside className={styles.secondary}>{aside}</aside>\n </div>\n </div>\n );\n};\n\nexport default BackofficeDetailLayout;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n paddingY: 10,\n paddingX: 4,\n gap: 3,\n color: 'textSecondary',\n});\n\nexport const icon = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'textSecondary',\n});\n\nexport const title = sprinkles({\n fontSize: 'lg',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const description = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n maxWidth: 'lg',\n});\n\nexport const actions = sprinkles({\n marginTop: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n justifyContent: 'center',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeEmptyState.css.js';\n\nexport type BackofficeEmptyStateProps = {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n icon?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeEmptyState = ({\n title,\n description,\n actions,\n icon,\n className,\n}: BackofficeEmptyStateProps): JSX.Element => {\n let descriptionNode: JSX.Element | null = null;\n if (description != null) {\n descriptionNode = <div className={styles.description}>{description}</div>;\n }\n\n let actionsNode: JSX.Element | null = null;\n if (actions != null) {\n actionsNode = <div className={styles.actions}>{actions}</div>;\n }\n\n let iconNode: JSX.Element | null = null;\n if (icon != null) {\n iconNode = <div className={styles.icon}>{icon}</div>;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {iconNode}\n <div className={styles.title}>{title}</div>\n {descriptionNode}\n {actionsNode}\n </div>\n );\n};\n\nexport default BackofficeEmptyState;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const backdrop = style({\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgb(15 23 42 / 0.35)',\n zIndex: vars.zIndex.modal,\n});\n\nexport const drawerContainer = sprinkles({\n position: 'fixed',\n inset: 0,\n display: 'flex',\n justifyContent: 'flex-end',\n zIndex: 'modal',\n});\n\nexport const drawer = sprinkles({\n backgroundColor: 'surface',\n borderLeftColor: 'borderSubtle',\n borderLeftWidth: 'default',\n borderStyle: 'solid',\n boxShadow: 'xl',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n height: 'full',\n maxWidth: '26rem',\n overflowY: 'auto',\n padding: 5,\n width: 'full',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n});\n\nexport const titleBlock = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const title = sprinkles({\n fontSize: 'xl',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const subtitle = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const closeButton = style({\n alignItems: 'center',\n backgroundColor: vars.colors.surfaceMuted,\n borderRadius: vars.borderRadius.full,\n borderStyle: 'none',\n borderWidth: 0,\n color: vars.colors.textSecondary,\n cursor: 'pointer',\n display: 'inline-flex',\n height: vars.height[8],\n justifyContent: 'center',\n transitionProperty: vars.transitionProperty.colors,\n transitionDuration: vars.transitionDuration[150],\n transitionTimingFunction: vars.transitionTimingFunction.ease,\n width: vars.width[8],\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceSecondary,\n color: vars.colors.text,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n});\n\nexport const searchRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const sections = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const section = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const sectionHeader = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const sectionTitle = sprinkles({\n fontSize: 'xs',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n color: 'textMuted',\n fontWeight: 'semibold',\n});\n\nexport const sectionDescription = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const sectionItems = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const sectionItem = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const emptyState = sprinkles({\n padding: 4,\n borderRadius: 'md',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surfaceSecondary',\n color: 'textSecondary',\n fontSize: 'sm',\n textAlign: 'center',\n});\n","import {\n useEffect,\n useId,\n useRef,\n type ChangeEvent,\n type JSX,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button, Input } from '@plumile/ui';\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\n\nimport * as styles from './backofficeFilterDrawer.css.js';\n\nexport type BackofficeFilterDrawerItem = {\n id: string;\n node: ReactNode;\n};\n\nexport type BackofficeFilterDrawerSection = {\n id: string;\n title: ReactNode;\n description?: ReactNode;\n items: readonly BackofficeFilterDrawerItem[];\n};\n\nexport type BackofficeFilterDrawerProps = {\n isOpen: boolean;\n title?: string;\n sections: readonly BackofficeFilterDrawerSection[];\n searchValue?: string;\n emptyLabel?: ReactNode;\n onSearchChange?: (value: string) => void;\n onClose: () => void;\n onReset?: () => void;\n};\n\nexport const BackofficeFilterDrawer = ({\n isOpen,\n title,\n sections,\n searchValue,\n emptyLabel,\n onSearchChange,\n onClose,\n onReset,\n}: BackofficeFilterDrawerProps): JSX.Element | null => {\n const { t } = useTranslation('ui');\n const titleId = useId();\n const searchInputId = useId();\n const resolvedTitle = title ?? t('backoffice.filterDrawer.title');\n const closeButtonRef = useRef<HTMLButtonElement | null>(null);\n const drawerRef = useRef<HTMLElement | null>(null);\n const onCloseRef = useRef(onClose);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n onCloseRef.current = onClose;\n }, [onClose]);\n\n useEffect(() => {\n if (!isOpen) {\n return () => {};\n }\n\n let activeElement: HTMLElement | null = null;\n if (document.activeElement instanceof HTMLElement) {\n activeElement = document.activeElement;\n }\n restoreFocusRef.current = activeElement;\n\n const focusTimeout = window.setTimeout(() => {\n closeButtonRef.current?.focus();\n }, 0);\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onCloseRef.current();\n return;\n }\n\n if (event.key !== 'Tab') {\n return;\n }\n\n const drawerElement = drawerRef.current;\n if (drawerElement == null) {\n return;\n }\n\n const focusableElements = Array.from(\n drawerElement.querySelectorAll<HTMLElement>(\n [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(','),\n ),\n ).filter((element) => {\n return element.offsetParent != null;\n });\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n if (firstElement == null || lastElement == null) {\n event.preventDefault();\n drawerElement.focus();\n return;\n }\n\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n return;\n }\n\n if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.clearTimeout(focusTimeout);\n window.removeEventListener('keydown', handleKeyDown);\n restoreFocusRef.current?.focus();\n restoreFocusRef.current = null;\n };\n }, [isOpen]);\n\n if (!isOpen) {\n return null;\n }\n\n const totalCount = sections.reduce((total, section) => {\n return total + section.items.length;\n }, 0);\n\n let searchNode: JSX.Element | null = null;\n if (onSearchChange != null) {\n searchNode = (\n <Input\n id={searchInputId}\n name=\"backoffice-filter-drawer-search\"\n value={searchValue ?? ''}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n onSearchChange(event.target.value);\n }}\n placeholder={t('backoffice.filterDrawer.searchPlaceholder')}\n aria-label={t('backoffice.filterDrawer.searchAriaLabel')}\n size=\"small\"\n fullWidth\n />\n );\n }\n\n let resetNode: JSX.Element | null = null;\n if (onReset != null) {\n resetNode = (\n <Button type=\"button\" variant=\"secondary\" size=\"small\" onClick={onReset}>\n {t('backoffice.filterDrawer.reset')}\n </Button>\n );\n }\n\n const drawerContent = (\n <>\n <div className={styles.backdrop} onClick={onClose} />\n <div className={styles.drawerContainer} onClick={onClose}>\n <aside\n ref={drawerRef}\n className={styles.drawer}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <div className={styles.header}>\n <div className={styles.titleBlock}>\n <div id={titleId} className={styles.title}>\n {resolvedTitle}\n </div>\n <div className={styles.subtitle}>\n {t('backoffice.filterDrawer.subtitle', { count: totalCount })}\n </div>\n </div>\n <button\n ref={closeButtonRef}\n type=\"button\"\n className={styles.closeButton}\n onClick={onClose}\n aria-label={t('backoffice.filterDrawer.closeAriaLabel')}\n >\n <ModalCloseSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div className={styles.searchRow}>\n {searchNode}\n {resetNode}\n </div>\n\n <div className={styles.sections}>\n {sections.length === 0 && (\n <div className={styles.emptyState}>\n {emptyLabel ?? t('backoffice.filterDrawer.empty')}\n </div>\n )}\n {sections.length > 0 &&\n sections.map((section) => {\n let descriptionNode: JSX.Element | null = null;\n if (section.description != null) {\n descriptionNode = (\n <div className={styles.sectionDescription}>\n {section.description}\n </div>\n );\n }\n\n return (\n <section key={section.id} className={styles.section}>\n <div className={styles.sectionHeader}>\n <div className={styles.sectionTitle}>{section.title}</div>\n {descriptionNode}\n </div>\n <div className={styles.sectionItems}>\n {section.items.map((item) => {\n return (\n <div key={item.id} className={styles.sectionItem}>\n {item.node}\n </div>\n );\n })}\n </div>\n </section>\n );\n })}\n </div>\n </aside>\n </div>\n </>\n );\n\n if (typeof document === 'undefined') {\n return drawerContent;\n }\n\n return createPortal(drawerContent, document.body);\n};\n\nexport default BackofficeFilterDrawer;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const field = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const label = sprinkles({\n fontSize: 'xs',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n color: 'textMuted',\n fontWeight: 'semibold',\n});\n\nexport const description = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const control = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeFilterField.css.js';\n\nexport type BackofficeFilterFieldProps = {\n label: ReactNode;\n description?: ReactNode;\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFilterField = ({\n label,\n description,\n children,\n className,\n}: BackofficeFilterFieldProps): JSX.Element => {\n let descriptionNode: JSX.Element | null = null;\n if (description != null) {\n descriptionNode = <div className={styles.description}>{description}</div>;\n }\n\n return (\n <div className={cx(styles.field, className)}>\n <div className={styles.header}>\n <div className={styles.label}>{label}</div>\n {descriptionNode}\n </div>\n <div className={styles.control}>{children}</div>\n </div>\n );\n};\n\nexport default BackofficeFilterField;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const topRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: {\n base: 'center',\n sm: 'stretch',\n },\n justifyContent: 'space-between',\n gap: 3,\n flexDirection: {\n base: 'row',\n sm: 'column',\n },\n});\n\nexport const left = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n flex: 1,\n});\n\nexport const right = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const chipsRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n minWidth: 0,\n flexWrap: 'wrap',\n gap: 2,\n paddingTop: 2,\n borderTopWidth: 'default',\n borderStyle: 'solid',\n borderTopColor: 'borderLight',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeFiltersBar.css.js';\n\nexport type BackofficeFiltersBarProps = {\n leftSlot?: ReactNode;\n searchSlot?: ReactNode;\n quickFiltersSlot?: ReactNode;\n allFiltersSlot?: ReactNode;\n rightActions?: ReactNode;\n chipsSlot?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFiltersBar = ({\n leftSlot,\n searchSlot,\n quickFiltersSlot,\n allFiltersSlot,\n rightActions,\n chipsSlot,\n className,\n}: BackofficeFiltersBarProps): JSX.Element | null => {\n const showTop =\n leftSlot != null ||\n searchSlot != null ||\n quickFiltersSlot != null ||\n allFiltersSlot != null ||\n rightActions != null;\n\n const showChips = chipsSlot != null;\n\n if (!showTop && !showChips) {\n return null;\n }\n\n let chipsNode: JSX.Element | null = null;\n if (showChips) {\n chipsNode = <div className={styles.chipsRow}>{chipsSlot}</div>;\n }\n\n let topNode: JSX.Element | null = null;\n if (showTop) {\n topNode = (\n <div className={styles.topRow}>\n <div className={styles.left}>\n {leftSlot}\n {searchSlot}\n {quickFiltersSlot}\n {allFiltersSlot}\n </div>\n <div className={styles.right}>{rightActions}</div>\n </div>\n );\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {topNode}\n {chipsNode}\n </div>\n );\n};\n\nexport default BackofficeFiltersBar;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n padding: 4,\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const title = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const description = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n margin: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeFormSection.css.js';\n\nexport type BackofficeFormSectionProps = {\n title?: string;\n description?: string;\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFormSection = ({\n title,\n description,\n children,\n className,\n}: BackofficeFormSectionProps): JSX.Element => {\n const hasHeader =\n (title != null && title.trim() !== '') ||\n (description != null && description.trim() !== '');\n\n return (\n <section className={cx(styles.container, className)}>\n {hasHeader && (\n <div className={styles.header}>\n {title != null && title.trim() !== '' && (\n <h3 className={styles.title}>{title}</h3>\n )}\n {description != null && description.trim() !== '' && (\n <p className={styles.description}>{description}</p>\n )}\n </div>\n )}\n {children}\n </section>\n );\n};\n\nexport default BackofficeFormSection;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const footer = sprinkles({\n display: 'flex',\n justifyContent: 'flex-end',\n flexWrap: 'wrap',\n gap: 3,\n});\n","import { useCallback, useState, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n Button,\n type ButtonProps,\n} from '../../../atomic/atoms/button/Button.js';\nimport { ErrorMessage } from '../../../atomic/atoms/error_message/ErrorMessage.js';\nimport { Modal } from '../../../atomic/atoms/modal/Modal.js';\n\nimport * as styles from './confirmDialog.css.js';\n\nexport type ConfirmDialogProps = {\n isOpen: boolean;\n title: string;\n children: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmTone?: 'default' | 'danger';\n confirmVariant?: ButtonProps['variant'];\n isConfirmLoading?: boolean;\n onClose: () => void;\n onConfirm: () => Promise<void> | void;\n closeOnConfirm?: boolean;\n};\n\nexport const ConfirmDialog = ({\n isOpen,\n title,\n children,\n confirmLabel,\n cancelLabel,\n confirmTone = 'default',\n confirmVariant,\n isConfirmLoading = false,\n onClose,\n onConfirm,\n closeOnConfirm = true,\n}: ConfirmDialogProps): JSX.Element | null => {\n const { t } = useTranslation('ui', { useSuspense: false });\n const [isConfirming, setIsConfirming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const resolvedConfirmLabel =\n confirmLabel ?? t('common.actions.confirm', { defaultValue: 'Confirm' });\n const resolvedCancelLabel =\n cancelLabel ?? t('common.actions.cancel', { defaultValue: 'Cancel' });\n\n const handleClose = useCallback(() => {\n if (isConfirming || isConfirmLoading) {\n return;\n }\n setError(null);\n onClose();\n }, [isConfirming, isConfirmLoading, onClose]);\n\n const handleConfirm = useCallback(async () => {\n if (isConfirming || isConfirmLoading) {\n return;\n }\n setError(null);\n setIsConfirming(true);\n try {\n await onConfirm();\n if (closeOnConfirm) {\n onClose();\n }\n } catch (err) {\n let message = t('common.errors.unexpected', {\n defaultValue: 'An unexpected error occurred.',\n });\n if (err instanceof Error && err.message.trim() !== '') {\n message = err.message;\n }\n setError(message);\n } finally {\n setIsConfirming(false);\n }\n }, [closeOnConfirm, isConfirmLoading, isConfirming, onClose, onConfirm, t]);\n\n let resolvedConfirmVariant = confirmVariant ?? 'primary';\n if (confirmVariant == null && confirmTone === 'danger') {\n resolvedConfirmVariant = 'danger';\n }\n const resolvedIsConfirming = isConfirming || isConfirmLoading;\n\n const handleConfirmClick = () => {\n handleConfirm().catch(() => {});\n };\n\n const footer = (\n <div className={styles.footer}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={handleClose}\n disabled={resolvedIsConfirming}\n >\n {resolvedCancelLabel}\n </Button>\n <Button\n type=\"button\"\n variant={resolvedConfirmVariant}\n onClick={handleConfirmClick}\n isLoading={resolvedIsConfirming}\n >\n {resolvedConfirmLabel}\n </Button>\n </div>\n );\n\n let errorNode: JSX.Element | null = null;\n if (error != null) {\n errorNode = <ErrorMessage>{error}</ErrorMessage>;\n }\n\n return (\n <Modal isOpen={isOpen} onClose={handleClose} title={title} footer={footer}>\n <div className={styles.body}>\n {errorNode}\n {children}\n </div>\n </Modal>\n );\n};\n\nexport default ConfirmDialog;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n});\n\nexport const title = sprinkles({\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'textSecondary',\n});\n\nexport const actions = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const pre = sprinkles({\n margin: 0,\n padding: 4,\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'lg',\n color: 'text',\n fontFamily: 'mono',\n fontSize: 'xs',\n lineHeight: 1.45,\n overflow: 'auto',\n maxHeight: 96,\n whiteSpace: 'pre',\n});\n\nexport const truncated = sprinkles({\n maxHeight: 48,\n});\n","import { useCallback, useMemo, useState, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button, cx } from '@plumile/ui';\nimport { copyWithExecCommand } from '../../shared/copyWithExecCommand.js';\n\nimport * as styles from './backofficeJsonViewer.css.js';\n\nexport type BackofficeJsonViewerProps = {\n value: unknown;\n title?: string;\n className?: string;\n maxHeight?: string;\n truncate?: boolean;\n truncateLabel?: string;\n expandLabel?: string;\n copyLabel?: string;\n copiedLabel?: string;\n};\n\nexport const BackofficeJsonViewer = ({\n value,\n title,\n className,\n maxHeight,\n truncate = false,\n truncateLabel,\n expandLabel,\n copyLabel,\n copiedLabel,\n}: BackofficeJsonViewerProps): JSX.Element => {\n const { t } = useTranslation('ui');\n const [isCollapsed, setIsCollapsed] = useState(truncate);\n const [copied, setCopied] = useState(false);\n const resolvedTitle = title ?? t('backoffice.jsonViewer.title');\n const resolvedTruncateLabel =\n truncateLabel ?? t('backoffice.jsonViewer.collapse');\n const resolvedExpandLabel = expandLabel ?? t('backoffice.jsonViewer.expand');\n const resolvedCopyLabel = copyLabel ?? t('backoffice.jsonViewer.copy');\n const resolvedCopiedLabel = copiedLabel ?? t('backoffice.jsonViewer.copied');\n\n const jsonText = useMemo(() => {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return JSON.stringify({\n error: t('backoffice.jsonViewer.serializationError'),\n });\n }\n }, [t, value]);\n\n const handleCopy = useCallback(async () => {\n let ok = false;\n try {\n if (typeof navigator !== 'undefined') {\n await navigator.clipboard.writeText(jsonText);\n ok = true;\n }\n } catch {\n ok = false;\n }\n\n if (!ok) {\n ok = copyWithExecCommand(jsonText);\n }\n\n if (ok) {\n setCopied(true);\n window.setTimeout(() => {\n setCopied(false);\n }, 1400);\n }\n }, [jsonText]);\n\n const preStyle = useMemo(() => {\n if (maxHeight == null) {\n return undefined;\n }\n return { maxHeight };\n }, [maxHeight]);\n\n let copyButtonLabel = resolvedCopyLabel;\n if (copied) {\n copyButtonLabel = resolvedCopiedLabel;\n }\n\n let collapseButtonLabel = resolvedTruncateLabel;\n if (isCollapsed) {\n collapseButtonLabel = resolvedExpandLabel;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <div className={styles.header}>\n <span className={styles.title}>{resolvedTitle}</span>\n <div className={styles.actions}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n handleCopy().catch(() => {});\n }}\n >\n {copyButtonLabel}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsCollapsed((v) => {\n return !v;\n });\n }}\n >\n {collapseButtonLabel}\n </Button>\n </div>\n </div>\n <pre\n className={cx(styles.pre, { [styles.truncated]: isCollapsed })}\n style={preStyle}\n >\n {jsonText}\n </pre>\n </div>\n );\n};\n\nexport default BackofficeJsonViewer;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const fallback = sprinkles({\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n});\n","import { Suspense, lazy, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { BackofficeJsonViewerProps } from './BackofficeJsonViewer.js';\n\nimport * as styles from './LazyBackofficeJsonViewer.css.js';\n\nconst BackofficeJsonViewer = lazy(async () => {\n return import('./BackofficeJsonViewerAsync.js');\n});\n\nconst buildFallbackText = (\n value: unknown,\n serializationError = 'Failed to serialize JSON',\n): string => {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return JSON.stringify({ error: serializationError });\n }\n};\n\nexport const __testLazyBackofficeJsonViewer = {\n buildFallbackText,\n} as const;\n\nconst FallbackViewer = ({\n value,\n className,\n}: Pick<BackofficeJsonViewerProps, 'value' | 'className'>): JSX.Element => {\n const { t } = useTranslation('ui', { useSuspense: false });\n\n return (\n <pre className={className ?? styles.fallback}>\n {buildFallbackText(value, t('backoffice.jsonViewer.serializationError'))}\n </pre>\n );\n};\n\nexport const LazyBackofficeJsonViewer = (\n props: BackofficeJsonViewerProps,\n): JSX.Element => {\n return (\n <Suspense\n fallback={\n <FallbackViewer value={props.value} className={props.className} />\n }\n >\n <BackofficeJsonViewer {...props} />\n </Suspense>\n );\n};\n\nexport default LazyBackofficeJsonViewer;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n minHeight: 12,\n paddingY: 2,\n paddingX: 3,\n borderWidth: 0,\n borderTopWidth: 'default',\n borderStyle: 'solid',\n borderTopColor: 'borderLight',\n backgroundColor: 'surface',\n});\n\nexport const loaded = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n});\n\nexport const progress = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n flexShrink: 0,\n minWidth: 0,\n});\n\nexport const status = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const meta = sprinkles({\n fontSize: 'sm',\n color: 'textMuted',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Spinner } from '../../atoms/spinner/Spinner.js';\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './backofficeInfiniteListStatus.css.js';\n\nexport type BackofficeInfiniteListStatusProps = {\n loadedCount: number;\n totalCount?: number | null;\n isLoading: boolean;\n hasNextPage: boolean;\n loadingLabel: ReactNode;\n endLabel: ReactNode;\n loadedLabel?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeInfiniteListStatus = ({\n className,\n endLabel,\n hasNextPage,\n isLoading,\n loadedLabel,\n loadingLabel,\n}: BackofficeInfiniteListStatusProps): JSX.Element => {\n let status: ReactNode = null;\n if (!hasNextPage) {\n status = endLabel;\n }\n if (isLoading) {\n status = loadingLabel;\n }\n\n const shouldRenderLoadedLabel = loadedLabel != null;\n const shouldRenderStatus = status != null;\n\n return (\n <div className={cx(styles.container, className)}>\n <div\n className={styles.loaded}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {shouldRenderLoadedLabel && (\n <span className={styles.status}>{loadedLabel}</span>\n )}\n </div>\n <div className={styles.progress} aria-live=\"polite\" aria-atomic=\"true\">\n {isLoading && <Spinner size={16} />}\n {shouldRenderStatus && <span className={styles.meta}>{status}</span>}\n </div>\n </div>\n );\n};\n\nexport default BackofficeInfiniteListStatus;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n paddingY: 3,\n paddingX: 4,\n borderWidth: 0,\n borderTopWidth: 'default',\n borderStyle: 'solid',\n borderTopColor: 'borderLight',\n backgroundColor: 'white',\n});\n\nexport const left = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n});\n\nexport const meta = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const button = style([\n sprinkles({\n alignItems: 'center',\n backgroundColor: 'surface',\n borderColor: 'border',\n borderRadius: 'md',\n borderStyle: 'solid',\n borderWidth: 'default',\n color: 'text',\n cursor: 'pointer',\n display: 'inline-flex',\n fontSize: 'sm',\n fontWeight: 'semibold',\n justifyContent: 'center',\n paddingX: 3,\n paddingY: 1.5,\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n","import { type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Spinner } from '../../atoms/spinner/Spinner.js';\n\nimport * as styles from './backofficeLoadMore.css.js';\n\nexport type BackofficeLoadMoreProps = {\n hasNextPage: boolean;\n isLoading: boolean;\n onLoadMore?: () => void;\n loadMoreLabel?: string;\n endLabel?: string;\n loadingLabel?: string;\n meta?: ReactNode;\n};\n\nexport const BackofficeLoadMore = ({\n hasNextPage,\n isLoading,\n onLoadMore,\n loadMoreLabel,\n endLabel,\n loadingLabel,\n meta,\n}: BackofficeLoadMoreProps): JSX.Element => {\n const { t } = useTranslation('ui');\n const resolvedLoadMoreLabel =\n loadMoreLabel ?? t('backoffice.loadMore.moreAvailable');\n const resolvedEndLabel = endLabel ?? t('backoffice.loadMore.end');\n const resolvedLoadingLabel = loadingLabel ?? t('backoffice.loadMore.loading');\n\n let statusLabel = resolvedEndLabel;\n if (hasNextPage) {\n statusLabel = resolvedLoadMoreLabel;\n }\n if (isLoading) {\n statusLabel = resolvedLoadingLabel;\n }\n\n let spinnerNode: JSX.Element | null = null;\n if (isLoading) {\n spinnerNode = <Spinner size={16} />;\n }\n\n let loadMoreButton: JSX.Element | null = null;\n if (hasNextPage && !isLoading && onLoadMore != null) {\n loadMoreButton = (\n <button type=\"button\" className={styles.button} onClick={onLoadMore}>\n {resolvedLoadMoreLabel}\n </button>\n );\n }\n\n return (\n <div className={styles.container}>\n <div className={styles.left}>\n {spinnerNode}\n <span className={styles.meta}>{statusLabel}</span>\n {meta}\n </div>\n {loadMoreButton}\n </div>\n );\n};\n\nexport default BackofficeLoadMore;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n position: 'relative',\n display: 'inline-flex',\n});\n\nexport const triggerIcon = sprinkles({\n transitionProperty: 'transform',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const triggerIconOpen = sprinkles({\n rotate: 180,\n});\n\nexport const menu = sprinkles({\n position: 'absolute',\n right: 0,\n top: 'full',\n marginTop: 2,\n minWidth: 64,\n backgroundColor: 'surface',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'lg',\n boxShadow: 'md',\n padding: 2,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n zIndex: 20,\n});\n\nexport const menuItem = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'md',\n color: 'text',\n textDecoration: 'none',\n fontSize: 'sm',\n outline: 'none',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceSecondary',\n },\n }),\n {\n selectors: {\n '&:focus-visible': {\n backgroundColor: vars.colors.surfaceSecondary,\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const itemLabel = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n\nexport const count = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n flexShrink: 0,\n});\n","import {\n type JSX,\n type MouseEvent as ReactMouseEvent,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from '@plumile/router';\n\nimport { Button, ChevronDownIcon, cx } from '@plumile/ui';\n\nimport * as styles from './backofficeRelationsMenu.css.js';\n\nexport type BackofficeRelationsMenuItem = {\n id: string;\n label: string;\n count?: number | null;\n href: string;\n onClick?: (event: ReactMouseEvent<HTMLAnchorElement>) => void | Promise<void>;\n};\n\nexport type BackofficeRelationsMenuProps = {\n label?: string;\n items: readonly BackofficeRelationsMenuItem[];\n};\n\nexport const BackofficeRelationsMenu = ({\n label,\n items,\n}: BackofficeRelationsMenuProps): JSX.Element => {\n const { t } = useTranslation('ui');\n const resolvedLabel = label ?? t('backoffice.relationsMenu.label');\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const firstLinkRef = useRef<HTMLAnchorElement | null>(null);\n const menuId = useId();\n\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n window.setTimeout(() => {\n firstLinkRef.current?.focus();\n }, 0);\n\n const handleClick = (event: PointerEvent) => {\n if (!(event.target instanceof Node)) {\n return;\n }\n if (containerRef.current?.contains(event.target)) {\n return;\n }\n setIsOpen(false);\n };\n\n document.addEventListener('pointerdown', handleClick);\n return () => {\n document.removeEventListener('pointerdown', handleClick);\n };\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') {\n return;\n }\n setIsOpen(false);\n triggerRef.current?.focus();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen]);\n\n if (items.length === 0) {\n return (\n <Button type=\"button\" variant=\"secondary\" size=\"small\" disabled>\n {resolvedLabel}\n </Button>\n );\n }\n\n let ariaControls: string | undefined;\n if (isOpen) {\n ariaControls = menuId;\n }\n\n return (\n <div className={styles.container} ref={containerRef}>\n <Button\n ref={triggerRef}\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsOpen((prev) => {\n return !prev;\n });\n }}\n aria-expanded={isOpen}\n aria-controls={ariaControls}\n >\n {resolvedLabel}\n <ChevronDownIcon\n size={14}\n className={cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n })}\n />\n </Button>\n\n {isOpen && (\n <nav className={styles.menu} id={menuId} aria-label={resolvedLabel}>\n {items.map((item, index) => {\n let countValue: number | null = null;\n if (typeof item.count === 'number') {\n countValue = item.count;\n }\n let linkRef: typeof firstLinkRef | undefined;\n if (index === 0) {\n linkRef = firstLinkRef;\n }\n return (\n <Link\n ref={linkRef}\n key={item.id}\n to={item.href}\n className={styles.menuItem}\n onClick={(event: ReactMouseEvent<HTMLAnchorElement>) => {\n setIsOpen(false);\n const result = item.onClick?.(event);\n if (result != null) {\n result.catch(() => {});\n }\n }}\n >\n <span className={styles.itemLabel}>{item.label}</span>\n {countValue != null && (\n <span className={styles.count}>{countValue}</span>\n )}\n </Link>\n );\n })}\n </nav>\n )}\n </div>\n );\n};\n\nexport default BackofficeRelationsMenu;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const containerVariant = {\n framed: sprinkles({\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n }),\n embedded: sprinkles({\n borderRadius: 'md',\n borderWidth: 0,\n borderStyle: 'none',\n borderColor: 'transparent',\n }),\n};\n\nexport const header = sprinkles({\n display: 'grid',\n gridTemplateColumns: 'autoFitMinmax0',\n gap: 2,\n padding: 3,\n backgroundColor: 'surfaceSecondary',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'borderSubtle',\n});\n\nexport const headerCell = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n});\n\nexport const row = sprinkles({\n display: 'grid',\n gridTemplateColumns: 'autoFitMinmax0',\n gap: 2,\n});\n\nexport const cell = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n","import { type JSX } from 'react';\n\nimport { cx } from '@plumile/ui';\nimport { Skeleton } from '../../atoms/skeleton/Skeleton.js';\nimport * as styles from './backofficeTableSkeleton.css.js';\n\nexport type BackofficeTableSkeletonProps = {\n rows?: number;\n columns?: number;\n variant?: 'framed' | 'embedded';\n ariaLabel?: string;\n};\n\nexport const BackofficeTableSkeleton = ({\n rows = 6,\n columns = 4,\n variant = 'framed',\n ariaLabel,\n}: BackofficeTableSkeletonProps): JSX.Element => {\n const headerCells = Array.from({ length: columns }, (_, index) => {\n return (\n <div key={`header-${index}`} className={styles.headerCell}>\n <Skeleton variant=\"text\" width=\"70%\" />\n </div>\n );\n });\n\n const bodyRows = Array.from({ length: rows }, (_, rowIndex) => {\n return (\n <div key={`row-${rowIndex}`} className={styles.row}>\n {Array.from({ length: columns }, (_, colIndex) => {\n return (\n <div key={`cell-${rowIndex}-${colIndex}`} className={styles.cell}>\n <Skeleton variant=\"text\" width=\"80%\" />\n </div>\n );\n })}\n </div>\n );\n });\n\n const visualSkeleton = (\n <div\n className={cx(styles.container, styles.containerVariant[variant])}\n aria-hidden=\"true\"\n >\n <div className={styles.header}>{headerCells}</div>\n <div className={styles.body}>{bodyRows}</div>\n </div>\n );\n\n if (ariaLabel == null) {\n return visualSkeleton;\n }\n\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label={ariaLabel}>\n {visualSkeleton}\n </div>\n );\n};\n\nexport default BackofficeTableSkeleton;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nconst MOBILE_MEDIA_QUERY = 'screen and (max-width: 767px)';\nconst COMPACT_MEDIA_QUERY = 'screen and (max-width: 1199px)';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const topRow = style([\n sprinkles({\n display: 'grid',\n gap: 3,\n alignItems: 'flex-start',\n }),\n {\n gridTemplateColumns: 'minmax(0, 1fr) auto',\n '@media': {\n [COMPACT_MEDIA_QUERY]: {\n gridTemplateColumns: 'minmax(0, 1fr)',\n },\n [MOBILE_MEDIA_QUERY]: {\n alignItems: 'stretch',\n },\n },\n },\n]);\n\nexport const left = style([\n sprinkles({\n display: 'grid',\n alignItems: 'flex-start',\n gap: 2,\n minWidth: 0,\n }),\n {\n gridTemplateColumns: 'minmax(260px, 1fr) auto',\n '@media': {\n [COMPACT_MEDIA_QUERY]: {\n gridTemplateColumns: 'minmax(0, 1fr)',\n },\n [MOBILE_MEDIA_QUERY]: {\n alignItems: 'stretch',\n width: '100%',\n },\n },\n },\n]);\n\nexport const searchSlot = style([\n sprinkles({\n minWidth: 0,\n }),\n {\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n width: '100%',\n },\n },\n },\n]);\n\nexport const filtersGroup = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n minWidth: 0,\n flexShrink: 0,\n }),\n {\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n alignItems: 'stretch',\n flexDirection: 'column',\n width: '100%',\n },\n },\n },\n]);\n\nexport const right = style([\n sprinkles({\n display: 'grid',\n alignItems: 'flex-start',\n gap: 2,\n justifyContent: 'flex-end',\n }),\n {\n gridTemplateColumns: 'auto auto',\n },\n {\n '@media': {\n [COMPACT_MEDIA_QUERY]: {\n gridTemplateColumns: 'minmax(0, 1fr)',\n justifyContent: 'stretch',\n },\n [MOBILE_MEDIA_QUERY]: {\n alignItems: 'stretch',\n width: '100%',\n },\n },\n },\n]);\n\nexport const sortSlot = style([\n sprinkles({\n minWidth: 'full',\n }),\n {\n '@media': {\n 'screen and (min-width: 768px)': {\n minWidth: '140px',\n },\n [MOBILE_MEDIA_QUERY]: {\n width: '100%',\n },\n },\n },\n]);\n\nexport const actionGroup = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n flexWrap: 'wrap',\n }),\n {\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n alignItems: 'stretch',\n flexDirection: 'column',\n width: '100%',\n },\n },\n },\n]);\n\nexport const chipsRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n paddingTop: 2,\n borderTopWidth: 'px',\n borderStyle: 'solid',\n borderTopColor: 'borderSubtle',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeTableToolbar.css.js';\n\nexport type BackofficeTableToolbarProps = {\n searchSlot?: ReactNode;\n promotedFiltersSlot?: ReactNode;\n allFiltersSlot?: ReactNode;\n filtersSlot?: ReactNode;\n sortSlot?: ReactNode;\n refreshSlot?: ReactNode;\n primaryActionSlot?: ReactNode;\n ctaSlot?: ReactNode;\n chipsSlot?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeTableToolbar = ({\n allFiltersSlot,\n searchSlot,\n promotedFiltersSlot,\n filtersSlot,\n sortSlot,\n refreshSlot,\n primaryActionSlot,\n ctaSlot,\n chipsSlot,\n className,\n}: BackofficeTableToolbarProps): JSX.Element | null => {\n let resolvedFiltersSlot = filtersSlot;\n if (\n resolvedFiltersSlot == null &&\n (promotedFiltersSlot != null || allFiltersSlot != null)\n ) {\n resolvedFiltersSlot = (\n <>\n {promotedFiltersSlot}\n {allFiltersSlot}\n </>\n );\n }\n const resolvedActionSlot = primaryActionSlot ?? ctaSlot;\n const showTop =\n searchSlot != null ||\n resolvedFiltersSlot != null ||\n sortSlot != null ||\n refreshSlot != null ||\n resolvedActionSlot != null;\n\n const showChips = chipsSlot != null;\n\n if (!showTop && !showChips) {\n return null;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {showTop && (\n <div className={styles.topRow}>\n <div className={styles.left}>\n {searchSlot != null && (\n <div className={styles.searchSlot}>{searchSlot}</div>\n )}\n {resolvedFiltersSlot != null && (\n <div className={styles.filtersGroup}>{resolvedFiltersSlot}</div>\n )}\n </div>\n {(sortSlot != null ||\n refreshSlot != null ||\n resolvedActionSlot != null) && (\n <div className={styles.right}>\n {sortSlot != null && (\n <div className={styles.sortSlot}>{sortSlot}</div>\n )}\n {(refreshSlot != null || resolvedActionSlot != null) && (\n <div className={styles.actionGroup}>\n {refreshSlot}\n {resolvedActionSlot}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n {showChips && <div className={styles.chipsRow}>{chipsSlot}</div>}\n </div>\n );\n};\n\nexport default BackofficeTableToolbar;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const tabs = sprinkles({\n display: 'inline-flex',\n flexWrap: 'nowrap',\n gap: 1,\n maxWidth: 'full',\n overflowX: 'auto',\n});\n\nexport const tabsVariant = {\n pill: sprinkles({\n padding: 1,\n borderRadius: 'full',\n backgroundColor: 'surfaceMuted',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n }),\n underline: sprinkles({\n gap: 3,\n paddingX: 0,\n paddingY: 0,\n borderWidth: 0,\n borderStyle: 'none',\n backgroundColor: 'transparent',\n }),\n};\n\nconst tabBase = sprinkles({\n display: 'inline-flex',\n flexShrink: 0,\n alignItems: 'center',\n borderWidth: 'default',\n borderStyle: 'solid',\n backgroundColor: 'transparent',\n color: 'textSecondary',\n cursor: 'pointer',\n fontWeight: 'medium',\n});\n\nexport const tabVariant = {\n pill: sprinkles({\n paddingX: 3,\n paddingY: 1.5,\n borderRadius: 'full',\n fontSize: 'sm',\n borderColor: 'transparent',\n }),\n underline: sprinkles({\n paddingX: 0,\n paddingY: 2,\n borderRadius: 'none',\n borderWidth: 0,\n borderBottomWidth: 'default',\n borderColor: 'transparent',\n fontSize: 'sm',\n }),\n};\n\nexport const activeVariant = {\n pill: sprinkles({\n backgroundColor: 'surface',\n borderColor: 'borderSubtle',\n color: 'text',\n boxShadow: 'sm',\n }),\n underline: sprinkles({\n color: 'text',\n borderBottomColor: 'primary',\n }),\n};\n\nexport const tab = style([\n tabBase,\n stateSprinkles({\n color: {\n hover: 'text',\n },\n backgroundColor: {\n hover: 'surface',\n },\n }),\n {\n ':focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: 2,\n },\n },\n]);\n","import { Link } from '@plumile/router';\nimport { type ComponentPropsWithoutRef, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport * as styles from './backofficeTabs.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type BackofficeTabItem = {\n id: string;\n label: ReactNode;\n to?: ComponentPropsWithoutRef<typeof Link>['to'];\n};\n\nexport type BackofficeTabsVariant = 'pill' | 'underline';\n\nexport type BackofficeTabsProps = {\n items: readonly BackofficeTabItem[];\n activeId: string;\n onChange: (id: string) => void;\n variant?: BackofficeTabsVariant;\n ariaLabel?: string;\n className?: string;\n};\n\nexport const BackofficeTabs = ({\n items,\n activeId,\n onChange,\n variant = 'pill',\n ariaLabel,\n className,\n}: BackofficeTabsProps): JSX.Element | null => {\n const { t } = useTranslation('ui', { useSuspense: false });\n if (items.length === 0) {\n return null;\n }\n\n const isRouteNavigation = items.every((tab) => {\n return tab.to != null;\n });\n const resolvedAriaLabel =\n ariaLabel ?? t('backoffice.tabs.label', { defaultValue: 'Tabs' });\n const rootClassName = cx(styles.tabs, styles.tabsVariant[variant], className);\n const content = items.map((tab) => {\n const isActive = tab.id === activeId;\n const tabClassName = cx(styles.tab, styles.tabVariant[variant], {\n [styles.activeVariant[variant]]: isActive,\n });\n if (tab.to != null) {\n let ariaCurrent: 'page' | undefined;\n if (isActive) {\n ariaCurrent = 'page';\n }\n\n return (\n <Link\n key={tab.id}\n to={tab.to}\n className={tabClassName}\n aria-current={ariaCurrent}\n >\n {tab.label}\n </Link>\n );\n }\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n className={tabClassName}\n onClick={() => {\n onChange(tab.id);\n }}\n >\n {tab.label}\n </button>\n );\n });\n\n if (isRouteNavigation) {\n return (\n <nav className={rootClassName} aria-label={resolvedAriaLabel}>\n {content}\n </nav>\n );\n }\n\n return (\n <div\n className={rootClassName}\n role=\"tablist\"\n aria-label={resolvedAriaLabel}\n >\n {content}\n </div>\n );\n};\n\nexport default BackofficeTabs;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const bar = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n paddingX: 4,\n paddingY: 3,\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n});\n\nexport const left = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n fontSize: 'sm',\n});\n\nexport const right = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button, cx } from '@plumile/ui';\n\nimport * as styles from './bulkActionsBar.css.js';\n\nexport type BulkActionsBarProps = {\n selectedCount: number;\n label?: (count: number) => ReactNode;\n actions?: ReactNode;\n onClearSelection?: () => void;\n clearLabel?: string;\n className?: string;\n};\n\nexport const BulkActionsBar = ({\n selectedCount,\n label,\n actions,\n onClearSelection,\n clearLabel,\n className,\n}: BulkActionsBarProps): JSX.Element | null => {\n const { t } = useTranslation('ui', { useSuspense: false });\n if (selectedCount <= 0) {\n return null;\n }\n\n const resolvedLabel =\n label?.(selectedCount) ??\n t('backoffice.bulkActions.selected', {\n count: selectedCount,\n defaultValue_one: '{{count}} selected',\n defaultValue_other: '{{count}} selected',\n });\n const resolvedClearLabel =\n clearLabel ??\n t('backoffice.bulkActions.clear', {\n defaultValue: 'Clear',\n });\n\n let clearButtonNode: JSX.Element | null = null;\n if (onClearSelection != null) {\n clearButtonNode = (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={onClearSelection}\n >\n {resolvedClearLabel}\n </Button>\n );\n }\n\n return (\n <div className={cx(styles.bar, className)} role=\"status\">\n <div className={styles.left}>{resolvedLabel}</div>\n <div className={styles.right}>\n {actions}\n {clearButtonNode}\n </div>\n </div>\n );\n};\n\nexport default BulkActionsBar;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const row = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n paddingBottom: 1,\n overflowX: 'auto',\n }),\n {\n scrollbarWidth: 'thin',\n scrollbarColor: `${vars.colors.border} transparent`,\n },\n]);\n\nexport const chip = sprinkles({\n flexShrink: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button, cx } from '@plumile/ui';\nimport { Tag } from '../../atoms/tag/Tag.js';\n\nimport * as styles from './filterChipRow.css.js';\n\nexport type FilterChip = {\n id: string;\n label: ReactNode;\n onRemove?: () => void;\n};\n\nexport type FilterChipRowProps = {\n chips: readonly FilterChip[];\n onClearAll?: () => void;\n clearAllLabel?: string;\n className?: string;\n};\n\nexport const FilterChipRow = ({\n chips,\n onClearAll,\n clearAllLabel,\n className,\n}: FilterChipRowProps): JSX.Element | null => {\n const { t } = useTranslation('ui');\n\n if (chips.length === 0) {\n return null;\n }\n\n const resolvedClearAllLabel =\n clearAllLabel ?? t('backoffice.filterChips.clearAll');\n\n let clearAllNode: JSX.Element | null = null;\n if (onClearAll != null) {\n clearAllNode = (\n <Button type=\"button\" size=\"small\" variant=\"text\" onClick={onClearAll}>\n {resolvedClearAllLabel}\n </Button>\n );\n }\n\n return (\n <div className={cx(styles.row, className)}>\n {chips.map((chip) => {\n return (\n <Tag\n key={chip.id}\n tone=\"neutral\"\n className={styles.chip}\n onRemove={chip.onRemove}\n removeLabel={t('backoffice.filterChips.remove')}\n >\n {chip.label}\n </Tag>\n );\n })}\n {clearAllNode}\n </div>\n );\n};\n\nexport default FilterChipRow;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n});\n\nexport const input = sprinkles({\n width: 'full',\n});\n\nexport const clearButton = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n borderWidth: 0,\n borderStyle: 'none',\n borderRadius: 'md',\n padding: 0,\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n","import { type ChangeEvent, type JSX, type ReactNode, useId } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Input } from '@plumile/ui';\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\nimport { SidebarSearchSvg } from '../../../icons/SidebarSearchSvg.js';\n\nimport { ShortcutHint } from '../../atoms/shortcut_hint/ShortcutHint.js';\nimport * as styles from './globalSearchInput.css.js';\n\nexport type GlobalSearchInputProps = {\n value: string;\n onChange: (value: string) => void;\n id?: string;\n name?: string;\n placeholder?: string;\n ariaLabel?: string;\n className?: string;\n shortcut?: readonly string[] | string;\n rightSlot?: ReactNode;\n clearLabel?: string;\n};\n\nexport const GlobalSearchInput = ({\n id,\n name,\n value,\n onChange,\n placeholder,\n ariaLabel,\n className,\n shortcut,\n rightSlot,\n clearLabel,\n}: GlobalSearchInputProps): JSX.Element => {\n const { t } = useTranslation('ui');\n const generatedId = useId();\n const showClear = value.trim() !== '';\n const resolvedPlaceholder =\n placeholder ?? t('backoffice.globalSearch.placeholder');\n const resolvedClearLabel = clearLabel ?? t('backoffice.globalSearch.clear');\n const resolvedAriaLabel = ariaLabel ?? resolvedPlaceholder;\n const resolvedId = id ?? generatedId;\n\n let clearButton: JSX.Element | null = null;\n if (showClear) {\n clearButton = (\n <button\n type=\"button\"\n aria-label={resolvedClearLabel}\n onClick={() => {\n onChange('');\n }}\n className={styles.clearButton}\n >\n <ModalCloseSvg width={16} height={16} aria-hidden=\"true\" />\n </button>\n );\n }\n\n let shortcutNode: JSX.Element | null = null;\n if (shortcut != null) {\n shortcutNode = <ShortcutHint keys={shortcut} />;\n }\n\n const rightIcon = (\n <span className={styles.container}>\n {clearButton}\n {shortcutNode}\n {rightSlot}\n </span>\n );\n\n return (\n <Input\n id={resolvedId}\n name={name}\n className={className}\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n onChange(event.target.value);\n }}\n placeholder={resolvedPlaceholder}\n aria-label={resolvedAriaLabel}\n size=\"small\"\n fullWidth\n leftIcon={<SidebarSearchSvg width={18} height={18} aria-hidden=\"true\" />}\n rightIcon={rightIcon}\n rightIconIsInteractive\n />\n );\n};\n\nexport default GlobalSearchInput;\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: 3,\n paddingX: 4,\n paddingY: 3,\n borderRadius: 'md',\n fontSize: 'sm',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n});\n\nconst toneInfo = sprinkles({\n backgroundColor: 'brandLightGray',\n color: 'text',\n});\nconst toneSuccess = sprinkles({\n backgroundColor: 'green-50',\n color: 'green-800',\n});\nconst toneWarning = sprinkles({\n backgroundColor: 'amber-50',\n color: 'amber-900',\n});\nconst toneDanger = sprinkles({\n backgroundColor: 'red-50',\n color: 'red-800',\n});\n\nexport const toneRecipe = recipe({\n variants: {\n tone: {\n info: toneInfo,\n success: toneSuccess,\n warning: toneWarning,\n danger: toneDanger,\n },\n },\n defaultVariants: {\n tone: 'info',\n },\n});\n\nexport type ToneRecipeVariants = RecipeVariants<typeof toneRecipe>;\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n flex: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontWeight: 'semibold',\n});\n\nexport const description = sprinkles({});\n\nexport const actions = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n flexShrink: 0,\n});\n\nexport const closeButton = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n borderWidth: 0,\n borderStyle: 'none',\n color: 'inherit',\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n","import { type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\n\nimport * as styles from './inlineBanner.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type InlineBannerTone = NonNullable<\n NonNullable<RecipeVariants<typeof styles.toneRecipe>>['tone']\n>;\n\nexport type InlineBannerProps = {\n tone?: InlineBannerTone;\n title?: ReactNode;\n children?: ReactNode;\n actions?: ReactNode;\n onDismiss?: () => void;\n dismissLabel?: string;\n className?: string;\n};\n\nexport const InlineBanner = ({\n tone = 'info',\n title,\n children,\n actions,\n onDismiss,\n dismissLabel,\n className,\n}: InlineBannerProps): JSX.Element => {\n const { t } = useTranslation('ui');\n const showDismiss = typeof onDismiss === 'function';\n const resolvedDismissLabel =\n dismissLabel ?? t('backoffice.inlineBanner.dismiss');\n let role: 'alert' | 'status' = 'status';\n if (tone === 'danger') {\n role = 'alert';\n }\n\n let titleNode: JSX.Element | null = null;\n if (title != null) {\n titleNode = <div className={styles.title}>{title}</div>;\n }\n\n let descriptionNode: JSX.Element | null = null;\n if (children != null) {\n descriptionNode = <div className={styles.description}>{children}</div>;\n }\n\n let dismissNode: JSX.Element | null = null;\n if (showDismiss) {\n dismissNode = (\n <button\n type=\"button\"\n onClick={onDismiss}\n className={styles.closeButton}\n aria-label={resolvedDismissLabel}\n >\n <ModalCloseSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n );\n }\n\n return (\n <div\n className={cx(styles.container, styles.toneRecipe({ tone }), className)}\n role={role}\n >\n <div className={styles.content}>\n {titleNode}\n {descriptionNode}\n </div>\n\n <div className={styles.actions}>\n {actions}\n {dismissNode}\n </div>\n </div>\n );\n};\n\nexport default InlineBanner;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst inlineFlex = 'inline-flex';\n\nexport const actions = sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n gap: 1,\n transitionProperty: 'opacity',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n flexShrink: 0,\n opacity: 0,\n visibility: 'hidden',\n pointerEvents: 'none',\n});\n\nexport const actionsVisible = sprinkles({\n opacity: 100,\n visibility: 'visible',\n pointerEvents: 'auto',\n});\n\nexport const item = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n paddingY: 1.5,\n paddingX: 3,\n borderRadius: 'lg',\n fontSize: 'sm',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n cursor: 'pointer',\n color: 'textSecondary',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n color: {\n hover: 'text',\n },\n }),\n {\n selectors: {\n '&:has(:focus-visible)': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const itemCollapsed = sprinkles({\n justifyContent: 'center',\n paddingX: 2,\n});\n\nexport const itemNested = sprinkles({\n paddingX: 2,\n paddingY: 1.5,\n borderRadius: 'md',\n});\n\nexport const itemActive = sprinkles({\n fontWeight: 'semibold',\n backgroundColor: 'primaryLight',\n color: 'text',\n boxShadow: 'primaryLightRing',\n});\n\nexport const itemDisabled = style([\n sprinkles({\n color: 'textMuted',\n cursor: 'not-allowed',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: 'transparent',\n },\n },\n },\n]);\n\nexport const link = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flex: 1,\n minWidth: 0,\n textDecoration: 'none',\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n padding: 0,\n textAlign: 'left',\n color: 'inherit',\n font: 'inherit',\n});\n\nexport const actionSlot = sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n});\n\nexport const dragHandle = style([\n sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n borderRadius: 'md',\n borderWidth: 0,\n borderStyle: 'none',\n padding: 0,\n backgroundColor: 'transparent',\n color: 'textSecondary',\n cursor: 'grab',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n color: {\n hover: 'text',\n },\n }),\n {\n selectors: {\n '&:active': {\n cursor: 'grabbing',\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const icon = sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n flexShrink: 0,\n color: 'inherit',\n});\n\nexport const iconNested = sprinkles({\n width: 5,\n height: 5,\n});\n\nexport const label = sprinkles({\n flex: 1,\n minWidth: 0,\n});\n\nexport const labelCollapsed = sprinkles({\n display: 'none',\n});\n\nexport const badge = sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n});\n\nexport const badgeCollapsed = sprinkles({\n display: 'none',\n});\n","import { Link } from '@plumile/router';\nimport {\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type DragEvent,\n type FocusEvent,\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport * as styles from './sidebarNavItem.css.js';\nimport { cx } from '@plumile/ui';\n\ntype RouterLinkProps = ComponentPropsWithoutRef<typeof Link> &\n AnchorHTMLAttributes<HTMLAnchorElement>;\nconst RouterLink = Link as unknown as (props: RouterLinkProps) => JSX.Element;\n\nexport type SidebarNavItemProps = {\n label: ReactNode;\n href?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n isActive?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n onDragStart?: (event: DragEvent) => void;\n onDragOver?: (event: DragEvent) => void;\n onDrop?: (event: DragEvent) => void;\n onDragEnd?: (event: DragEvent) => void;\n collapsed?: boolean;\n nested?: boolean;\n ariaLabel?: string;\n className?: string;\n actionSlot?: ReactNode;\n dragHandleSlot?: ReactNode;\n dragHandleLabel?: string;\n draggable?: boolean;\n};\n\nexport const SidebarNavItem = ({\n label,\n href,\n icon,\n badge,\n isActive = false,\n disabled = false,\n onClick,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n collapsed = false,\n nested = false,\n ariaLabel,\n className,\n actionSlot,\n dragHandleSlot,\n dragHandleLabel,\n draggable = false,\n}: SidebarNavItemProps): JSX.Element => {\n const itemRef = useRef<HTMLDivElement | null>(null);\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [isHoverIntent, setIsHoverIntent] = useState(false);\n const [isFocusWithin, setIsFocusWithin] = useState(false);\n\n const itemClassNames: (string | null | undefined)[] = [styles.item];\n if (collapsed) {\n itemClassNames.push(styles.itemCollapsed);\n }\n if (nested && !collapsed) {\n itemClassNames.push(styles.itemNested);\n }\n if (isActive) {\n itemClassNames.push(styles.itemActive);\n }\n if (disabled) {\n itemClassNames.push(styles.itemDisabled);\n }\n if (className != null) {\n itemClassNames.push(className);\n }\n const itemClassName = cx(...itemClassNames);\n\n let resolvedAriaLabel: string | undefined = ariaLabel;\n if (resolvedAriaLabel == null && typeof label === 'string') {\n resolvedAriaLabel = label;\n }\n\n let collapsedAriaLabel: string | undefined;\n let collapsedTitle: string | undefined;\n if (collapsed) {\n collapsedAriaLabel = resolvedAriaLabel;\n collapsedTitle = resolvedAriaLabel;\n }\n\n let ariaCurrent: 'page' | undefined;\n if (isActive) {\n ariaCurrent = 'page';\n }\n\n let iconNode: JSX.Element | null = null;\n if (icon != null) {\n iconNode = (\n <span\n className={cx(styles.icon, {\n [styles.iconNested]: nested && !collapsed,\n })}\n >\n {icon}\n </span>\n );\n }\n\n let labelExtraClass: string | null = null;\n if (collapsed) {\n labelExtraClass = styles.labelCollapsed;\n }\n const labelClassName = cx(styles.label, labelExtraClass);\n\n let badgeNode: JSX.Element | null = null;\n if (badge != null) {\n let badgeExtraClass: string | null = null;\n if (collapsed) {\n badgeExtraClass = styles.badgeCollapsed;\n }\n badgeNode = (\n <span className={cx(styles.badge, badgeExtraClass)}>{badge}</span>\n );\n }\n\n const content = (\n <>\n {iconNode}\n <span className={labelClassName}>{label}</span>\n {badgeNode}\n </>\n );\n\n const handleClick = (): void => {\n if (onClick != null) {\n onClick();\n }\n };\n\n const shouldRenderActions =\n !collapsed && !disabled && (actionSlot != null || dragHandleSlot != null);\n\n const clearHoverTimeout = useCallback((): void => {\n if (hoverTimeoutRef.current != null) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n if (!shouldRenderActions) {\n setIsHoverIntent(false);\n setIsFocusWithin(false);\n clearHoverTimeout();\n }\n\n return () => {\n clearHoverTimeout();\n };\n }, [clearHoverTimeout, shouldRenderActions]);\n\n const handleMouseEnter = (): void => {\n if (!shouldRenderActions) {\n return;\n }\n clearHoverTimeout();\n hoverTimeoutRef.current = setTimeout(() => {\n setIsHoverIntent(true);\n }, 150);\n };\n\n const handleMouseLeave = (): void => {\n clearHoverTimeout();\n setIsHoverIntent(false);\n };\n\n const handleFocusCapture = (): void => {\n if (!shouldRenderActions) {\n return;\n }\n setIsFocusWithin(true);\n };\n\n const handleBlurCapture = (event: FocusEvent<HTMLDivElement>): void => {\n if (!shouldRenderActions) {\n setIsFocusWithin(false);\n return;\n }\n const nextTarget = event.relatedTarget as Node | null;\n if (nextTarget != null && itemRef.current?.contains(nextTarget)) {\n return;\n }\n setIsFocusWithin(false);\n };\n\n let mainNode: JSX.Element;\n if (disabled) {\n mainNode = (\n <span\n className={styles.link}\n aria-disabled=\"true\"\n aria-label={collapsedAriaLabel}\n title={collapsedTitle}\n >\n {content}\n </span>\n );\n } else if (href != null) {\n mainNode = (\n <RouterLink\n to={href}\n className={styles.link}\n aria-current={ariaCurrent}\n aria-label={collapsedAriaLabel}\n title={collapsedTitle}\n onClick={handleClick}\n >\n {content}\n </RouterLink>\n );\n } else {\n mainNode = (\n <button\n type=\"button\"\n className={styles.link}\n onClick={handleClick}\n aria-current={ariaCurrent}\n aria-label={collapsedAriaLabel}\n title={collapsedTitle}\n >\n {content}\n </button>\n );\n }\n\n const isActionsVisible =\n shouldRenderActions && (isHoverIntent || isFocusWithin);\n let actionsVisibilityClass: string | undefined;\n if (isActionsVisible) {\n actionsVisibilityClass = styles.actionsVisible;\n }\n const actionsClassName = cx(styles.actions, actionsVisibilityClass);\n\n let dragHandleNode: JSX.Element | null = null;\n if (dragHandleSlot != null && !collapsed) {\n dragHandleNode = (\n <button\n type=\"button\"\n className={styles.dragHandle}\n draggable={draggable}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n aria-label={dragHandleLabel}\n title={dragHandleLabel}\n >\n {dragHandleSlot}\n </button>\n );\n }\n\n let actionNode: JSX.Element | null = null;\n if (actionSlot != null && !collapsed) {\n actionNode = <span className={styles.actionSlot}>{actionSlot}</span>;\n }\n\n let actionsNode: JSX.Element | null = null;\n if (shouldRenderActions) {\n actionsNode = (\n <span className={actionsClassName}>\n {dragHandleNode}\n {actionNode}\n </span>\n );\n }\n\n return (\n <div\n className={itemClassName}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocusCapture={handleFocusCapture}\n onBlurCapture={handleBlurCapture}\n ref={itemRef}\n role=\"listitem\"\n >\n {mainNode}\n {actionsNode}\n </div>\n );\n};\n\nexport default SidebarNavItem;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const section = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingX: 2,\n paddingY: 0.5,\n minHeight: 8,\n});\n\nexport const headerSidebarCollapsed = sprinkles({\n justifyContent: 'center',\n paddingX: 0,\n});\n\nexport const headerButton = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n width: 'full',\n paddingX: 2,\n paddingY: 0.5,\n minHeight: 8,\n borderRadius: 'md',\n borderWidth: 0,\n borderStyle: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n textAlign: 'left',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const headerButtonSidebarCollapsed = sprinkles({\n justifyContent: 'center',\n paddingX: 0,\n});\n\nexport const title = sprinkles({\n fontSize: '2xs',\n fontWeight: 'semibold',\n textTransform: 'uppercase',\n color: 'textMuted',\n letterSpacing: 'wide',\n});\n\nexport const titleContent = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n minWidth: 0,\n gap: 2,\n});\n\nexport const titleIcon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 4,\n height: 4,\n flexShrink: 0,\n color: 'textMuted',\n});\n\nexport const titleSidebarCollapsed = sprinkles({\n display: 'none',\n});\n\nexport const toggleIcon = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 5,\n height: 5,\n borderRadius: 'sm',\n color: 'textMuted',\n }),\n {\n transition: 'transform 120ms ease',\n },\n]);\n\nexport const toggleIconCollapsed = style({\n transform: 'rotate(-90deg)',\n});\n\nexport const items = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n});\n\nexport const itemsNested = style([\n sprinkles({\n marginLeft: 4,\n paddingLeft: 2,\n borderLeftWidth: 'default',\n borderLeftColor: 'border',\n }),\n {\n borderLeftStyle: 'solid',\n },\n]);\n","import { type JSX, type ReactNode, useCallback, useId, useState } from 'react';\n\nimport { ChevronDownSvg } from '../../../icons/ChevronDownSvg.js';\n\nimport {\n SidebarNavItem,\n type SidebarNavItemProps,\n} from '../sidebar_nav_item/SidebarNavItem.js';\nimport * as styles from './sidebarNavSection.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type SidebarNavSectionItemData = {\n kind: 'dashboard' | 'entity' | 'tool' | 'hub';\n id: string;\n groupId?: string;\n};\n\nexport type SidebarNavSectionItem = SidebarNavItemProps & {\n id: string;\n data?: SidebarNavSectionItemData;\n};\n\nexport type SidebarNavSectionProps = {\n title?: ReactNode;\n icon?: ReactNode;\n items: readonly SidebarNavSectionItem[];\n collapsible?: boolean;\n isCollapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n collapsed?: boolean;\n className?: string;\n};\n\nexport const SidebarNavSection = ({\n title,\n icon,\n items,\n collapsible = false,\n isCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapsed: sidebarCollapsed = false,\n className,\n}: SidebarNavSectionProps): JSX.Element => {\n const [uncontrolledCollapsed, setUncontrolledCollapsed] =\n useState(defaultCollapsed);\n const itemsId = useId();\n const titleId = useId();\n\n const collapsed = isCollapsed ?? uncontrolledCollapsed;\n\n const canCollapse = collapsible;\n\n const handleToggle = useCallback(() => {\n if (!canCollapse) {\n return;\n }\n const next = !collapsed;\n if (isCollapsed == null) {\n setUncontrolledCollapsed(next);\n }\n onCollapsedChange?.(next);\n }, [canCollapse, collapsed, isCollapsed, onCollapsedChange]);\n\n let resolvedTitle: string | undefined;\n if (typeof title === 'string') {\n resolvedTitle = title;\n }\n\n const titleClassName = cx(styles.title, {\n [styles.titleSidebarCollapsed]: sidebarCollapsed,\n });\n const toggleIconClassName = cx(styles.toggleIcon, {\n [styles.toggleIconCollapsed]: collapsed,\n });\n let sidebarCollapsedTitle: string | undefined;\n if (sidebarCollapsed) {\n sidebarCollapsedTitle = resolvedTitle;\n }\n let iconNode: JSX.Element | null = null;\n if (icon != null) {\n iconNode = (\n <span className={styles.titleIcon} aria-hidden=\"true\">\n {icon}\n </span>\n );\n }\n\n let headerNode: JSX.Element | null = null;\n if (title != null) {\n if (canCollapse) {\n headerNode = (\n <button\n id={titleId}\n type=\"button\"\n className={cx(styles.headerButton, {\n [styles.headerButtonSidebarCollapsed]: sidebarCollapsed,\n })}\n onClick={handleToggle}\n aria-expanded={!collapsed}\n aria-controls={itemsId}\n aria-label={sidebarCollapsedTitle}\n title={sidebarCollapsedTitle}\n >\n <span className={styles.titleContent}>\n {iconNode}\n <span className={titleClassName}>{title}</span>\n </span>\n {!sidebarCollapsed && (\n <span className={toggleIconClassName} aria-hidden=\"true\">\n <ChevronDownSvg width={18} height={18} />\n </span>\n )}\n </button>\n );\n } else {\n headerNode = (\n <div\n className={cx(styles.header, {\n [styles.headerSidebarCollapsed]: sidebarCollapsed,\n })}\n title={sidebarCollapsedTitle}\n >\n <div className={styles.titleContent} id={titleId}>\n {iconNode}\n <span className={titleClassName}>{title}</span>\n </div>\n </div>\n );\n }\n }\n\n let itemsNode: JSX.Element | null = null;\n if (!collapsed) {\n const isNested = title != null && !sidebarCollapsed;\n itemsNode = (\n <div\n className={cx(styles.items, {\n [styles.itemsNested]: isNested,\n })}\n id={itemsId}\n role=\"list\"\n >\n {items.map((item) => {\n const { id, data, ...rest } = item;\n return (\n <SidebarNavItem\n key={id}\n {...rest}\n collapsed={sidebarCollapsed}\n nested={isNested}\n />\n );\n })}\n </div>\n );\n }\n\n let ariaLabelledBy: string | undefined;\n if (title != null) {\n ariaLabelledBy = titleId;\n }\n\n return (\n <section\n className={cx(styles.section, className)}\n aria-labelledby={ariaLabelledBy}\n >\n {headerNode}\n {itemsNode}\n </section>\n );\n};\n\nexport default SidebarNavSection;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ProfileDropdownLogoutSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M9 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 20V4C3 3.46957 3.21071 2.96086 3.58579 2.58579C3.96086 2.21071 4.46957 2 5 2H9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 17L21 12L16 7\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M21 12H9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const title = sprinkles({\n fontSize: 'xs',\n fontWeight: 'semibold',\n color: 'textSecondary',\n paddingX: 1,\n});\n\nexport const hidden = sprinkles({\n display: 'none',\n});\n\nexport const trigger = recipe({\n base: [\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n width: 'full',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'lg',\n backgroundColor: 'surfaceSecondary',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n cursor: 'pointer',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceElevated,\n borderColor: vars.colors.borderStrong,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n ],\n variants: {\n collapsed: {\n true: sprinkles({\n justifyContent: 'center',\n padding: 2,\n }),\n false: sprinkles({\n justifyContent: 'space-between',\n gap: 2,\n paddingY: 2,\n paddingX: 3,\n }),\n },\n },\n defaultVariants: {\n collapsed: false,\n },\n});\n\nexport const triggerMain = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n flex: 1,\n});\n\nexport const avatar = sprinkles({\n width: 8,\n height: 8,\n minWidth: 8,\n minHeight: 8,\n borderRadius: 'full',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 'xs',\n fontWeight: 'semibold',\n color: 'brandWhite',\n backgroundImage: 'brandDiagonal',\n textTransform: 'uppercase',\n});\n\nexport const identity = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n});\n\nexport const displayName = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'text',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nexport const email = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nexport const chevron = sprinkles({\n color: 'textSecondary',\n transitionProperty: 'transform',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n});\n\nexport const chevronOpen = sprinkles({\n rotate: 180,\n});\n\nexport const menu = sprinkles({\n minWidth: 56,\n padding: 2,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const menuIdentity = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n paddingX: 3,\n paddingY: 2,\n borderBottomWidth: 'px',\n borderBottomColor: 'borderSubtle',\n marginBottom: 1,\n }),\n {\n borderBottomStyle: 'solid',\n },\n]);\n\nexport const menuDisplayName = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'text',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nexport const menuEmail = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nexport const menuItem = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n width: 'full',\n borderWidth: 0,\n borderStyle: 'none',\n borderRadius: 'md',\n backgroundColor: 'transparent',\n color: 'text',\n fontSize: 'sm',\n fontWeight: 'medium',\n textAlign: 'left',\n cursor: 'pointer',\n paddingY: 2,\n paddingX: 3,\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: vars.colors.surfaceSecondary,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n opacity: 0.6,\n cursor: 'not-allowed',\n },\n },\n },\n]);\n\nexport const menuIcon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n color: 'textSecondary',\n});\n","import { type JSX } from 'react';\n\nimport { Dropdown } from '../../../atomic/molecules/dropdown/Dropdown.js';\nimport { ChevronDownSvg } from '../../../icons/ChevronDownSvg.js';\nimport { ProfileDropdownLogoutSvg } from '../../../icons/ProfileDropdownLogoutSvg.js';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './sidebarProfileMenu.css.js';\n\nexport type BackofficeSidebarProfileViewer = {\n displayName: string;\n email: string;\n initials: string;\n ariaLabel: string;\n};\n\nexport type BackofficeSidebarProfileMenuLabels = {\n sectionTitle: string;\n menuAriaLabel: string;\n signOut: string;\n};\n\nexport type BackofficeSidebarProfileMenuProps = {\n viewer: BackofficeSidebarProfileViewer;\n collapsed: boolean;\n labels: BackofficeSidebarProfileMenuLabels;\n onSignOut: () => void;\n isSigningOut?: boolean;\n className?: string;\n};\n\nexport const BackofficeSidebarProfileMenu = ({\n viewer,\n collapsed,\n labels,\n onSignOut,\n isSigningOut = false,\n className,\n}: BackofficeSidebarProfileMenuProps): JSX.Element => {\n let titleClassName = styles.title;\n if (collapsed) {\n titleClassName = styles.hidden;\n }\n const triggerAriaLabel = `${labels.menuAriaLabel}: ${viewer.displayName}`;\n let triggerTitle: string | undefined;\n if (collapsed) {\n triggerTitle = triggerAriaLabel;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <div className={titleClassName}>{labels.sectionTitle}</div>\n <Dropdown\n trigger={(isOpen: boolean) => {\n return (\n <button\n type=\"button\"\n className={styles.trigger({ collapsed })}\n aria-label={triggerAriaLabel}\n title={triggerTitle}\n >\n <span className={styles.triggerMain}>\n <span className={styles.avatar}>{viewer.initials}</span>\n {!collapsed && (\n <span className={styles.identity}>\n <span className={styles.displayName}>\n {viewer.displayName}\n </span>\n <span className={styles.email}>{viewer.email}</span>\n </span>\n )}\n </span>\n {!collapsed && (\n <ChevronDownSvg\n width={16}\n height={16}\n className={cx(styles.chevron, {\n [styles.chevronOpen]: isOpen,\n })}\n />\n )}\n </button>\n );\n }}\n ariaLabel={triggerAriaLabel}\n contentRole=\"dialog\"\n contentAriaLabel={triggerAriaLabel}\n placement=\"top-start\"\n closeOnItemClick\n matchTriggerWidth={false}\n >\n <div className={styles.menu}>\n <div className={styles.menuIdentity}>\n <span className={styles.menuDisplayName}>{viewer.displayName}</span>\n <span className={styles.menuEmail}>{viewer.email}</span>\n </div>\n <button\n type=\"button\"\n className={styles.menuItem}\n onClick={onSignOut}\n disabled={isSigningOut}\n >\n <span className={styles.menuIcon}>\n <ProfileDropdownLogoutSvg width={16} height={16} />\n </span>\n {labels.signOut}\n </button>\n </div>\n </Dropdown>\n </div>\n );\n};\n\nexport default BackofficeSidebarProfileMenu;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const button = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n paddingX: 3,\n paddingY: 2,\n borderRadius: 'md',\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n cursor: 'pointer',\n fontSize: 'sm',\n color: 'textSecondary',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n color: {\n hover: 'text',\n },\n }),\n {\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const buttonCollapsed = sprinkles({\n justifyContent: 'center',\n paddingX: 2,\n});\n\nexport const icon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n});\n\nexport const label = sprinkles({ flex: 1 });\n\nexport const labelCollapsed = sprinkles({\n display: 'none',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { ChevronLeftSvg } from '../../../icons/ChevronLeftSvg.js';\nimport { ChevronRightSvg } from '../../../icons/ChevronRightSvg.js';\n\nimport { ShortcutHint } from '../../atoms/shortcut_hint/ShortcutHint.js';\nimport * as styles from './sidebarCollapseToggle.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type SidebarCollapseToggleProps = {\n isCollapsed: boolean;\n onToggle: () => void;\n label?: ReactNode;\n expandLabel?: ReactNode;\n shortcut?: readonly string[] | string;\n className?: string;\n};\n\nexport const SidebarCollapseToggle = ({\n isCollapsed,\n onToggle,\n label,\n expandLabel,\n shortcut,\n className,\n}: SidebarCollapseToggleProps): JSX.Element => {\n const { t } = useTranslation('ui', { useSuspense: false });\n let Icon = ChevronLeftSvg;\n const collapseLabel =\n label ??\n t('navigation.sidebar.actions.collapse', {\n defaultValue: 'Collapse',\n });\n const resolvedExpandLabel =\n expandLabel ??\n t('navigation.sidebar.actions.expand', {\n defaultValue: 'Expand',\n });\n let resolvedLabel = collapseLabel;\n if (isCollapsed) {\n Icon = ChevronRightSvg;\n resolvedLabel = resolvedExpandLabel;\n }\n\n let shortcutNode: JSX.Element | null = null;\n if (shortcut != null) {\n shortcutNode = <ShortcutHint keys={shortcut} />;\n }\n\n let title: string | undefined;\n if (typeof resolvedLabel === 'string') {\n title = resolvedLabel;\n }\n\n return (\n <button\n type=\"button\"\n className={cx(\n styles.button,\n { [styles.buttonCollapsed]: isCollapsed },\n className,\n )}\n onClick={onToggle}\n aria-label={title}\n aria-pressed={isCollapsed}\n title={title}\n >\n <span className={styles.icon} aria-hidden=\"true\">\n <Icon width={18} height={18} />\n </span>\n <span\n className={cx(styles.label, {\n [styles.labelCollapsed]: isCollapsed,\n })}\n >\n {resolvedLabel}\n </span>\n {shortcutNode}\n </button>\n );\n};\n\nexport default SidebarCollapseToggle;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'border',\n paddingBottom: 3,\n marginBottom: 3,\n});\n\nexport const topRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n flexWrap: 'wrap',\n});\n\nexport const left = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flex: 1,\n minWidth: 0,\n});\n\nexport const right = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n justifyContent: 'flex-end',\n flexShrink: 0,\n});\n\nexport const bottomRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n flexWrap: 'wrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './tableToolbar.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type TableToolbarProps = {\n search?: ReactNode;\n filters?: ReactNode;\n leftActions?: ReactNode;\n rightActions?: ReactNode;\n bottomLeft?: ReactNode;\n bottomRight?: ReactNode;\n className?: string;\n};\n\nexport const TableToolbar = ({\n search,\n filters,\n leftActions,\n rightActions,\n bottomLeft,\n bottomRight,\n className,\n}: TableToolbarProps): JSX.Element | null => {\n const showTop =\n search != null ||\n filters != null ||\n leftActions != null ||\n rightActions != null;\n const showBottom = bottomLeft != null || bottomRight != null;\n\n if (!showTop && !showBottom) {\n return null;\n }\n\n let topNode: JSX.Element | null = null;\n if (showTop) {\n topNode = (\n <div className={styles.topRow}>\n <div className={styles.left}>\n {search}\n {filters}\n {leftActions}\n </div>\n <div className={styles.right}>{rightActions}</div>\n </div>\n );\n }\n\n let bottomNode: JSX.Element | null = null;\n if (showBottom) {\n bottomNode = (\n <div className={styles.bottomRow}>\n <div className={styles.left}>{bottomLeft}</div>\n <div className={styles.right}>{bottomRight}</div>\n </div>\n );\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {topNode}\n {bottomNode}\n </div>\n );\n};\n\nexport default TableToolbar;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const list = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const item = sprinkles({\n display: 'flex',\n gap: 3,\n});\n\nexport const gutter = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 1,\n flexShrink: 0,\n});\n\nexport const dot = sprinkles({\n width: 2,\n height: 2,\n borderRadius: 'full',\n marginTop: 1,\n});\n\nexport const line = sprinkles({\n width: 2,\n flex: 1,\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n paddingBottom: 2,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'baseline',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const title = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n});\n\nexport const time = sprinkles({\n fontSize: 'xs',\n});\n\nexport const description = sprinkles({\n fontSize: 'sm',\n});\n\nexport const meta = sprinkles({\n fontSize: 'xs',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './auditTimeline.css.js';\n\nexport type AuditTimelineEvent<T = unknown> = {\n id: string;\n title: ReactNode;\n time?: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n raw?: T;\n};\n\nexport type AuditTimelineProps<T = unknown> = {\n events: readonly AuditTimelineEvent<T>[];\n className?: string;\n renderEvent?: (event: AuditTimelineEvent<T>) => ReactNode;\n};\n\nexport const AuditTimeline = <T,>({\n events,\n className,\n renderEvent,\n}: AuditTimelineProps<T>): JSX.Element | null => {\n if (events.length === 0) {\n return null;\n }\n\n return (\n <ol className={cx(styles.list, className)}>\n {events.map((event, index) => {\n const isLast = index === events.length - 1;\n const custom = renderEvent?.(event);\n if (custom != null) {\n return <li key={event.id}>{custom}</li>;\n }\n\n let lineNode: JSX.Element | null = null;\n if (!isLast) {\n lineNode = <div className={styles.line} />;\n }\n\n let timeNode: JSX.Element | null = null;\n if (event.time != null) {\n timeNode = <div className={styles.time}>{event.time}</div>;\n }\n\n let descriptionNode: JSX.Element | null = null;\n if (event.description != null) {\n descriptionNode = (\n <div className={styles.description}>{event.description}</div>\n );\n }\n\n let metaNode: JSX.Element | null = null;\n if (event.meta != null) {\n metaNode = <div className={styles.meta}>{event.meta}</div>;\n }\n\n return (\n <li key={event.id} className={styles.item}>\n <div className={styles.gutter} aria-hidden=\"true\">\n <div className={styles.dot} />\n {lineNode}\n </div>\n <div className={styles.body}>\n <div className={styles.header}>\n <div className={styles.title}>{event.title}</div>\n {timeNode}\n </div>\n {descriptionNode}\n {metaNode}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default AuditTimeline;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const wrapper = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const selectionCell = sprinkles({\n justifyContent: 'center',\n});\n","import { useCallback, useMemo, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Checkbox, cx } from '@plumile/ui';\nimport {\n DataTable,\n type DataTableColumn,\n type GetRowId,\n} from '../../../components/data-table/DataTable.js';\n\nimport { BulkActionsBar } from '../../molecules/bulk_actions_bar/BulkActionsBar.js';\nimport {\n TableToolbar,\n type TableToolbarProps,\n} from '../../molecules/table_toolbar/TableToolbar.js';\n\nimport * as styles from './backofficeDataTable.css.js';\n\nexport type BackofficeDataTableSelection<Row> = {\n selectedRowIds: ReadonlySet<string>;\n onSelectionChange: (next: ReadonlySet<string>) => void;\n isRowSelectable?: (row: Row, index: number) => boolean;\n};\n\nexport type BackofficeDataTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n toolbar?: TableToolbarProps;\n selection?: BackofficeDataTableSelection<Row>;\n bulkActions?: ReactNode;\n emptyState?: JSX.Element;\n className?: string;\n selectAllLabel?: string;\n selectRowLabel?: (row: Row, index: number) => string;\n ariaLabel?: string;\n};\n\ntype WrappedRow<Row> = {\n row: Row;\n index: number;\n id: string;\n selectable: boolean;\n};\n\nconst resolveColumnTemplate = <Row,>(\n column: DataTableColumn<Row>,\n index: number,\n): string => {\n if (column.mobileRole === 'action') {\n return '3.75rem';\n }\n if (column.isPrimary === true || index === 0) {\n return 'minmax(16rem, 1fr)';\n }\n if (column.align === 'right' || column.align === 'center') {\n return 'minmax(5.5rem, 7rem)';\n }\n return 'minmax(10rem, 0.75fr)';\n};\n\nconst buildGridTemplateColumns = <Row,>(\n columns: readonly DataTableColumn<Row>[],\n hasSelection: boolean,\n): string | undefined => {\n if (columns.length === 0) {\n return undefined;\n }\n const template = columns\n .map((column, index) => {\n return resolveColumnTemplate(column, index);\n })\n .join(' ');\n if (!hasSelection) {\n return template;\n }\n return `2.75rem ${template}`;\n};\n\nconst buildSelectionColumn = <Row,>(options: {\n rows: readonly WrappedRow<Row>[];\n selection: BackofficeDataTableSelection<Row>;\n selectAllLabel: string;\n selectRowLabel: (row: Row, index: number) => string;\n}): DataTableColumn<WrappedRow<Row>> => {\n const { rows, selection, selectAllLabel, selectRowLabel } = options;\n\n const selectableRowIds: string[] = [];\n for (const wrapped of rows) {\n if (wrapped.selectable) {\n selectableRowIds.push(wrapped.id);\n }\n }\n\n const selectedCount = selectableRowIds.filter((id) => {\n return selection.selectedRowIds.has(id);\n }).length;\n\n const isAllSelected =\n selectableRowIds.length > 0 && selectedCount === selectableRowIds.length;\n const isPartiallySelected = selectedCount > 0 && !isAllSelected;\n let selectAllAriaChecked: boolean | 'mixed' = isAllSelected;\n if (isPartiallySelected) {\n selectAllAriaChecked = 'mixed';\n }\n\n const toggleAll = (): void => {\n if (selectableRowIds.length === 0) {\n return;\n }\n if (isAllSelected) {\n selection.onSelectionChange(new Set());\n return;\n }\n selection.onSelectionChange(new Set(selectableRowIds));\n };\n\n return {\n id: '__select',\n header: (\n <div className={styles.selectionCell}>\n <Checkbox\n checked={isAllSelected}\n disabled={selectableRowIds.length === 0}\n indeterminate={isPartiallySelected}\n onChange={() => {\n toggleAll();\n }}\n aria-checked={selectAllAriaChecked}\n aria-label={selectAllLabel}\n />\n </div>\n ),\n cell: (wrapped) => {\n const { id: rowId, selectable } = wrapped;\n const checked = selection.selectedRowIds.has(rowId);\n const rowLabel = selectRowLabel(wrapped.row, wrapped.index);\n\n return (\n <div className={styles.selectionCell}>\n <Checkbox\n checked={checked}\n disabled={!selectable}\n onChange={() => {\n const next = new Set(selection.selectedRowIds);\n if (next.has(rowId)) {\n next.delete(rowId);\n } else if (selectable) {\n next.add(rowId);\n }\n selection.onSelectionChange(next);\n }}\n aria-label={rowLabel}\n />\n </div>\n );\n },\n className: styles.selectionCell,\n };\n};\n\nexport const BackofficeDataTable = <Row,>({\n columns,\n rows,\n getRowId,\n toolbar,\n selection,\n bulkActions,\n emptyState,\n className,\n selectAllLabel,\n selectRowLabel,\n ariaLabel,\n}: BackofficeDataTableProps<Row>): JSX.Element => {\n const { t } = useTranslation('ui');\n const wrappedRows = useMemo<readonly WrappedRow<Row>[]>(() => {\n return rows.map((row, index) => {\n const id = getRowId(row, index);\n const selectable = selection?.isRowSelectable?.(row, index) ?? true;\n return { row, index, id, selectable };\n });\n }, [getRowId, rows, selection]);\n\n const selectionColumn = useMemo(() => {\n if (selection == null) {\n return null;\n }\n return buildSelectionColumn({\n rows: wrappedRows,\n selection,\n selectAllLabel: selectAllLabel ?? t('backoffice.dataTable.selectAll'),\n selectRowLabel:\n selectRowLabel ??\n ((_row, index) => {\n return t('backoffice.dataTable.selectRow', {\n index: index + 1,\n });\n }),\n });\n }, [selectAllLabel, selectRowLabel, selection, t, wrappedRows]);\n\n const resolvedColumns = useMemo(() => {\n const mapped = columns.map<DataTableColumn<WrappedRow<Row>>>((column) => {\n return {\n ...column,\n cell: (wrapped: WrappedRow<Row>) => {\n return column.cell(wrapped.row);\n },\n };\n });\n if (selectionColumn == null) {\n return mapped;\n }\n return [selectionColumn, ...mapped];\n }, [columns, selectionColumn]);\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = resolvedColumns.some((column) => {\n return column.isPrimary === true;\n });\n if (hasPrimary) {\n return resolvedColumns;\n }\n if (resolvedColumns.length === 0) {\n return resolvedColumns;\n }\n let primaryIndex = 0;\n if (selectionColumn != null && resolvedColumns.length > 1) {\n primaryIndex = 1;\n }\n return resolvedColumns.map((column, index) => {\n if (index === primaryIndex) {\n return { ...column, isPrimary: true };\n }\n return column;\n });\n }, [resolvedColumns, selectionColumn]);\n\n const gridTemplateColumns = useMemo(() => {\n return buildGridTemplateColumns(\n columnsWithPrimary,\n selectionColumn != null,\n );\n }, [columnsWithPrimary, selectionColumn]);\n\n let selectedCount = 0;\n if (selection != null) {\n selectedCount = selection.selectedRowIds.size;\n }\n\n const handleClearSelection = useCallback(() => {\n if (selection != null) {\n selection.onSelectionChange(new Set());\n }\n }, [selection]);\n\n let toolbarNode: JSX.Element | null = null;\n if (toolbar != null) {\n toolbarNode = <TableToolbar {...toolbar} />;\n }\n\n let bulkActionsNode: JSX.Element | null = null;\n if (selection != null) {\n bulkActionsNode = (\n <BulkActionsBar\n selectedCount={selectedCount}\n actions={bulkActions}\n onClearSelection={handleClearSelection}\n />\n );\n }\n\n return (\n <div className={cx(styles.wrapper, className)}>\n {toolbarNode}\n {bulkActionsNode}\n\n <DataTable\n ariaLabel={ariaLabel ?? t('backoffice.dataTable.label')}\n columns={columnsWithPrimary}\n rows={wrappedRows}\n getRowId={(wrapped: WrappedRow<Row>) => {\n return wrapped.id;\n }}\n emptyState={emptyState}\n className={undefined}\n headerClassName={undefined}\n bodyClassName={undefined}\n rowClassName={undefined}\n gridTemplateClassName={undefined}\n gridTemplateColumns={gridTemplateColumns}\n />\n </div>\n );\n};\n\nexport default BackofficeDataTable;\n","import type {\n InfiniteScrollConfig,\n VirtualizationConfig,\n} from '../../../components/data-table/VirtualizedConnectionTable.js';\nimport type {\n BackofficeInfiniteScrollConfig,\n BackofficeVirtualizationConfig,\n} from './BackofficeVirtualizedConnectionTable.js';\n\nexport const mapVirtualization = (\n config?: BackofficeVirtualizationConfig,\n): VirtualizationConfig | undefined => {\n if (config == null) {\n return undefined;\n }\n return {\n enabled: config.enabled,\n rowHeightPx: config.rowHeightPx,\n overscan: config.overscan,\n };\n};\n\nexport const mapInfiniteScroll = (\n config?: BackofficeInfiniteScrollConfig,\n): InfiniteScrollConfig | undefined => {\n if (config == null) {\n return undefined;\n }\n return {\n enabled: config.enabled,\n thresholdPx: config.thresholdPx,\n autoLoad: config.autoLoad,\n };\n};\n","import { type JSX } from 'react';\nimport { VirtualizedConnectionTable } from '../../../components/data-table/VirtualizedConnectionTable.js';\nimport type {\n DataTableColumn,\n GetRowId,\n} from '../../../components/data-table/DataTable.js';\nimport { mapInfiniteScroll, mapVirtualization } from './helpers.js';\n\nexport type BackofficeVirtualizationConfig = {\n enabled: boolean;\n rowHeightPx: number;\n overscan: number;\n};\n\nexport type BackofficeInfiniteScrollConfig = {\n enabled: boolean;\n thresholdPx?: number;\n autoLoad?: boolean;\n};\n\nexport type BackofficeVirtualizedConnectionTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n emptyState?: JSX.Element;\n className?: string;\n gridTemplateColumns?: string;\n\n virtualization?: BackofficeVirtualizationConfig;\n\n infiniteScroll?: BackofficeInfiniteScrollConfig;\n hasNextPage?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n};\n\nexport const BackofficeVirtualizedConnectionTable = <Row,>({\n columns,\n rows,\n getRowId,\n emptyState,\n className,\n gridTemplateColumns,\n virtualization,\n infiniteScroll,\n hasNextPage,\n isLoadingMore,\n onLoadMore,\n ariaLabel,\n ariaLabelledBy,\n}: BackofficeVirtualizedConnectionTableProps<Row>): JSX.Element => {\n return (\n <VirtualizedConnectionTable\n columns={columns}\n rows={rows}\n getRowId={getRowId}\n emptyState={emptyState}\n className={className}\n gridTemplateColumns={gridTemplateColumns}\n kind={undefined}\n classes={undefined}\n virtualization={mapVirtualization(virtualization)}\n infiniteScroll={mapInfiniteScroll(infiniteScroll)}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={onLoadMore}\n ariaLabel={ariaLabel}\n ariaLabelledBy={ariaLabelledBy}\n />\n );\n};\n\nexport default BackofficeVirtualizedConnectionTable;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const topRow = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 4,\n flexWrap: 'wrap',\n});\n\nexport const titleBlock = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n flex: 1,\n});\n\nexport const titleRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontSize: '3xl',\n lineHeight: '3xl',\n fontWeight: 'semibold',\n color: 'text',\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n\nexport const badgeRow = sprinkles({\n display: 'inline-flex',\n flexWrap: 'wrap',\n gap: 1.5,\n alignItems: 'center',\n});\n\nexport const subtitle = sprinkles({\n fontSize: 'base',\n color: 'textSecondary',\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n\nexport const metaSlot = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const meta = sprinkles({\n display: 'grid',\n gap: 2,\n gridTemplateColumns: 'autoFitMinmax12_5rem',\n paddingTop: 1,\n});\n\nexport const metaItem = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n padding: 3,\n borderRadius: 'lg',\n backgroundColor: 'surfaceMuted',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n});\n\nexport const metaLabel = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n fontWeight: 'semibold',\n});\n\nexport const metaValue = sprinkles({\n fontSize: 'base',\n color: 'text',\n fontWeight: 'medium',\n minWidth: 0,\n overflowWrap: 'anywhere',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './entityHeader.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type EntityHeaderItem = {\n id: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport type EntityHeaderProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n status?: ReactNode;\n badges?: ReactNode;\n actions?: ReactNode;\n items?: readonly EntityHeaderItem[];\n metaSlot?: ReactNode;\n className?: string;\n};\n\nexport const EntityHeader = ({\n title,\n subtitle,\n status,\n badges,\n actions,\n items = [],\n metaSlot,\n className,\n}: EntityHeaderProps): JSX.Element => {\n let subtitleNode: JSX.Element | null = null;\n if (subtitle != null) {\n subtitleNode = <div className={styles.subtitle}>{subtitle}</div>;\n }\n\n let badgesNode: JSX.Element | null = null;\n if (status != null || badges != null) {\n badgesNode = (\n <div className={styles.badgeRow}>\n {status}\n {badges}\n </div>\n );\n }\n\n let itemsNode: JSX.Element | null = null;\n if (items.length > 0) {\n itemsNode = (\n <div className={styles.meta}>\n {items.map((item) => {\n return (\n <div key={item.id} className={styles.metaItem}>\n <div className={styles.metaLabel}>{item.label}</div>\n <div className={styles.metaValue}>{item.value}</div>\n </div>\n );\n })}\n </div>\n );\n }\n\n let metaSlotNode: JSX.Element | null = null;\n if (metaSlot != null) {\n metaSlotNode = <div className={styles.metaSlot}>{metaSlot}</div>;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <div className={styles.topRow}>\n <div className={styles.titleBlock}>\n <div className={styles.titleRow}>\n <div className={styles.title}>{title}</div>\n {badgesNode}\n </div>\n {subtitleNode}\n </div>\n {actions}\n </div>\n\n {metaSlotNode}\n {itemsNode}\n </div>\n );\n};\n\nexport default EntityHeader;\n","import { createVar, style } from '@vanilla-extract/css';\nimport { adminSurfaceRecipe } from '../../../admin/theme/adminSurface.css.js';\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nimport { backofficeLayoutTokens } from '../../layout/backofficeLayoutTokens.js';\n\nconst detailTokens = backofficeLayoutTokens.detail;\n\nexport const sidePanelTopVar = createVar();\n\nexport const container = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n }),\n {\n vars: {\n [sidePanelTopVar]: detailTokens.stickyTop,\n },\n },\n]);\n\nexport const rowSingle = sprinkles({\n width: 'full',\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const rowSplit = sprinkles({\n display: 'grid',\n gridTemplateColumns: {\n base: 'detailSingle',\n min1200: 'detailAside320',\n },\n alignItems: {\n base: 'stretch',\n min1200: 'flex-start',\n },\n});\n\nexport const rowSplitBase = sprinkles({\n width: 'full',\n minWidth: 0,\n gap: 4,\n});\n\nexport const headerCard = style([\n {\n minWidth: 0,\n },\n]);\n\nexport const headerCardDensity = {\n default: adminSurfaceRecipe({\n level: 'panel',\n radius: 'lg',\n border: 'subtle',\n elevation: 'none',\n padding: 'lg',\n }),\n compact: adminSurfaceRecipe({\n level: 'panel',\n radius: 'md',\n border: 'subtle',\n elevation: 'none',\n padding: 'md',\n }),\n};\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n minWidth: 0,\n});\n\nexport const sidePanelBase = style([\n sprinkles({\n position: {\n base: 'static',\n min1200: 'sticky',\n },\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n minWidth: 0,\n alignSelf: 'flex-start',\n }),\n {\n top: sidePanelTopVar,\n },\n]);\n\nexport const sidePanelCard = style([\n adminSurfaceRecipe({\n level: 'panelMuted',\n radius: 'md',\n border: 'subtle',\n elevation: 'none',\n padding: 'md',\n }),\n]);\n\nexport const sidePanelPlain = sprinkles({\n borderWidth: 0,\n borderStyle: 'none',\n backgroundColor: 'transparent',\n padding: 0,\n boxShadow: 'none',\n});\n\nexport const tabsRow = style([\n sprinkles({\n position: 'sticky',\n backgroundColor: 'background',\n paddingBottom: 2,\n zIndex: 2,\n }),\n {\n top: sidePanelTopVar,\n },\n]);\n","import { type CSSProperties, type JSX, type ReactNode } from 'react';\n\nimport {\n EntityHeader,\n type EntityHeaderProps,\n} from '../../organisms/entity_header/EntityHeader.js';\nimport * as styles from './detailPageTemplate.css.js';\nimport { cx } from '@plumile/ui';\n\ntype WithHeaderProps = {\n header: EntityHeaderProps;\n headerNode?: never;\n};\n\ntype WithHeaderNode = {\n header?: never;\n headerNode: ReactNode;\n};\n\nexport type DetailSidePanelVariant = 'card' | 'plain';\nexport type DetailLayoutVariant = 'single' | 'split';\nexport type DetailHeaderDensity = 'default' | 'compact';\n\nexport type DetailPageTemplateProps = (WithHeaderProps | WithHeaderNode) & {\n children: ReactNode;\n aboveContent?: ReactNode;\n tabsNode?: ReactNode;\n sidePanel?: ReactNode;\n sidePanelVariant?: DetailSidePanelVariant;\n sidePanelStickyTop?: string;\n layoutVariant?: DetailLayoutVariant;\n headerDensity?: DetailHeaderDensity;\n className?: string;\n};\n\nexport const DetailPageTemplate = (\n props: DetailPageTemplateProps,\n): JSX.Element => {\n const {\n children,\n aboveContent,\n className,\n tabsNode,\n sidePanel,\n sidePanelVariant = 'card',\n sidePanelStickyTop,\n layoutVariant,\n headerDensity = 'default',\n } = props;\n\n const hasSidePanel = sidePanel != null;\n let autoLayoutVariant: DetailLayoutVariant = 'single';\n if (hasSidePanel) {\n autoLayoutVariant = 'split';\n }\n let resolvedLayoutVariant = layoutVariant ?? autoLayoutVariant;\n if (!hasSidePanel) {\n resolvedLayoutVariant = 'single';\n }\n const isSplitLayout = resolvedLayoutVariant === 'split';\n let rowClassName = styles.rowSingle;\n if (isSplitLayout) {\n rowClassName = cx(styles.rowSplit, styles.rowSplitBase);\n }\n\n let resolvedHeader: ReactNode;\n if ('headerNode' in props) {\n resolvedHeader = props.headerNode;\n } else {\n resolvedHeader = <EntityHeader {...props.header} />;\n }\n\n const resolvedStickyTop = sidePanelStickyTop?.trim();\n let containerStyle: CSSProperties | undefined;\n if (resolvedStickyTop != null && resolvedStickyTop !== '') {\n containerStyle = {\n [styles.sidePanelTopVar]: resolvedStickyTop,\n };\n }\n\n let sidePanelClassName = styles.sidePanelCard;\n if (sidePanelVariant === 'plain') {\n sidePanelClassName = styles.sidePanelPlain;\n }\n const resolvedSidePanelClassName = cx(\n styles.sidePanelBase,\n sidePanelClassName,\n );\n\n return (\n <div className={cx(styles.container, className)} style={containerStyle}>\n <div className={rowClassName}>\n <div\n className={cx(\n styles.headerCard,\n styles.headerCardDensity[headerDensity],\n )}\n >\n {resolvedHeader}\n </div>\n </div>\n {tabsNode != null && (\n <div className={rowClassName}>\n <div className={styles.tabsRow}>{tabsNode}</div>\n </div>\n )}\n <div className={rowClassName}>\n <div className={styles.body}>\n {aboveContent}\n {children}\n </div>\n {hasSidePanel && (\n <aside className={resolvedSidePanelClassName}>{sidePanel}</aside>\n )}\n </div>\n </div>\n );\n};\n\nexport default DetailPageTemplate;\n","import { style } from '@vanilla-extract/css';\n\nimport { adminSurfaceRecipe } from '../../../admin/theme/adminSurface.css.js';\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n display: 'grid',\n});\n\nexport const containerPresentation = {\n framed: sprinkles({\n gap: 3,\n }),\n flat: sprinkles({\n gap: 2,\n }),\n};\n\nexport const containerWithToolbar = sprinkles({\n gridTemplateRows: 'none',\n});\n\nexport const containerNoToolbar = sprinkles({\n gridTemplateRows: 'none',\n});\n\nexport const headerCard = style([\n {\n minWidth: 0,\n },\n]);\n\nexport const headerPresentation = {\n framed: style([\n adminSurfaceRecipe({\n level: 'panel',\n radius: 'lg',\n border: 'subtle',\n elevation: 'none',\n padding: 'lg',\n }),\n {\n backgroundImage: `linear-gradient(135deg, color-mix(in srgb, ${vars.colors.surface} 88%, ${vars.colors['blue-50']}) 0%, ${vars.colors.surface} 58%)`,\n },\n ]),\n flat: sprinkles({\n paddingX: 1,\n paddingY: 1,\n }),\n};\n\nexport const toolbarCard = style([\n {\n minWidth: 0,\n position: 'sticky',\n top: vars.spacing[2],\n zIndex: vars.zIndex[10],\n },\n]);\n\nexport const toolbarPresentation = {\n framed: adminSurfaceRecipe({\n level: 'toolbar',\n radius: 'md',\n border: 'subtle',\n elevation: 'none',\n padding: 'sm',\n }),\n flat: style([\n adminSurfaceRecipe({\n level: 'toolbar',\n radius: 'md',\n border: 'subtle',\n elevation: 'none',\n padding: 'sm',\n }),\n {\n boxShadow: `0 1px 0 ${vars.colors.borderLight}`,\n },\n ]),\n};\n\nexport const tableCard = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n }),\n]);\n\nexport const tablePresentation = {\n framed: style([\n adminSurfaceRecipe({\n level: 'table',\n radius: 'lg',\n border: 'subtle',\n elevation: 'none',\n padding: 'sm',\n }),\n {\n boxShadow: `0 1px 0 ${vars.colors.borderSubtle}`,\n },\n ]),\n flat: style([\n adminSurfaceRecipe({\n level: 'table',\n radius: 'md',\n border: 'subtle',\n elevation: 'none',\n padding: 'sm',\n }),\n {\n boxShadow: `0 1px 0 ${vars.colors.borderLight}`,\n },\n ]),\n};\n\nexport const tableScroll = style({\n overflowX: 'auto',\n overflowY: 'visible',\n scrollbarWidth: 'thin',\n scrollbarColor: `${vars.colors.border} transparent`,\n});\n\nexport const tableFooter = sprinkles({\n marginTop: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport {\n BackofficeDataTable,\n type BackofficeDataTableProps,\n} from '../../organisms/backoffice_data_table/BackofficeDataTable.js';\nimport {\n EntityHeader,\n type EntityHeaderProps,\n} from '../../organisms/entity_header/EntityHeader.js';\n\nimport * as styles from './listPageTemplate.css.js';\nimport { cx } from '@plumile/ui';\n\ntype ListBaseProps = {\n toolbarNode?: ReactNode;\n statusNode?: ReactNode;\n tableFooterNode?: ReactNode;\n presentation?: 'framed' | 'flat';\n className?: string;\n};\n\ntype ListWithHeaderProps<Row> = ListBaseProps & {\n header: EntityHeaderProps;\n headerNode?: never;\n table: BackofficeDataTableProps<Row>;\n tableNode?: never;\n};\n\ntype ListWithHeaderNode<Row> = ListBaseProps & {\n header?: never;\n headerNode: ReactNode;\n table: BackofficeDataTableProps<Row>;\n tableNode?: never;\n};\n\ntype ListWithCustomTable =\n | (ListBaseProps & {\n header: EntityHeaderProps;\n headerNode?: never;\n table?: never;\n tableNode: ReactNode;\n })\n | (ListBaseProps & {\n header?: never;\n headerNode: ReactNode;\n table?: never;\n tableNode: ReactNode;\n });\n\nexport type ListPageTemplateProps<Row> =\n | ListWithHeaderProps<Row>\n | ListWithHeaderNode<Row>\n | ListWithCustomTable;\n\nexport const ListPageTemplate = <Row,>(\n props: ListPageTemplateProps<Row>,\n): JSX.Element => {\n const {\n presentation = 'framed',\n className,\n toolbarNode,\n statusNode,\n tableFooterNode,\n } = props;\n\n let containerVariant = styles.containerNoToolbar;\n if (toolbarNode != null) {\n containerVariant = styles.containerWithToolbar;\n }\n\n const containerClasses = cx(\n styles.container,\n containerVariant,\n styles.containerPresentation[presentation],\n className,\n );\n\n let resolvedHeader: ReactNode;\n if ('headerNode' in props) {\n resolvedHeader = props.headerNode;\n } else {\n resolvedHeader = <EntityHeader {...props.header} />;\n }\n\n let resolvedTable: ReactNode;\n if ('tableNode' in props) {\n resolvedTable = props.tableNode;\n } else {\n resolvedTable = <BackofficeDataTable {...props.table} />;\n }\n\n let footerSection: ReactNode | null = null;\n if (tableFooterNode != null) {\n footerSection = <div className={styles.tableFooter}>{tableFooterNode}</div>;\n }\n\n return (\n <div className={containerClasses}>\n <div\n className={cx(\n styles.headerCard,\n styles.headerPresentation[presentation],\n )}\n >\n {resolvedHeader}\n </div>\n {toolbarNode != null && (\n <div\n className={cx(\n styles.toolbarCard,\n styles.toolbarPresentation[presentation],\n )}\n >\n {toolbarNode}\n </div>\n )}\n {statusNode != null && <div>{statusNode}</div>}\n <div\n className={cx(styles.tableCard, styles.tablePresentation[presentation])}\n >\n <div className={styles.tableScroll}>{resolvedTable}</div>\n {footerSection}\n </div>\n </div>\n );\n};\n\nexport default ListPageTemplate;\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles, vars } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n height: 'full',\n backgroundColor: 'surfaceElevated',\n borderWidth: 0,\n borderStyle: 'solid',\n borderRightWidth: 'px',\n borderRightColor: 'borderSubtle',\n});\n\nexport const widthRecipe = recipe({\n variants: {\n state: {\n expanded: { width: vars.width[64] },\n collapsed: { width: vars.width[17.5] },\n },\n },\n defaultVariants: {\n state: 'expanded',\n },\n});\n\nexport type WidthRecipeVariants = RecipeVariants<typeof widthRecipe>;\n\nexport const inner = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n padding: 3,\n height: 'full',\n minHeight: 0,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingX: 1,\n});\n\nexport const sections = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n scrollbarWidth: 'thin',\n scrollbarColor: 'borderLight',\n});\n\nexport const search = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n paddingX: 1,\n});\n\nexport const footer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n paddingX: 1,\n});\n","import { useCallback, useState, type JSX, type ReactNode } from 'react';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { SidebarCollapseToggle } from '../../../backoffice/molecules/sidebar_collapse_toggle/SidebarCollapseToggle.js';\nimport {\n SidebarNavSection,\n type SidebarNavSectionItem,\n} from '../../../backoffice/molecules/sidebar_nav_section/SidebarNavSection.js';\n\nimport * as styles from './adminSidebar.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type AdminSidebarSection = {\n id: string;\n title?: ReactNode;\n icon?: ReactNode;\n items: readonly SidebarNavSectionItem[];\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n isCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n};\n\nexport type AdminSidebarProps = {\n header?: ReactNode;\n search?: ReactNode;\n footer?: ReactNode;\n sections: readonly AdminSidebarSection[];\n isCollapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n collapseToggleLabel?: ReactNode;\n expandToggleLabel?: ReactNode;\n collapseShortcut?: readonly string[] | string;\n navigationAriaLabel?: string;\n hideCollapseToggle?: boolean;\n className?: string;\n};\n\nexport const AdminSidebar = ({\n header,\n search,\n footer,\n sections,\n isCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseToggleLabel,\n expandToggleLabel,\n collapseShortcut,\n navigationAriaLabel = 'Admin navigation',\n hideCollapseToggle = false,\n className,\n}: AdminSidebarProps): JSX.Element => {\n const [uncontrolledCollapsed, setUncontrolledCollapsed] =\n useState(defaultCollapsed);\n\n const collapsed = isCollapsed ?? uncontrolledCollapsed;\n\n const handleToggleCollapsed = useCallback(() => {\n const next = !collapsed;\n if (isCollapsed == null) {\n setUncontrolledCollapsed(next);\n }\n onCollapsedChange?.(next);\n }, [collapsed, isCollapsed, onCollapsedChange]);\n\n let widthKey: NonNullable<\n NonNullable<RecipeVariants<typeof styles.widthRecipe>>['state']\n > = 'expanded';\n if (collapsed) {\n widthKey = 'collapsed';\n }\n\n let footerNode: JSX.Element | null = null;\n if (footer != null) {\n footerNode = <div className={styles.footer}>{footer}</div>;\n }\n\n return (\n <aside\n className={cx(\n styles.container,\n styles.widthRecipe({ state: widthKey }),\n className,\n )}\n >\n <div className={styles.inner}>\n <div className={styles.header}>\n {header}\n {!hideCollapseToggle && (\n <SidebarCollapseToggle\n isCollapsed={collapsed}\n onToggle={handleToggleCollapsed}\n label={collapseToggleLabel}\n expandLabel={expandToggleLabel}\n shortcut={collapseShortcut}\n />\n )}\n </div>\n\n {search != null && <div className={styles.search}>{search}</div>}\n <nav className={styles.sections} aria-label={navigationAriaLabel}>\n {sections.map((section) => {\n return (\n <SidebarNavSection\n key={section.id}\n title={section.title}\n icon={section.icon}\n items={section.items}\n collapsible={section.collapsible}\n defaultCollapsed={section.defaultCollapsed}\n isCollapsed={section.isCollapsed}\n onCollapsedChange={section.onCollapsedChange}\n collapsed={collapsed}\n />\n );\n })}\n </nav>\n\n {footerNode}\n </div>\n </aside>\n );\n};\n\nexport default AdminSidebar;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n minWidth: 0,\n width: 'full',\n});\n\nexport const row = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n flexWrap: 'wrap',\n minWidth: 0,\n});\n\nexport const left = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n flex: 1,\n minWidth: 0,\n});\n\nexport const right = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n justifyContent: 'flex-end',\n flexShrink: 0,\n});\n\nexport const divider = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n height: 6,\n width: 0.5,\n backgroundColor: 'border',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './adminTopbar.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type AdminTopbarProps = {\n breadcrumb?: ReactNode;\n leftSlot?: ReactNode;\n rightSlot?: ReactNode;\n className?: string;\n};\n\nexport const AdminTopbar = ({\n breadcrumb,\n leftSlot,\n rightSlot,\n className,\n}: AdminTopbarProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <div className={styles.row}>\n <div className={styles.left}>\n {breadcrumb}\n {leftSlot}\n </div>\n <div className={styles.right}>{rightSlot}</div>\n </div>\n </div>\n );\n};\n\nexport default AdminTopbar;\n","import { type JSX, type ReactNode } from 'react';\n\nimport { AppShell } from '../../../components/layout/AppShell.js';\nimport {\n AdminSidebar,\n type AdminSidebarProps,\n} from '../../organisms/admin_sidebar/AdminSidebar.js';\nimport {\n AdminTopbar,\n type AdminTopbarProps,\n} from '../../organisms/admin_topbar/AdminTopbar.js';\nimport type { PageShellActions, PageShellTab } from '@plumile/ui';\n\nexport type AdminShellLayoutProps = {\n children: ReactNode;\n sidebar: AdminSidebarProps;\n mobileSidebar?: AdminSidebarProps;\n topbar?: AdminTopbarProps;\n actions?: PageShellActions;\n tabs?: PageShellTab[];\n};\n\nexport const AdminShellLayout = ({\n children,\n sidebar,\n mobileSidebar,\n topbar,\n actions,\n tabs,\n}: AdminShellLayoutProps): JSX.Element => {\n const isDesktopSidebarOpen = sidebar.isCollapsed !== true;\n let sidebarNode: JSX.Element | null = null;\n if (isDesktopSidebarOpen) {\n sidebarNode = <AdminSidebar {...sidebar} isCollapsed={false} />;\n }\n let mobileSidebarNode: JSX.Element | undefined;\n if (mobileSidebar != null) {\n mobileSidebarNode = <AdminSidebar {...mobileSidebar} />;\n }\n let topbarNode: JSX.Element | null = null;\n if (topbar != null) {\n topbarNode = <AdminTopbar {...topbar} />;\n }\n\n let openDesktopSidebarLabel: string | undefined;\n if (typeof sidebar.expandToggleLabel === 'string') {\n openDesktopSidebarLabel = sidebar.expandToggleLabel;\n }\n\n return (\n <AppShell\n sidebar={sidebarNode}\n mobileSidebar={mobileSidebarNode}\n desktopSidebarOpen={isDesktopSidebarOpen}\n onOpenDesktopSidebar={() => {\n sidebar.onCollapsedChange?.(false);\n }}\n openDesktopSidebarLabel={openDesktopSidebarLabel}\n breadcrumbSlot={topbarNode}\n actions={actions}\n tabs={tabs}\n >\n {children}\n </AppShell>\n );\n};\n\nexport default AdminShellLayout;\n","import { createVar, style } from '@vanilla-extract/css';\n\nimport { vars } from '../../theme/index.js';\n\nexport type AdminDensity = 'compact' | 'default' | 'comfortable';\n\nexport type AdminSurfaceLevel =\n | 'page'\n | 'panel'\n | 'panelMuted'\n | 'raised'\n | 'sunken'\n | 'overlay'\n | 'toolbar'\n | 'table';\n\nexport type AdminRadius = 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AdminElevation = 'none' | 'subtle' | 'raised' | 'overlay';\n\nexport type AdminSurfaceRecipeProps = {\n level?: AdminSurfaceLevel;\n density?: AdminDensity;\n radius?: AdminRadius;\n elevation?: AdminElevation;\n border?: 'none' | 'subtle' | 'default' | 'strong';\n padding?: 'none' | 'xs' | 'sm' | 'md' | 'lg';\n};\n\nexport const adminPanelPaddingVar = createVar();\nexport const adminToolbarGapVar = createVar();\nexport const adminControlHeightVar = createVar();\nexport const adminTableRowMinHeightVar = createVar();\nexport const adminTableCellPaddingXVar = createVar();\nexport const adminTableCellPaddingYVar = createVar();\nexport const adminTableFontSizeVar = createVar();\n\nexport const adminDensityCompactClass = style({\n vars: {\n [adminPanelPaddingVar]: vars.spacing[4],\n [adminToolbarGapVar]: vars.spacing[2],\n [adminControlHeightVar]: vars.spacing[8],\n [adminTableRowMinHeightVar]: vars.spacing[9],\n [adminTableCellPaddingXVar]: vars.spacing[3],\n [adminTableCellPaddingYVar]: vars.spacing[2],\n [adminTableFontSizeVar]: vars.fontSize.sm,\n },\n});\n\nexport const adminDensityDefaultClass = style({\n vars: {\n [adminPanelPaddingVar]: vars.spacing[5],\n [adminToolbarGapVar]: vars.spacing[3],\n [adminControlHeightVar]: vars.spacing[9],\n [adminTableRowMinHeightVar]: vars.spacing[10],\n [adminTableCellPaddingXVar]: vars.spacing[4],\n [adminTableCellPaddingYVar]: vars.spacing[2.5],\n [adminTableFontSizeVar]: vars.fontSize.sm,\n },\n});\n\nexport const adminDensityComfortableClass = style({\n vars: {\n [adminPanelPaddingVar]: vars.spacing[6],\n [adminToolbarGapVar]: vars.spacing[4],\n [adminControlHeightVar]: vars.spacing[10],\n [adminTableRowMinHeightVar]: vars.spacing[12],\n [adminTableCellPaddingXVar]: vars.spacing[5],\n [adminTableCellPaddingYVar]: vars.spacing[3],\n [adminTableFontSizeVar]: vars.fontSize.base,\n },\n});\n","import { style } from '@vanilla-extract/css';\nimport { vars } from '../../theme/index.js';\n\nexport const adminThemeClass = style({\n vars: {\n [vars.colors.background]: '#F5F7FA',\n [vars.colors.backgroundSecondary]: '#EEF2F7',\n [vars.colors.backgroundTertiary]: '#E6ECF3',\n [vars.colors.backgroundModifier]: '#D8E0EB',\n [vars.colors.surface]: '#FFFFFF',\n [vars.colors.surfaceSecondary]: '#F8FAFD',\n [vars.colors.surfaceMuted]: '#F1F5F9',\n [vars.colors.surfaceElevated]: '#FFFFFF',\n [vars.colors.text]: '#101828',\n [vars.colors.textSecondary]: '#475467',\n [vars.colors.textMuted]: '#667085',\n [vars.colors.border]: '#D9E2EC',\n [vars.colors.borderSubtle]: '#E7EDF4',\n [vars.colors.borderStrong]: '#C5D0DE',\n [vars.colors.borderLight]: '#EEF2F6',\n [vars.colors.primaryLight]: 'rgba(178, 24, 79, 0.1)',\n [vars.colors.brandLightGray]: '#F6F8FB',\n [vars.colors.infoLight]: '#EAF3FF',\n [vars.colors.successLight]: '#EAF7EF',\n [vars.colors.warningLight]: '#FFF4DA',\n },\n backgroundColor: vars.colors.background,\n color: vars.colors.text,\n minHeight: '100vh',\n});\n","import type { JSX, ReactNode } from 'react';\n\nimport '../../theme/accessibility.css.js';\nimport '../../theme/global.css.js';\n\nimport { adminDensityCompactClass } from './adminDensity.css.js';\nimport { adminThemeClass } from './adminTheme.css.js';\nimport { cx } from '../../theme/tools.js';\n\nexport type AdminThemeProviderProps = {\n children: ReactNode;\n};\n\nexport const AdminThemeProvider = ({\n children,\n}: AdminThemeProviderProps): JSX.Element => {\n return (\n <div className={cx(adminThemeClass, adminDensityCompactClass)}>\n {children}\n </div>\n );\n};\n\nexport default AdminThemeProvider;\n","export const FALLBACK_REFERENCE = '—';\n\n/**\n * Returns a display-safe string or a fallback glyph when the value is absent.\n */\nexport function formatNullableString(value: string | null | undefined): string {\n if (value == null) {\n return FALLBACK_REFERENCE;\n }\n\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return FALLBACK_REFERENCE;\n }\n\n return value;\n}\n\n/**\n * Formats numeric values for UI display while preserving a fallback for nullish input.\n */\nexport function formatNullableNumber(value: number | null | undefined): string {\n if (value == null) {\n return FALLBACK_REFERENCE;\n }\n\n if (Number.isFinite(value)) {\n return value.toLocaleString();\n }\n\n return String(value);\n}\n\n/**\n * Joins a list of labels for display or returns the fallback when the list is empty.\n */\nexport function formatStringList(values: readonly string[]): string {\n if (values.length === 0) {\n return FALLBACK_REFERENCE;\n }\n\n return values.join(', ');\n}\n\n/**\n * Formats a currency amount with locale-aware separators and a null-safe fallback.\n */\nexport function formatNullableCurrency(\n value: number | null | undefined,\n currency = 'USD',\n locale?: string,\n): string {\n if (value == null) {\n return FALLBACK_REFERENCE;\n }\n\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) {\n return FALLBACK_REFERENCE;\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n currencyDisplay: 'symbol',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(numeric);\n } catch {\n return numeric.toString();\n }\n}\n","import { style } from '@vanilla-extract/css';\n\nimport {\n tableCellFontSizeVar,\n tableCellPaddingVar,\n tableEmptyRowPaddingVar,\n tableRowMinHeightVar,\n} from '../components/data-table/DataTable.css.js';\nimport { vars } from '../theme/index.js';\n\nexport const denseTableClass = style({\n vars: {\n [tableCellPaddingVar]: `${vars.spacing[2]} ${vars.spacing[3]}`,\n [tableCellFontSizeVar]: vars.fontSize.sm,\n [tableEmptyRowPaddingVar]: `${vars.spacing[4]} ${vars.spacing[3]}`,\n [tableRowMinHeightVar]: vars.spacing[9],\n },\n});\n","export type NormalizedProgress = {\n current: number;\n total: number;\n label?: string;\n explanation?: string | null;\n};\n\nexport type ProgressLike =\n | {\n currentStep: number | null | undefined;\n totalSteps: number | null | undefined;\n explanation?: string | null | undefined;\n }\n | null\n | undefined;\n\nexport type NormalizeProgressOptions = {\n label?: string;\n};\n\n/**\n *\n */\nexport function normalizeProgress(\n progress: ProgressLike,\n options: NormalizeProgressOptions = {},\n): NormalizedProgress | null {\n if (progress == null) {\n return null;\n }\n\n const total = progress.totalSteps ?? 0;\n if (total <= 0) {\n return null;\n }\n\n const rawCurrent = progress.currentStep ?? 0;\n const current = Math.min(Math.max(rawCurrent, 0), total);\n const explanation = progress.explanation ?? null;\n\n return {\n current,\n total,\n label: options.label,\n explanation,\n };\n}\n","export type TimeSeriesChartPoint = {\n x: string;\n y: number;\n};\n\nexport type TimeSeriesChartSerie<Category extends string> = {\n id: Category;\n data: readonly TimeSeriesChartPoint[];\n};\n\nexport type TimeSeriesBucketInput<Category extends string> = {\n day: string;\n category: Category;\n value: number;\n};\n\nconst UTC_DAY_MS = 24 * 60 * 60 * 1000;\n\n/**\n *\n */\nfunction toUtcMidnightDate(value: Date): Date {\n return new Date(\n Date.UTC(value.getUTCFullYear(), value.getUTCMonth(), value.getUTCDate()),\n );\n}\n\n/**\n *\n */\nexport function toUtcDayKey(isoDateTime: string): string {\n const parsed = new Date(isoDateTime);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`Invalid ISO datetime: ${isoDateTime}`);\n }\n return toUtcMidnightDate(parsed).toISOString().slice(0, 10);\n}\n\n/**\n *\n */\nexport function buildUtcDayRange(\n fromIsoDateTime: string,\n toIsoDateTime: string,\n): readonly string[] {\n const from = toUtcMidnightDate(new Date(fromIsoDateTime));\n const to = toUtcMidnightDate(new Date(toIsoDateTime));\n\n if (Number.isNaN(from.getTime())) {\n throw new Error(`Invalid \"from\" datetime: ${fromIsoDateTime}`);\n }\n if (Number.isNaN(to.getTime())) {\n throw new Error(`Invalid \"to\" datetime: ${toIsoDateTime}`);\n }\n if (from.getTime() > to.getTime()) {\n throw new Error(\n `\"from\" must be before or equal to \"to\": ${fromIsoDateTime} > ${toIsoDateTime}`,\n );\n }\n\n const dayKeys: string[] = [];\n for (\n let cursor = from.getTime();\n cursor <= to.getTime();\n cursor += UTC_DAY_MS\n ) {\n dayKeys.push(new Date(cursor).toISOString().slice(0, 10));\n }\n\n return dayKeys;\n}\n\n/**\n *\n */\nexport function aggregateValuesByDayAndCategory<Category extends string>(\n buckets: readonly TimeSeriesBucketInput<Category>[],\n allowedCategories: readonly Category[],\n): ReadonlyMap<string, number> {\n const totals = new Map<string, number>();\n\n for (const bucket of buckets) {\n if (allowedCategories.includes(bucket.category)) {\n const dayKey = toUtcDayKey(bucket.day);\n const key = `${dayKey}|${bucket.category}`;\n const previous = totals.get(key) ?? 0;\n totals.set(key, previous + bucket.value);\n }\n }\n\n return totals;\n}\n\n/**\n *\n */\nexport function toUtcDailyCategorySeries<Category extends string>(params: {\n fromIsoDateTime: string;\n toIsoDateTime: string;\n buckets: readonly TimeSeriesBucketInput<Category>[];\n categories: readonly Category[];\n}): readonly TimeSeriesChartSerie<Category>[] {\n const dayKeys = buildUtcDayRange(\n params.fromIsoDateTime,\n params.toIsoDateTime,\n );\n const totals = aggregateValuesByDayAndCategory(\n params.buckets,\n params.categories,\n );\n\n return params.categories.map((category) => {\n const points = dayKeys.map((dayKey) => {\n return {\n x: dayKey,\n y: totals.get(`${dayKey}|${category}`) ?? 0,\n };\n });\n\n return {\n id: category,\n data: points,\n };\n });\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type MutableRefObject,\n} from 'react';\n\nexport type UseStickToBottomOptions = {\n threshold?: number;\n};\n\nexport type UseStickToBottomResult<\n Element extends HTMLElement = HTMLDivElement,\n> = {\n containerRef: MutableRefObject<Element | null>;\n hasNewItems: boolean;\n notifyContentChanged: () => void;\n scrollToBottom: () => void;\n};\n\nconst DEFAULT_THRESHOLD = 60;\n\n/**\n *\n */\nexport function useStickToBottom<Element extends HTMLElement = HTMLDivElement>({\n threshold = DEFAULT_THRESHOLD,\n}: UseStickToBottomOptions = {}): UseStickToBottomResult<Element> {\n const containerRef = useRef<Element | null>(null);\n const [hasNewItems, setHasNewItems] = useState(false);\n const isNearBottomRef = useRef(true);\n\n const computeNearBottom = useCallback(() => {\n const element = containerRef.current;\n if (element == null) {\n return true;\n }\n const distance =\n element.scrollHeight - element.scrollTop - element.clientHeight;\n return distance <= threshold;\n }, [threshold]);\n\n const scrollToBottom = useCallback(() => {\n const element = containerRef.current;\n if (element == null) {\n return;\n }\n element.scrollTop = element.scrollHeight;\n isNearBottomRef.current = true;\n setHasNewItems(false);\n }, []);\n\n const notifyContentChanged = useCallback(() => {\n if (computeNearBottom()) {\n requestAnimationFrame(scrollToBottom);\n } else {\n setHasNewItems(true);\n }\n }, [computeNearBottom, scrollToBottom]);\n\n const handleScroll = useCallback(() => {\n const nearBottom = computeNearBottom();\n isNearBottomRef.current = nearBottom;\n if (nearBottom) {\n setHasNewItems(false);\n }\n }, [computeNearBottom]);\n\n useEffect(() => {\n const element = containerRef.current;\n if (element == null) {\n return () => {};\n }\n element.addEventListener('scroll', handleScroll);\n return () => {\n element.removeEventListener('scroll', handleScroll);\n };\n }, [handleScroll]);\n\n useEffect(() => {\n const element = containerRef.current;\n if (element == null || typeof ResizeObserver === 'undefined') {\n return () => {};\n }\n\n const observer = new ResizeObserver(() => {\n if (isNearBottomRef.current) {\n requestAnimationFrame(scrollToBottom);\n }\n });\n\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [scrollToBottom]);\n\n useEffect(() => {\n const element = containerRef.current;\n if (element == null || typeof MutationObserver === 'undefined') {\n return () => {};\n }\n\n const observer = new MutationObserver(() => {\n if (isNearBottomRef.current) {\n requestAnimationFrame(scrollToBottom);\n }\n });\n\n observer.observe(element, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n return () => {\n observer.disconnect();\n };\n }, [scrollToBottom]);\n\n return {\n containerRef,\n hasNewItems,\n notifyContentChanged,\n scrollToBottom,\n };\n}\n","import { useCallback, type KeyboardEvent } from 'react';\n\nexport type SubmitOnEnterElement = HTMLTextAreaElement | HTMLInputElement;\n\nexport type UseSubmitOnEnterOptions = {\n enabled?: boolean;\n};\n\n/**\n *\n */\nexport function useSubmitOnEnter(\n options: UseSubmitOnEnterOptions = {},\n): (event: KeyboardEvent<SubmitOnEnterElement>) => void {\n const { enabled = true } = options;\n\n return useCallback(\n (event: KeyboardEvent<SubmitOnEnterElement>) => {\n if (!enabled || event.defaultPrevented) {\n return;\n }\n\n if (\n event.key !== 'Enter' ||\n event.shiftKey ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.repeat ||\n event.nativeEvent.isComposing\n ) {\n return;\n }\n\n const { form } = event.currentTarget;\n if (form == null) {\n return;\n }\n\n event.preventDefault();\n if (typeof form.requestSubmit === 'function') {\n form.requestSubmit();\n return;\n }\n\n form.dispatchEvent(\n new Event('submit', {\n bubbles: true,\n cancelable: true,\n }),\n );\n },\n [enabled],\n );\n}\n","import type { JSX, ReactNode } from 'react';\n\ntype Props = {\n children: ReactNode;\n};\n\nexport const WrapperPage = ({ children }: Props): JSX.Element => {\n return <>{children}</>;\n};\n\nexport default WrapperPage;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const BanSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatSizeLargeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"3\"\n y=\"2\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8 5H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 9H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 13H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 16H14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatSizeMediumSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"3\"\n y=\"4\"\n width=\"18\"\n height=\"14\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8 7H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 11H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 14H12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatSizeSmallSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"3\"\n y=\"6\"\n width=\"18\"\n height=\"10\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8 9H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 12H14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const CheckSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M5 13.5L9.5 18 19 8.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const CoinOffSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <ellipse\n cx=\"12\"\n cy=\"8\"\n rx=\"7\"\n ry=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 8v8c0 1.66 3.13 3 7 3s7-1.34 7-3V8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 12c0 1.66 3.13 3 7 3s7-1.34 7-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 3l18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ClockSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 7v5l3 2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const DatabaseCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <ellipse\n cx=\"12\"\n cy=\"6.5\"\n rx=\"7\"\n ry=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 6.5v9c0 1.66 3.13 3 7 3s7-1.34 7-3v-9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 11c0 1.66 3.13 3 7 3s7-1.34 7-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const DatabaseXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <ellipse\n cx=\"12\"\n cy=\"6.5\"\n rx=\"7\"\n ry=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 6.5v9c0 1.66 3.13 3 7 3s7-1.34 7-3v-9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 11c0 1.66 3.13 3 7 3s7-1.34 7-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const DevModeSvg = ({\n width = 20,\n height = 20,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"m7 8.25-4 4 4 4m10-8 4 4-4 4M13 4l-2 16\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const EyeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M2.5 12S6.5 6 12 6s9.5 6 9.5 6-4 6-9.5 6-9.5-6-9.5-6Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const GripDotsSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle cx=\"9\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n};\n\nexport default GripDotsSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const HomeActivityAssignUserSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M16 21V19C16 17.9391 15.5786 16.9217 14.8284 16.1716C14.0783 15.4214 13.0609 15 12 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 11C10.7091 11 12.5 9.20914 12.5 7C12.5 4.79086 10.7091 3 8.5 3C6.29086 3 4.5 4.79086 4.5 7C4.5 9.20914 6.29086 11 8.5 11Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M20 8V14\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M23 11H17\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const HomeStatsCheckBadgeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M22 11.08V12C21.9988 14.1564 21.3005 16.2547 20.0093 17.9818C18.7182 19.709 16.9033 20.9725 14.8354 21.5839C12.7674 22.1953 10.5573 22.1219 8.53447 21.3746C6.51168 20.6273 4.78465 19.2461 3.61096 17.4371C2.43727 15.628 1.87979 13.4881 2.02168 11.3363C2.16356 9.18457 2.99721 7.13633 4.39828 5.49707C5.79935 3.85782 7.69279 2.71538 9.79619 2.24015C11.8996 1.76491 14.1003 1.98234 16.07 2.86\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M22 4L12 14.01L9 11.01\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const HomeStatsClipboardSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M16 4H18C18.5304 4 19.0391 4.21071 19.4142 4.58579C19.7893 4.96086 20 5.46957 20 6V20C20 20.5304 19.7893 21.0391 19.4142 21.4142C19.0391 21.7893 18.5304 22 18 22H6C5.46957 22 4.96086 21.7893 4.58579 21.4142C4.21071 21.0391 4 20.5304 4 20V6C4 5.46957 4.21071 4.96086 4.58579 4.58579C4.96086 4.21071 5.46957 4 6 4H8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 2H9C8.44772 2 8 2.44772 8 3V5C8 5.55228 8.44772 6 9 6H15C15.5523 6 16 5.55228 16 5V3C16 2.44772 15.5523 2 15 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const HomeStatsClockSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 6V12L16 14\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const KeyOffSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle\n cx=\"7.5\"\n cy=\"16.5\"\n r=\"3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11 16.5h10l-2 2m2-2-2-2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 3l18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const KeySvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle\n cx=\"7.5\"\n cy=\"16.5\"\n r=\"3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11 16.5h10l-2 2m2-2-2-2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 16.5v-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const LinkCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M10 13a5 5 0 0 1 0-7l1.5-1.5a5 5 0 0 1 7 7L17 13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 11a5 5 0 0 1 0 7L12.5 19.5a5 5 0 0 1-7-7L7 11\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const LinkXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M10 13a5 5 0 0 1 0-7l1.5-1.5a5 5 0 0 1 7 7L17 13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 11a5 5 0 0 1 0 7L12.5 19.5a5 5 0 0 1-7-7L7 11\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX, type ReactNode, type SVGProps } from 'react';\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\nexport const createBackofficeSidebarIcon = (children: ReactNode) => {\n return ({ width = 24, height = 24, ...rest }: IconProps): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n {children}\n </svg>\n );\n };\n};\n\nexport const iconProps = {\n stroke: 'currentColor',\n strokeWidth: 1.75,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n} as const;\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarActivitySvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M3 12h4l2.5-7 5 14 2.5-7h4\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarArchiveSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M4 7h16\" />\n <path {...iconProps} d=\"M5 7l1 14h12l1-14\" />\n <path {...iconProps} d=\"M8 3h8l1 4H7l1-4Z\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarBadgeCheckSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M12 3l2.2 2.1 3-.2.7 2.9 2.4 1.8-1.3 2.7 1.3 2.7-2.4 1.8-.7 2.9-3-.2L12 21l-2.2-2.1-3 .2-.7-2.9L3.7 14.4 5 11.7 3.7 9l2.4-1.8.7-2.9 3 .2L12 3Z\"\n />\n <path {...iconProps} d=\"M8.8 12.2l2.1 2.1 4.3-4.6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarBotSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"5\" y=\"8\" width=\"14\" height=\"11\" rx=\"3\" />\n <path {...iconProps} d=\"M12 8V4\" />\n <path {...iconProps} d=\"M9 13h.01\" />\n <path {...iconProps} d=\"M15 13h.01\" />\n <path {...iconProps} d=\"M10 17h4\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarBracesSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M8 4c-2 0-3 1-3 3v2c0 1-1 2-2 2 1 0 2 1 2 2v4c0 2 1 3 3 3\"\n />\n <path\n {...iconProps}\n d=\"M16 4c2 0 3 1 3 3v2c0 1 1 2 2 2-1 0-2 1-2 2v4c0 2-1 3-3 3\"\n />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarBrainCircuitSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M8 4a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3\" />\n <path {...iconProps} d=\"M16 4a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3\" />\n <path {...iconProps} d=\"M8 4c2 0 3 1.2 3 3v10c0 1.8-1 3-3 3\" />\n <path {...iconProps} d=\"M16 4c-2 0-3 1.2-3 3v10c0 1.8 1 3 3 3\" />\n <path {...iconProps} d=\"M8 10h3\" />\n <path {...iconProps} d=\"M13 14h3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarBriefcaseSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"3\" y=\"7\" width=\"18\" height=\"13\" rx=\"2\" />\n <path {...iconProps} d=\"M9 7V5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2\" />\n <path {...iconProps} d=\"M3 12h18\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarBuildingSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"4\" y=\"3\" width=\"12\" height=\"18\" rx=\"2\" />\n <path {...iconProps} d=\"M16 8h4v13h-4\" />\n <path\n {...iconProps}\n d=\"M8 7h.01M12 7h.01M8 11h.01M12 11h.01M8 15h.01M12 15h.01\"\n />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarCableSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M7 7l10 10\" />\n <path {...iconProps} d=\"M4 10l6-6\" />\n <path {...iconProps} d=\"M14 20l6-6\" />\n <path {...iconProps} d=\"M5.5 8.5l2 2\" />\n <path {...iconProps} d=\"M15.5 18.5l-2-2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarCalendarSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"4\" y=\"5\" width=\"16\" height=\"16\" rx=\"2\" />\n <path {...iconProps} d=\"M8 3v4M16 3v4M4 10h16\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarChartBarSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M4 20V4\" />\n <path {...iconProps} d=\"M4 20h16\" />\n <path {...iconProps} d=\"M8 16v-5\" />\n <path {...iconProps} d=\"M12 16V8\" />\n <path {...iconProps} d=\"M16 16v-7\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarChartLineSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M4 19V5\" />\n <path {...iconProps} d=\"M4 19h16\" />\n <path {...iconProps} d=\"M7 15l3-4 3 2 4-6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarChartPieSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M12 3v9h9\" />\n <path {...iconProps} d=\"M19.1 16.7A8 8 0 1 1 10 4.1\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarClipboardCheckSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M9 4h6l1 2h3v15H5V6h3l1-2Z\" />\n <path {...iconProps} d=\"M9 13l2 2 4-5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarClipboardListSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M9 4h6l1 2h3v15H5V6h3l1-2Z\" />\n <path {...iconProps} d=\"M9 11h6M9 15h6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarClockSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"12\" r=\"8\" />\n <path {...iconProps} d=\"M12 8v5l3 2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarCodeSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M8 8l-4 4 4 4\" />\n <path {...iconProps} d=\"M16 8l4 4-4 4\" />\n <path {...iconProps} d=\"M14 4l-4 16\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarCopyCheckSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\" />\n <path {...iconProps} d=\"M4 14V6a2 2 0 0 1 2-2h8\" />\n <path {...iconProps} d=\"M11 14l2 2 4-5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarCopySvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\" />\n <rect {...iconProps} x=\"4\" y=\"4\" width=\"12\" height=\"12\" rx=\"2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarCopyXSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\" />\n <path {...iconProps} d=\"M4 14V6a2 2 0 0 1 2-2h8\" />\n <path {...iconProps} d=\"M12 12l4 4M16 12l-4 4\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarCrosshairSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"12\" r=\"7\" />\n <path {...iconProps} d=\"M12 3v3M12 18v3M3 12h3M18 12h3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarDatabaseSvg = createBackofficeSidebarIcon(\n <>\n <ellipse {...iconProps} cx=\"12\" cy=\"5\" rx=\"7\" ry=\"3\" />\n <path {...iconProps} d=\"M5 5v7c0 1.7 3.1 3 7 3s7-1.3 7-3V5\" />\n <path {...iconProps} d=\"M5 12v7c0 1.7 3.1 3 7 3s7-1.3 7-3v-7\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarDiffSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M5 7h8\" />\n <path {...iconProps} d=\"M5 17h8\" />\n <path {...iconProps} d=\"M17 5v6\" />\n <path {...iconProps} d=\"M14 8h6\" />\n <path {...iconProps} d=\"M14 16h6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFileCodeSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M6 3h8l4 4v14H6V3Z\" />\n <path {...iconProps} d=\"M14 3v5h5\" />\n <path {...iconProps} d=\"M10 12l-2 2 2 2M14 12l2 2-2 2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFileCogSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M6 3h8l4 4v5\" />\n <path {...iconProps} d=\"M14 3v5h5\" />\n <path {...iconProps} d=\"M6 3v18h6\" />\n <circle {...iconProps} cx=\"17\" cy=\"17\" r=\"3\" />\n <path {...iconProps} d=\"M17 13v1M17 20v1M13 17h1M20 17h1\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFileSearchSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M6 3h8l4 4v14H6V3Z\" />\n <path {...iconProps} d=\"M14 3v5h5\" />\n <circle {...iconProps} cx=\"11\" cy=\"14\" r=\"3\" />\n <path {...iconProps} d=\"M13.5 16.5L16 19\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFileStackSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M8 4h9v13H8V4Z\" />\n <path {...iconProps} d=\"M5 7h9v13H5V7Z\" />\n <path {...iconProps} d=\"M11 10h4M8 14h7\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFileTextSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M6 3h8l4 4v14H6V3Z\" />\n <path {...iconProps} d=\"M14 3v5h5\" />\n <path {...iconProps} d=\"M9 12h6M9 16h6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFilesSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M8 4h8l4 4v12H8V4Z\" />\n <path {...iconProps} d=\"M16 4v5h5\" />\n <path {...iconProps} d=\"M4 8v12h10\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFingerprintSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M7 11a5 5 0 0 1 10 0\" />\n <path {...iconProps} d=\"M6 15v-4a6 6 0 0 1 12 0v2\" />\n <path {...iconProps} d=\"M9 20v-8a3 3 0 0 1 6 0v1c0 2 1 3 3 3\" />\n <path {...iconProps} d=\"M12 20v-8\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFlameSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M12 22c4 0 7-3 7-7 0-4-3-6-5-9-.5 2-1.5 3-3 4 .3-3-1-5-3-7 0 4-3 6-3 11 0 4 3 8 7 8Z\"\n />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFolderGitSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M3 6h6l2 3h10v9a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V6Z\" />\n <circle {...iconProps} cx=\"9\" cy=\"14\" r=\"1.5\" />\n <circle {...iconProps} cx=\"16\" cy=\"16\" r=\"1.5\" />\n <path {...iconProps} d=\"M10.5 14.5l4 1\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFolderKanbanSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M3 6h6l2 3h10v9a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V6Z\" />\n <path {...iconProps} d=\"M8 12v4M12 12v6M16 12v3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarFolderTreeSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M3 6h6l2 3h10v5\" />\n <path {...iconProps} d=\"M5 9v10h5\" />\n <path {...iconProps} d=\"M10 17h4\" />\n <path {...iconProps} d=\"M14 14h5v6h-5z\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGaugeSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M5 17a8 8 0 1 1 14 0\" />\n <path {...iconProps} d=\"M12 17l4-5\" />\n <path {...iconProps} d=\"M4 20h16\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGitBranchPlusSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"6\" cy=\"5\" r=\"2\" />\n <circle {...iconProps} cx=\"6\" cy=\"19\" r=\"2\" />\n <path {...iconProps} d=\"M6 7v10\" />\n <path {...iconProps} d=\"M8 12h5\" />\n <path {...iconProps} d=\"M17 8v8M13 12h8\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGitBranchSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"6\" cy=\"5\" r=\"2\" />\n <circle {...iconProps} cx=\"18\" cy=\"6\" r=\"2\" />\n <circle {...iconProps} cx=\"6\" cy=\"19\" r=\"2\" />\n <path {...iconProps} d=\"M6 7v10\" />\n <path {...iconProps} d=\"M8 13h5a5 5 0 0 0 5-5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGitCommitSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"12\" r=\"3\" />\n <path {...iconProps} d=\"M3 12h6M15 12h6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGitCompareSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"7\" cy=\"5\" r=\"2\" />\n <circle {...iconProps} cx=\"17\" cy=\"19\" r=\"2\" />\n <path {...iconProps} d=\"M7 7v7a5 5 0 0 0 5 5h3\" />\n <path {...iconProps} d=\"M17 17v-7a5 5 0 0 0-5-5H9\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGitForkSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"6\" cy=\"5\" r=\"2\" />\n <circle {...iconProps} cx=\"18\" cy=\"5\" r=\"2\" />\n <circle {...iconProps} cx=\"12\" cy=\"19\" r=\"2\" />\n <path {...iconProps} d=\"M6 7v3a6 6 0 0 0 6 6v1\" />\n <path {...iconProps} d=\"M18 7v3a6 6 0 0 1-6 6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGitMergeSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"6\" cy=\"5\" r=\"2\" />\n <circle {...iconProps} cx=\"18\" cy=\"12\" r=\"2\" />\n <circle {...iconProps} cx=\"6\" cy=\"19\" r=\"2\" />\n <path {...iconProps} d=\"M6 7v10\" />\n <path {...iconProps} d=\"M8 12h8\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGitPullRequestSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"6\" cy=\"5\" r=\"2\" />\n <circle {...iconProps} cx=\"18\" cy=\"19\" r=\"2\" />\n <path {...iconProps} d=\"M6 7v12\" />\n <path {...iconProps} d=\"M18 17V9a4 4 0 0 0-4-4h-2\" />\n <path {...iconProps} d=\"M12 2l-3 3 3 3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarGlobeSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"12\" r=\"9\" />\n <path {...iconProps} d=\"M3 12h18\" />\n <path {...iconProps} d=\"M12 3c2.5 2.5 3.5 5.5 3.5 9S14.5 18.5 12 21\" />\n <path {...iconProps} d=\"M12 3c-2.5 2.5-3.5 5.5-3.5 9s1 6.5 3.5 9\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarHistorySvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M4 12a8 8 0 1 0 2.3-5.7L4 8.5\" />\n <path {...iconProps} d=\"M4 4v4.5h4.5\" />\n <path {...iconProps} d=\"M12 8v5l3 2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarInfoSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"12\" r=\"9\" />\n <path {...iconProps} d=\"M12 11v5\" />\n <path {...iconProps} d=\"M12 8h.01\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarKeySquareSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"3\" />\n <circle {...iconProps} cx=\"10\" cy=\"13\" r=\"2\" />\n <path {...iconProps} d=\"M12 13h4v2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarKeySvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"8\" cy=\"15\" r=\"4\" />\n <path {...iconProps} d=\"M11 12l8-8\" />\n <path {...iconProps} d=\"M15 4l2 2\" />\n <path {...iconProps} d=\"M13 6l2 2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarLandmarkSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M4 9l8-5 8 5\" />\n <path {...iconProps} d=\"M6 10v8M10 10v8M14 10v8M18 10v8\" />\n <path {...iconProps} d=\"M4 21h16M5 18h14\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarLayoutDashboardSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"2\" />\n <rect {...iconProps} x=\"13\" y=\"4\" width=\"7\" height=\"5\" rx=\"2\" />\n <rect {...iconProps} x=\"13\" y=\"11\" width=\"7\" height=\"9\" rx=\"2\" />\n <rect {...iconProps} x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarLinkSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M10 13a5 5 0 0 0 7.1 0l2-2a5 5 0 0 0-7.1-7.1l-1 1\"\n />\n <path\n {...iconProps}\n d=\"M14 11a5 5 0 0 0-7.1 0l-2 2A5 5 0 0 0 12 20.1l1-1\"\n />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarListChecksSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M8 6h12M8 12h12M8 18h12\" />\n <path {...iconProps} d=\"M3 6l1 1 2-2M3 12l1 1 2-2M3 18l1 1 2-2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarListTodoSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M8 6h12M8 12h12M8 18h12\" />\n <rect {...iconProps} x=\"3\" y=\"4.5\" width=\"3\" height=\"3\" rx=\".75\" />\n <rect {...iconProps} x=\"3\" y=\"10.5\" width=\"3\" height=\"3\" rx=\".75\" />\n <rect {...iconProps} x=\"3\" y=\"16.5\" width=\"3\" height=\"3\" rx=\".75\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarListTreeSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M5 5h14M9 12h10M13 19h6\" />\n <path {...iconProps} d=\"M5 5v14h6\" />\n <path {...iconProps} d=\"M5 12h2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarLocateSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"12\" r=\"3\" />\n <path {...iconProps} d=\"M12 3v3M12 18v3M3 12h3M18 12h3\" />\n <path {...iconProps} d=\"M6 6l2 2M18 6l-2 2M6 18l2-2M18 18l-2-2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarLockKeyholeSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"5\" y=\"10\" width=\"14\" height=\"10\" rx=\"2\" />\n <path {...iconProps} d=\"M8 10V7a4 4 0 0 1 8 0v3\" />\n <path {...iconProps} d=\"M12 14v2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarLockSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"5\" y=\"10\" width=\"14\" height=\"10\" rx=\"2\" />\n <path {...iconProps} d=\"M8 10V7a4 4 0 0 1 8 0v3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarMailPlusSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" />\n <path {...iconProps} d=\"M3 8l9 6 9-6\" />\n <path {...iconProps} d=\"M18 3v6M15 6h6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarMapPinSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M12 21s6-5.4 6-11a6 6 0 1 0-12 0c0 5.6 6 11 6 11Z\"\n />\n <circle {...iconProps} cx=\"12\" cy=\"10\" r=\"2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarMapSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M9 18l-6 3V6l6-3 6 3 6-3v15l-6 3-6-3Z\" />\n <path {...iconProps} d=\"M9 3v15M15 6v15\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarMessagePlusSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M4 5h13a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H9l-5 4v-4a3 3 0 0 1-3-3V8a3 3 0 0 1 3-3Z\"\n />\n <path {...iconProps} d=\"M12 9v6M9 12h6\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarMessageTextSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M4 5h13a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H9l-5 4v-4a3 3 0 0 1-3-3V8a3 3 0 0 1 3-3Z\"\n />\n <path {...iconProps} d=\"M7 10h10M7 14h7\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarMessagesSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M4 5h13a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H9l-5 4v-4a3 3 0 0 1-3-3V8a3 3 0 0 1 3-3Z\"\n />\n <path {...iconProps} d=\"M8 10h8M8 14h5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarMonitorCheckSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\" />\n <path {...iconProps} d=\"M8 20h8M12 16v4\" />\n <path {...iconProps} d=\"M9 10l2 2 4-4\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarMouseClickSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M5 3l6 16 2-6 6-2L5 3Z\" />\n <path {...iconProps} d=\"M13 13l5 5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarNetworkSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"5\" r=\"2.5\" />\n <circle {...iconProps} cx=\"5\" cy=\"18\" r=\"2.5\" />\n <circle {...iconProps} cx=\"19\" cy=\"18\" r=\"2.5\" />\n <path {...iconProps} d=\"M11 7.5L6.2 15.8M13 7.5l4.8 8.3M7.5 18h9\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarPanelsSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n <path {...iconProps} d=\"M4 9h16M9 9v11\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarPenToolSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M12 3l7 7-7 11-7-11 7-7Z\" />\n <path {...iconProps} d=\"M12 3v8\" />\n <circle {...iconProps} cx=\"12\" cy=\"11\" r=\"2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarPinSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M14 3l7 7-4 1-4 6-2-2-5 5-2-2 5-5-2-2 6-4 1-4Z\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarPlayCircleSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"12\" r=\"9\" />\n <path {...iconProps} d=\"M10 8l6 4-6 4V8Z\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarRadarSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"12\" r=\"9\" />\n <path {...iconProps} d=\"M12 12l5-5\" />\n <path {...iconProps} d=\"M12 7a5 5 0 0 1 5 5\" />\n <path {...iconProps} d=\"M12 3v3M12 18v3M3 12h3M18 12h3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarReceiptSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M6 3l2 1.5L10 3l2 1.5L14 3l2 1.5L18 3v18l-2-1.5L14 21l-2-1.5L10 21l-2-1.5L6 21V3Z\"\n />\n <path {...iconProps} d=\"M9 9h6M9 13h6M9 17h4\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarRocketSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M5 15c2-6 6-10 14-10 0 8-4 12-10 14l-4-4Z\" />\n <path {...iconProps} d=\"M9 19l-4 2 2-4\" />\n <circle {...iconProps} cx=\"15\" cy=\"9\" r=\"1.5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarRouteSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"6\" cy=\"6\" r=\"2.5\" />\n <circle {...iconProps} cx=\"18\" cy=\"18\" r=\"2.5\" />\n <path {...iconProps} d=\"M8 6h5a3 3 0 0 1 0 6H11a3 3 0 0 0 0 6h4\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarScrollTextSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M8 4h10v15a2 2 0 0 1-2 2H7a3 3 0 0 0 3-3V6a2 2 0 0 0-4 0v1h2\"\n />\n <path {...iconProps} d=\"M11 8h4M11 12h4M11 16h3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarSearchCodeSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"10\" cy=\"10\" r=\"5\" />\n <path {...iconProps} d=\"M14 14l6 6\" />\n <path {...iconProps} d=\"M8 8l-2 2 2 2M12 8l2 2-2 2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarSearchSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"11\" cy=\"11\" r=\"6\" />\n <path {...iconProps} d=\"M16 16l4 4\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarSendSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M21 3L10 14\" />\n <path {...iconProps} d=\"M21 3l-7 18-4-7-7-4 18-7Z\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarShieldAlertSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M12 3l8 4v5c0 5-3.5 8-8 9-4.5-1-8-4-8-9V7l8-4Z\" />\n <path {...iconProps} d=\"M12 8v5\" />\n <path {...iconProps} d=\"M12 16h.01\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarShieldCheckSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M12 3l8 4v5c0 5-3.5 8-8 9-4.5-1-8-4-8-9V7l8-4Z\" />\n <path {...iconProps} d=\"M9 12l2 2 4-5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarShieldUserSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M12 3l8 4v5c0 5-3.5 8-8 9-4.5-1-8-4-8-9V7l8-4Z\" />\n <circle {...iconProps} cx=\"12\" cy=\"10\" r=\"2\" />\n <path {...iconProps} d=\"M8.5 16a4 4 0 0 1 7 0\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarStepForwardSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M5 5l8 7-8 7V5Z\" />\n <path {...iconProps} d=\"M17 5v14\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarStethoscopeSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M6 4v5a4 4 0 0 0 8 0V4\" />\n <path {...iconProps} d=\"M10 13v2a4 4 0 0 0 8 0v-1\" />\n <circle {...iconProps} cx=\"18\" cy=\"14\" r=\"2\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarTerminalSquareSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n <path {...iconProps} d=\"M8 10l3 2-3 2\" />\n <path {...iconProps} d=\"M13 15h3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarTestTubeSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M10 3h4\" />\n <path\n {...iconProps}\n d=\"M11 3v6l-5 8a3 3 0 0 0 2.5 4h7a3 3 0 0 0 2.5-4l-5-8V3\"\n />\n <path {...iconProps} d=\"M8 15h8\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarTrashSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M4 7h16\" />\n <path {...iconProps} d=\"M9 7V4h6v3\" />\n <path {...iconProps} d=\"M7 7l1 14h8l1-14\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarUploadCloudSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M7 18H6a4 4 0 0 1 0-8 6 6 0 0 1 11.5-2A4.5 4.5 0 0 1 18 18h-1\"\n />\n <path {...iconProps} d=\"M12 12v9\" />\n <path {...iconProps} d=\"M8.5 15.5L12 12l3.5 3.5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarUserCheckSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"9\" cy=\"8\" r=\"4\" />\n <path {...iconProps} d=\"M3 21a6 6 0 0 1 12 0\" />\n <path {...iconProps} d=\"M16 12l2 2 4-5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarUserCogSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"9\" cy=\"8\" r=\"4\" />\n <path {...iconProps} d=\"M3 21a6 6 0 0 1 10-4.5\" />\n <circle {...iconProps} cx=\"18\" cy=\"17\" r=\"2.5\" />\n <path {...iconProps} d=\"M18 13v1M18 20v1M14 17h1M21 17h1\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarUserSearchSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"9\" cy=\"8\" r=\"4\" />\n <path {...iconProps} d=\"M3 21a6 6 0 0 1 10-4.5\" />\n <circle {...iconProps} cx=\"17\" cy=\"17\" r=\"3\" />\n <path {...iconProps} d=\"M19.5 19.5L22 22\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarUserSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"12\" cy=\"8\" r=\"4\" />\n <path {...iconProps} d=\"M5 21a7 7 0 0 1 14 0\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarUsersSvg = createBackofficeSidebarIcon(\n <>\n <circle {...iconProps} cx=\"9\" cy=\"8\" r=\"4\" />\n <path {...iconProps} d=\"M3 21a6 6 0 0 1 12 0\" />\n <path {...iconProps} d=\"M16 11a3 3 0 1 0 0-6\" />\n <path {...iconProps} d=\"M18 21a5 5 0 0 0-3-4.5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarWalletSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M4 7h15a2 2 0 0 1 2 2v10H5a2 2 0 0 1-2-2V7a3 3 0 0 1 3-3h11\"\n />\n <path {...iconProps} d=\"M16 13h5\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarWandSvg = createBackofficeSidebarIcon(\n <>\n <path {...iconProps} d=\"M4 20L20 4\" />\n <path {...iconProps} d=\"M15 4l5 5\" />\n <path {...iconProps} d=\"M7 4v3M5.5 5.5h3M18 15v3M16.5 16.5h3\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarWorkflowSvg = createBackofficeSidebarIcon(\n <>\n <rect {...iconProps} x=\"3\" y=\"4\" width=\"6\" height=\"5\" rx=\"1.5\" />\n <rect {...iconProps} x=\"15\" y=\"15\" width=\"6\" height=\"5\" rx=\"1.5\" />\n <rect {...iconProps} x=\"3\" y=\"15\" width=\"6\" height=\"5\" rx=\"1.5\" />\n <path {...iconProps} d=\"M9 6.5h4a5 5 0 0 1 5 5V15\" />\n <path {...iconProps} d=\"M12 17.5H9\" />\n </>,\n);\n","import {\n createBackofficeSidebarIcon,\n iconProps,\n} from './createBackofficeSidebarIcon.js';\n\nexport const BackofficeSidebarWrenchSvg = createBackofficeSidebarIcon(\n <>\n <path\n {...iconProps}\n d=\"M14 7a5 5 0 0 0 6 6L11 22l-4-4 9-9a5 5 0 0 0-2-2Z\"\n />\n <path {...iconProps} d=\"M5 19l-2 2\" />\n </>,\n);\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const LockOpenSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"5\"\n y=\"11\"\n width=\"14\"\n height=\"10\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8 11V8a4 4 0 0 1 7.5-2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const LockSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"5\"\n y=\"11\"\n width=\"14\"\n height=\"10\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8 11V8a4 4 0 0 1 8 0v3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const MailCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"4\"\n y=\"6\"\n width=\"16\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 7.5 12 13l7.5-5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const MailXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"4\"\n y=\"6\"\n width=\"16\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 7.5 12 13l7.5-5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const PencilSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 640 640\"\n {...rest}\n >\n <path d=\"M505 122.9L517.1 135C526.5 144.4 526.5 159.6 517.1 168.9L488 198.1L441.9 152L471 122.9C480.4 113.5 495.6 113.5 504.9 122.9zM273.8 320.2L408 185.9L454.1 232L319.8 366.2C316.9 369.1 313.3 371.2 309.4 372.3L250.9 389L267.6 330.5C268.7 326.6 270.8 323 273.7 320.1zM437.1 89L239.8 286.2C231.1 294.9 224.8 305.6 221.5 317.3L192.9 417.3C190.5 425.7 192.8 434.7 199 440.9C205.2 447.1 214.2 449.4 222.6 447L322.6 418.4C334.4 415 345.1 408.7 353.7 400.1L551 202.9C579.1 174.8 579.1 129.2 551 101.1L538.9 89C510.8 60.9 465.2 60.9 437.1 89zM152 128C103.4 128 64 167.4 64 216L64 488C64 536.6 103.4 576 152 576L424 576C472.6 576 512 536.6 512 488L512 376C512 362.7 501.3 352 488 352C474.7 352 464 362.7 464 376L464 488C464 510.1 446.1 528 424 528L152 528C129.9 528 112 510.1 112 488L112 216C112 193.9 129.9 176 152 176L264 176C277.3 176 288 165.3 288 152C288 138.7 277.3 128 264 128L152 128z\" />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const PinFilledSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M8 3H16V5L14.5 7V12L18 15.5V17H6V15.5L9.5 12V7L8 5V3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 17V22\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default PinFilledSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const PinSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M8 3H16V5L14.5 7V12L18 15.5V17H6V15.5L9.5 12V7L8 5V3Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 17V22\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default PinSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ProfileDropdownOrganizationSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M20 21V19C20 17.9391 19.5786 16.9217 18.8284 16.1716C18.0783 15.4214 17.0609 15 16 15H8C6.93913 15 5.92172 15.4214 5.17157 16.1716C4.42143 16.9217 4 17.9391 4 19V21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 11C14.2091 11 16 9.20914 16 7C16 4.79086 14.2091 3 12 3C9.79086 3 8 4.79086 8 7C8 9.20914 9.79086 11 12 11Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RobotCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 3v3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"14\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <path\n d=\"M9.5 15h5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RobotSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 3v3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"14\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <path\n d=\"M9.5 15h5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RobotXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 3v3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"14\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <path\n d=\"M9.5 15h5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RocketOffSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M3 3l18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 2c3 2 5 5 5 9 0 3-1.2 5.7-3 7.5L12 21l-2-2.5C8.2 16.7 7 14 7 11c0-4 2-7 5-9z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7 12l-3 1 1-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M17 12l3 1-1-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 22c-1 0-2-.5-2-1.5 0-1 1-2.5 2-3 1 .5 2 2 2 3S13 22 12 22z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.5 10a1.5 1.5 0 012.6-1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default RocketOffSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RocketSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 2c3 2 5 5 5 9 0 3-1.2 5.7-3 7.5L12 21l-2-2.5C8.2 16.7 7 14 7 11c0-4 2-7 5-9z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7 12l-3 1 1-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M17 12l3 1-1-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 22c-1 0-2-.5-2-1.5 0-1 1-2.5 2-3 1 .5 2 2 2 3S13 22 12 22z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.5 10a1.5 1.5 0 103 0 1.5 1.5 0 00-3 0z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default RocketSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SendCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <line\n x1=\"22\"\n y1=\"2\"\n x2=\"11\"\n y2=\"13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <polygon\n points=\"22 2 15 22 11 13 2 9 22 2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SendMessageSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <line\n x1=\"22\"\n y1=\"2\"\n x2=\"11\"\n y2=\"13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <polygon\n points=\"22 2 15 22 11 13 2 9 22 2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SendXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <line\n x1=\"22\"\n y1=\"2\"\n x2=\"11\"\n y2=\"13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <polygon\n points=\"22 2 15 22 11 13 2 9 22 2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SettingsCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SettingsXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ShieldLockSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 2 20 6v6c0 5-3.5 9-8 10-4.5-1-8-5-8-10V6l8-4Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"9\"\n y=\"11\"\n width=\"6\"\n height=\"6\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.5 11v-1a1.5 1.5 0 0 1 3 0v1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ShieldOffSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 2 20 6v6c0 5-3.5 9-8 10-4.5-1-8-5-8-10V6l8-4Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4 4l16 16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const TaskAttachmentSvg = ({\n width = 18,\n height = 18,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M21.44 11.05L12.25 20.24C11.1242 21.3658 9.59718 21.9983 8.00498 21.9983C6.41278 21.9983 4.88581 21.3658 3.75998 20.24C2.63416 19.1142 2.00164 17.5872 2.00164 15.995C2.00164 14.4028 2.63416 12.8758 3.75998 11.75L12.33 3.18C13.0806 2.42938 14.0973 2.00548 15.1575 2.00548C16.2177 2.00548 17.2344 2.42938 17.985 3.18C18.7356 3.93062 19.1595 4.94734 19.1595 6.0075C19.1595 7.06766 18.7356 8.08438 17.985 8.835L9.40998 17.41C9.03467 17.7853 8.52631 17.9972 7.99623 17.9972C7.46616 17.9972 6.95779 17.7853 6.58248 17.41C6.20717 17.0347 5.99522 16.5263 5.99522 15.9962C5.99522 15.4662 6.20717 14.9578 6.58248 14.5825L15.07 6.1\"\n stroke=\"black\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const TaskCommentBubbleSvg = ({\n width = 14,\n height = 14,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const TaskDependencyBlockedSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M18.364 5.636A9 9 0 105.636 18.364 9 9 0 0018.364 5.636z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 9l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default TaskDependencyBlockedSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const TaskDependencyReadySvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M9 12l2 2 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 21a9 9 0 100-18 9 9 0 000 18z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default TaskDependencyReadySvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const WrenchSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M14 7a5 5 0 0 0-6 6l-4 4 3 3 4-4a5 5 0 0 0 6-6l-3 3-3-3 3-3Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const XBadgeSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M22 11.08V12C21.9988 14.1564 21.3005 16.2547 20.0093 17.9818C18.7182 19.709 16.9033 20.9725 14.8354 21.5839C12.7674 22.1953 10.5573 22.1219 8.53447 21.3746C6.51168 20.6273 4.78465 19.2461 3.61096 17.4371C2.43727 15.628 1.87979 13.4881 2.02168 11.3363C2.16356 9.18457 2.99721 7.13633 4.39828 5.49707C5.79935 3.85782 7.69279 2.71538 9.79619 2.24015C11.8996 1.76491 14.1003 1.98234 16.07 2.86\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 9 5 5m0-5-5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\nimport { ChevronDownSvg } from '../icons/ChevronDownSvg.js';\n\ntype Props = {\n size?: number;\n className?: string;\n};\n\nexport const ChevronDownIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <ChevronDownSvg width={size} height={size} className={className} />;\n};\n\nexport default ChevronDownIcon;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}