@12-apps/ui 6.37.0 → 6.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +4 -4
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +40 -40
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +48 -49
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +4 -5
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +4 -5
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +5 -6
- package/dist/_internal/components/data-display/DataViews/base-card.js +4 -5
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +4 -4
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +7 -8
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-empty.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +14 -14
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +37 -37
- package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +14 -14
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +11 -11
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +12 -12
- package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +17 -17
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +14 -15
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +16 -16
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +2 -2
- package/dist/_internal/components/data-display/DataViews/save-view-preview.js +2 -2
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +4 -4
- package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +4 -4
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +5 -5
- package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +3 -3
- package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
- package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
- package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
- package/dist/_internal/components/data-display/index.js +11 -11
- package/dist/_internal/components/feedback/Dialog/Dialog.js +3 -3
- package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +2 -2
- package/dist/_internal/components/feedback/Modal/Modal.js +3 -2
- package/dist/_internal/components/feedback/Modal/Modal.styles.js +2 -1
- package/dist/_internal/components/feedback/Sonner/Sonner.js +2 -2
- package/dist/_internal/components/feedback/Sonner/SonnerToast.js +1 -1
- package/dist/_internal/components/feedback/StackedModal/StackedModal.js +4 -3
- package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js +3 -2
- package/dist/_internal/components/feedback/StackedModal/StackedModal.styles.js +2 -1
- package/dist/_internal/components/feedback/Toast/Toast.js +2 -1
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.geometry.js +1 -1
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.hooks.js +3 -2
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +5 -4
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialStepBody.js +2 -1
- package/dist/_internal/components/feedback/index.js +14 -15
- package/dist/_internal/components/form/total-form/FormErrorSnackbar.js +3 -2
- package/dist/_internal/components/index.js +83 -84
- package/dist/_internal/components/layout/Accordion/Accordion.js +3 -2
- package/dist/_internal/components/layout/Accordion/Accordion.styles.js +2 -1
- package/dist/_internal/components/layout/Box/Box.js +1 -1
- package/dist/_internal/components/layout/Card/Card.js +3 -3
- package/dist/_internal/components/layout/Card/Card.styles.js +2 -2
- package/dist/_internal/components/layout/Collapsible/Collapsible.helpers.js +2 -1
- package/dist/_internal/components/layout/Collapsible/Collapsible.js +3 -2
- package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/ContentToolbar.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +1 -1
- package/dist/_internal/components/layout/Dashboard/Dashboard.js +2 -2
- package/dist/_internal/components/layout/Dashboard/DashboardParts.js +1 -1
- package/dist/_internal/components/layout/Drawer/Drawer.js +2 -1
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +5 -4
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.styles.js +6 -3
- package/dist/_internal/components/layout/ScrollArea/ScrollAreaContent.js +2 -1
- package/dist/_internal/components/layout/ScrollArea/ScrollViewport.js +3 -2
- package/dist/_internal/components/layout/Separator/Separator.js +4 -2
- package/dist/_internal/components/layout/Separator/Separator.styles.js +3 -1
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.items.js +3 -3
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +8 -8
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.rail.js +4 -4
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.styles.js +6 -5
- package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +5 -5
- package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +3 -3
- package/dist/_internal/components/layout/SettingsLayout/SettingsSectionHeader.js +2 -2
- package/dist/_internal/components/layout/SettingsLayout/SettingsStatusMarker.js +2 -2
- package/dist/_internal/components/layout/Sidebar/Sidebar.js +2 -1
- package/dist/_internal/components/layout/Skeleton/Skeleton.js +3 -2
- package/dist/_internal/components/layout/Skeleton/Skeleton.styles.js +6 -3
- package/dist/_internal/components/layout/Spacer/Spacer.js +2 -1
- package/dist/_internal/components/layout/Stack/Stack.js +2 -2
- package/dist/_internal/components/layout/TableFilter/TableFilter.js +1 -1
- package/dist/_internal/components/layout/index.js +27 -28
- package/dist/_internal/components/navigation/AppHeader/AppHeader.brand.js +1 -1
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +3 -4
- package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +2 -2
- package/dist/_internal/components/navigation/AppHeader/AppHeader.js +1 -1
- package/dist/_internal/components/navigation/Breadcrumbs/BreadcrumbEntry.js +2 -2
- package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.js +3 -3
- package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.styles.js +1 -1
- package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +3 -3
- package/dist/_internal/components/navigation/CommandPalette/CommandPaletteResults.js +2 -2
- package/dist/_internal/components/navigation/CommandPalette/ShortcutChip.js +1 -1
- package/dist/_internal/components/navigation/ContextMenu/ContextMenu.js +1 -1
- package/dist/_internal/components/navigation/DropdownMenu/DropdownMenu.js +1 -1
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +4 -4
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +6 -6
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.shell.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.styles.js +1 -1
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +4 -4
- package/dist/_internal/components/navigation/Pagination/Pagination.js +3 -3
- package/dist/_internal/components/navigation/Pagination/Pagination.styles.js +1 -1
- package/dist/_internal/components/navigation/Pagination/PaginationParts.js +2 -1
- package/dist/_internal/components/navigation/Tabs/Tabs.js +10 -3
- package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +8 -1
- package/dist/_internal/components/navigation/Tabs/TabsPanel.js +2 -1
- package/dist/_internal/components/navigation/index.js +26 -27
- package/dist/_internal/components/typography/Blockquote/Blockquote.js +1 -1
- package/dist/_internal/components/typography/Code/Code.js +1 -1
- package/dist/_internal/components/typography/Text/Text.js +1 -1
- package/dist/_internal/components/typography/index.js +3 -3
- package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.animations.js +2 -1
- package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.js +3 -3
- package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.styles.js +2 -2
- package/dist/_internal/components/utility/AspectRatio/AspectRatio.js +2 -1
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +3 -3
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +1 -1
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +2 -2
- package/dist/_internal/components/utility/index.js +7 -7
- package/dist/_internal/social-login-button/social-login-button.js +6 -7
- package/dist/_internal/tokens/shadow.js +19 -8
- package/dist/_internal/tokens/shadow.js.map +1 -1
- package/dist/_internal/user-avatar/user-avatar.js +4 -5
- package/dist/{chunk-BLJDCMFU.js → chunk-2ARVNCVU.js} +7 -7
- package/dist/chunk-2ARVNCVU.js.map +1 -0
- package/dist/{chunk-SJO3K7SB.js → chunk-2OYFTSG4.js} +4 -4
- package/dist/{chunk-CRZXSZ5O.js → chunk-2S752BIJ.js} +2 -2
- package/dist/{chunk-IYTBTK2M.js → chunk-2WU52FLP.js} +19 -30
- package/dist/chunk-2WU52FLP.js.map +1 -0
- package/dist/{chunk-RSQMPCCR.js → chunk-34643ATX.js} +10 -4
- package/dist/chunk-34643ATX.js.map +1 -0
- package/dist/{chunk-6GRZ77IS.js → chunk-3AIRFAI3.js} +13 -12
- package/dist/chunk-3AIRFAI3.js.map +1 -0
- package/dist/{chunk-Q73PTVNO.js → chunk-3FNXOCBD.js} +24 -12
- package/dist/chunk-3FNXOCBD.js.map +1 -0
- package/dist/{chunk-BAQBUKDU.js → chunk-3KREF4ZF.js} +2 -2
- package/dist/{chunk-EL7CMURV.js → chunk-3LSIFHQK.js} +3 -3
- package/dist/chunk-3LSIFHQK.js.map +1 -0
- package/dist/{chunk-MP4VSWHK.js → chunk-3NJMNMWB.js} +12 -2
- package/dist/chunk-3NJMNMWB.js.map +1 -0
- package/dist/{chunk-N52O2OKZ.js → chunk-3NNO6YIH.js} +8 -3
- package/dist/chunk-3NNO6YIH.js.map +1 -0
- package/dist/{chunk-SYN46YL6.js → chunk-3RMDIO4G.js} +3 -3
- package/dist/{chunk-MJ3BVWPZ.js → chunk-43G3WMYN.js} +12 -7
- package/dist/chunk-43G3WMYN.js.map +1 -0
- package/dist/{chunk-E7MSDXED.js → chunk-43H66TVT.js} +12 -5
- package/dist/chunk-43H66TVT.js.map +1 -0
- package/dist/{chunk-IL7JZKXY.js → chunk-442FSG7G.js} +3 -3
- package/dist/{chunk-DYVAOEW4.js → chunk-4D4LLSQC.js} +6 -5
- package/dist/chunk-4D4LLSQC.js.map +1 -0
- package/dist/{chunk-NEGCJNGJ.js → chunk-4G47KBTP.js} +9 -9
- package/dist/chunk-4G47KBTP.js.map +1 -0
- package/dist/{chunk-MVXFMIVZ.js → chunk-4GB46HLK.js} +8 -4
- package/dist/chunk-4GB46HLK.js.map +1 -0
- package/dist/{chunk-CS3KOKL3.js → chunk-4GWHYLEB.js} +2 -2
- package/dist/{chunk-4OEKIFBC.js → chunk-4VMFS3VJ.js} +6 -3
- package/dist/chunk-4VMFS3VJ.js.map +1 -0
- package/dist/{chunk-6CTPDNNX.js → chunk-52G2KRL4.js} +14 -14
- package/dist/chunk-52G2KRL4.js.map +1 -0
- package/dist/{chunk-E7T3A4IR.js → chunk-5JCGBCFJ.js} +2 -2
- package/dist/{chunk-FC7NQ6XM.js → chunk-5MW7OYBM.js} +2 -2
- package/dist/{chunk-CQLPDY2J.js → chunk-5OBXEMQO.js} +3 -3
- package/dist/{chunk-MK4CH4VT.js → chunk-5OUEKIWQ.js} +14 -12
- package/dist/chunk-5OUEKIWQ.js.map +1 -0
- package/dist/{chunk-GHXFCMFP.js → chunk-5QAJ3Y5F.js} +3 -3
- package/dist/{chunk-GHXFCMFP.js.map → chunk-5QAJ3Y5F.js.map} +1 -1
- package/dist/{chunk-CPTY6UZ6.js → chunk-6KEXHOIF.js} +5 -4
- package/dist/chunk-6KEXHOIF.js.map +1 -0
- package/dist/{chunk-BW62QQAG.js → chunk-6N4AA2Y7.js} +2 -2
- package/dist/{chunk-EFHIMCJN.js → chunk-6P2OFMBX.js} +11 -9
- package/dist/chunk-6P2OFMBX.js.map +1 -0
- package/dist/{chunk-GUW5BUK7.js → chunk-6WBKOM5K.js} +15 -7
- package/dist/chunk-6WBKOM5K.js.map +1 -0
- package/dist/{chunk-7EIOXZWL.js → chunk-74P3YX7R.js} +4 -4
- package/dist/{chunk-VYSFKR32.js → chunk-75CGLX6Q.js} +3 -3
- package/dist/{chunk-VYSFKR32.js.map → chunk-75CGLX6Q.js.map} +1 -1
- package/dist/{chunk-LVEG6XQL.js → chunk-76X6JRVI.js} +19 -33
- package/dist/chunk-76X6JRVI.js.map +1 -0
- package/dist/{chunk-2NLYGZP3.js → chunk-77JL5XVD.js} +13 -9
- package/dist/chunk-77JL5XVD.js.map +1 -0
- package/dist/{chunk-T3WHW7ZC.js → chunk-BAZXVFLR.js} +10 -6
- package/dist/chunk-BAZXVFLR.js.map +1 -0
- package/dist/{chunk-7F7TTOYN.js → chunk-BEGTLELZ.js} +7 -6
- package/dist/chunk-BEGTLELZ.js.map +1 -0
- package/dist/{chunk-VT5HQ2AD.js → chunk-BFMDA6UO.js} +3 -3
- package/dist/{chunk-R75DZ3AK.js → chunk-BVLMKSHX.js} +2 -2
- package/dist/{chunk-PMP6WJJS.js → chunk-BWMHGENX.js} +20 -19
- package/dist/chunk-BWMHGENX.js.map +1 -0
- package/dist/{chunk-QAP3FW33.js → chunk-C66RGVAS.js} +30 -20
- package/dist/chunk-C66RGVAS.js.map +1 -0
- package/dist/{chunk-UZ6AUTE6.js → chunk-CNQUCNEA.js} +7 -7
- package/dist/{chunk-JL75FJRG.js → chunk-CZIX4BW2.js} +4 -4
- package/dist/{chunk-CAHWCSRE.js → chunk-D46SLMCX.js} +22 -8
- package/dist/chunk-D46SLMCX.js.map +1 -0
- package/dist/{chunk-2OIP3T5O.js → chunk-DBFRCTI5.js} +4 -4
- package/dist/{chunk-2OIP3T5O.js.map → chunk-DBFRCTI5.js.map} +1 -1
- package/dist/{chunk-HU7TX7RB.js → chunk-DUBTI4DI.js} +4 -4
- package/dist/{chunk-RMCNEKBZ.js → chunk-DW6F7354.js} +2 -2
- package/dist/{chunk-Q4BQYYPU.js → chunk-E2QIKJX2.js} +11 -5
- package/dist/chunk-E2QIKJX2.js.map +1 -0
- package/dist/{chunk-XJUEHG72.js → chunk-EERUSI52.js} +2 -2
- package/dist/{chunk-NPP44TQG.js → chunk-EYZ6QBTV.js} +2 -2
- package/dist/{chunk-NPP44TQG.js.map → chunk-EYZ6QBTV.js.map} +1 -1
- package/dist/{chunk-C55AWF3U.js → chunk-FFCJ7NR2.js} +2 -2
- package/dist/{chunk-U342T7ZR.js → chunk-FOCU4QT5.js} +13 -10
- package/dist/chunk-FOCU4QT5.js.map +1 -0
- package/dist/{chunk-FYTLKHEN.js → chunk-FYKFQPVT.js} +19 -18
- package/dist/chunk-FYKFQPVT.js.map +1 -0
- package/dist/{chunk-TVL5V2JK.js → chunk-GGMB6LJH.js} +7 -3
- package/dist/chunk-GGMB6LJH.js.map +1 -0
- package/dist/{chunk-AYLEZM6T.js → chunk-GLFTIGOF.js} +3 -3
- package/dist/{chunk-7UZ2TFIK.js → chunk-GNCSDUGY.js} +12 -4
- package/dist/chunk-GNCSDUGY.js.map +1 -0
- package/dist/{chunk-L4UP5VYS.js → chunk-GVH7C2PT.js} +2 -2
- package/dist/{chunk-MBSYD3ZU.js → chunk-GWFAINQ7.js} +3 -3
- package/dist/chunk-GWFAINQ7.js.map +1 -0
- package/dist/{chunk-AER4245J.js → chunk-H67EL3CG.js} +6 -6
- package/dist/{chunk-3D6HXKZM.js → chunk-HDJQDMHB.js} +18 -13
- package/dist/chunk-HDJQDMHB.js.map +1 -0
- package/dist/{chunk-57JLS55D.js → chunk-I4QA2F4L.js} +4 -4
- package/dist/{chunk-L7SFH3ED.js → chunk-I7GSRTGQ.js} +37 -28
- package/dist/chunk-I7GSRTGQ.js.map +1 -0
- package/dist/{chunk-Q4CAZ2TP.js → chunk-IG23YZZR.js} +6 -5
- package/dist/chunk-IG23YZZR.js.map +1 -0
- package/dist/{chunk-5W4BLTDI.js → chunk-IWFENXST.js} +7 -6
- package/dist/chunk-IWFENXST.js.map +1 -0
- package/dist/{chunk-HXEBKOSM.js → chunk-J5UZB6Y6.js} +2 -2
- package/dist/chunk-J5UZB6Y6.js.map +1 -0
- package/dist/{chunk-AJ5SDHX5.js → chunk-JCL7WK4G.js} +2 -2
- package/dist/{chunk-5CKDRLRN.js → chunk-JXECOCNA.js} +35 -19
- package/dist/chunk-JXECOCNA.js.map +1 -0
- package/dist/{chunk-WUTHROII.js → chunk-JYWF76Z5.js} +11 -5
- package/dist/chunk-JYWF76Z5.js.map +1 -0
- package/dist/{chunk-B76QCDCE.js → chunk-K4L42FF6.js} +6 -3
- package/dist/chunk-K4L42FF6.js.map +1 -0
- package/dist/{chunk-WE3LJPRN.js → chunk-KE473LK6.js} +2 -2
- package/dist/{chunk-TBF2CPJW.js → chunk-KIHGTL2D.js} +21 -11
- package/dist/chunk-KIHGTL2D.js.map +1 -0
- package/dist/{chunk-3T5Z5HXF.js → chunk-KM3Y5TCG.js} +40 -36
- package/dist/chunk-KM3Y5TCG.js.map +1 -0
- package/dist/{chunk-RWTFZ7J5.js → chunk-L4G5BZFF.js} +22 -13
- package/dist/chunk-L4G5BZFF.js.map +1 -0
- package/dist/{chunk-HB7ISSLK.js → chunk-L5RQIQIP.js} +26 -22
- package/dist/chunk-L5RQIQIP.js.map +1 -0
- package/dist/{chunk-CQPFSEJB.js → chunk-L7NQCLFU.js} +2 -2
- package/dist/{chunk-2ZIHZLF5.js → chunk-M2JTIH5M.js} +3 -3
- package/dist/{chunk-OATHOXIU.js → chunk-MC4KYGSX.js} +8 -8
- package/dist/chunk-MC4KYGSX.js.map +1 -0
- package/dist/{chunk-2BIVCYTO.js → chunk-MR2HKBHS.js} +4 -4
- package/dist/{chunk-YVUD3MY4.js → chunk-N23GCN5U.js} +7 -4
- package/dist/chunk-N23GCN5U.js.map +1 -0
- package/dist/{chunk-2TJOCI54.js → chunk-NCEQWEXT.js} +3 -3
- package/dist/{chunk-2TJOCI54.js.map → chunk-NCEQWEXT.js.map} +1 -1
- package/dist/{chunk-IVIHRZEY.js → chunk-NDMPXMW2.js} +12 -8
- package/dist/chunk-NDMPXMW2.js.map +1 -0
- package/dist/{chunk-UUUMNJPP.js → chunk-NLYNRE7L.js} +10 -10
- package/dist/chunk-NLYNRE7L.js.map +1 -0
- package/dist/{chunk-KLWW67WP.js → chunk-NOKN4HRK.js} +12 -11
- package/dist/chunk-NOKN4HRK.js.map +1 -0
- package/dist/{chunk-LIG7TKIB.js → chunk-NYFNF7I5.js} +11 -6
- package/dist/chunk-NYFNF7I5.js.map +1 -0
- package/dist/{chunk-KK57AHWS.js → chunk-OAEYCKBN.js} +2 -2
- package/dist/{chunk-JGRE56GQ.js → chunk-OB56SZGL.js} +2 -2
- package/dist/{chunk-VRDNUY4H.js → chunk-OHC3F7GJ.js} +4 -4
- package/dist/chunk-OHC3F7GJ.js.map +1 -0
- package/dist/{chunk-E4TNDTWV.js → chunk-OL2BEJZR.js} +2 -2
- package/dist/{chunk-NDNYD4FG.js → chunk-OS6KPL4D.js} +4 -4
- package/dist/{chunk-ZTYUKEN3.js → chunk-OVXSQQDK.js} +12 -7
- package/dist/chunk-OVXSQQDK.js.map +1 -0
- package/dist/{chunk-ZQL5RXVE.js → chunk-PA3AA55Q.js} +2 -2
- package/dist/{chunk-ZQL5RXVE.js.map → chunk-PA3AA55Q.js.map} +1 -1
- package/dist/{chunk-75LOTMSN.js → chunk-PPRV4LTM.js} +2 -2
- package/dist/{chunk-LT4NEKXB.js → chunk-QA2ZGCRL.js} +3 -3
- package/dist/{chunk-2E2WOBID.js → chunk-QGFBIUOK.js} +5 -5
- package/dist/chunk-QGFBIUOK.js.map +1 -0
- package/dist/{chunk-ROT57BP4.js → chunk-R2XVTUVR.js} +2 -2
- package/dist/{chunk-QEG3P5D4.js → chunk-R6SN73RX.js} +10 -10
- package/dist/{chunk-MVKYNDT2.js → chunk-RKROWJVF.js} +11 -9
- package/dist/chunk-RKROWJVF.js.map +1 -0
- package/dist/{chunk-NYZO3JNB.js → chunk-RXJQA3FQ.js} +2 -3
- package/dist/chunk-RXJQA3FQ.js.map +1 -0
- package/dist/{chunk-IKLOIONQ.js → chunk-RZYSKQTS.js} +3 -3
- package/dist/{chunk-NCPWLHZT.js → chunk-SKT2V2OX.js} +3 -3
- package/dist/{chunk-EOW2ECB3.js → chunk-SNURSSTN.js} +2 -2
- package/dist/{chunk-GRDPGHQJ.js → chunk-SV6JGFHG.js} +9 -5
- package/dist/chunk-SV6JGFHG.js.map +1 -0
- package/dist/{chunk-CZBND7AY.js → chunk-T7DE44SP.js} +2 -2
- package/dist/{chunk-DB2ZFZVW.js → chunk-TKC6WHGB.js} +2 -2
- package/dist/{chunk-3CVTQZQJ.js → chunk-TNYKM4UU.js} +13 -9
- package/dist/chunk-TNYKM4UU.js.map +1 -0
- package/dist/{chunk-3VMGE7CU.js → chunk-TZFBJ47T.js} +3 -3
- package/dist/chunk-TZFBJ47T.js.map +1 -0
- package/dist/{chunk-VFHGILXI.js → chunk-U3DBQXPI.js} +20 -17
- package/dist/chunk-U3DBQXPI.js.map +1 -0
- package/dist/{chunk-JLQGRZMN.js → chunk-UEVHI62V.js} +2 -2
- package/dist/{chunk-4CXEWFKO.js → chunk-UFJYJHQI.js} +2 -2
- package/dist/{chunk-QKPD322X.js → chunk-UFNIS7KC.js} +2 -2
- package/dist/chunk-UFNIS7KC.js.map +1 -0
- package/dist/{chunk-BNEWMFVB.js → chunk-UGGJ3KDT.js} +2 -2
- package/dist/{chunk-L4QCIUTJ.js → chunk-UMNXSQ7I.js} +3 -3
- package/dist/{chunk-L4QCIUTJ.js.map → chunk-UMNXSQ7I.js.map} +1 -1
- package/dist/{chunk-2CTTASUD.js → chunk-V5EWCJBT.js} +7 -4
- package/dist/chunk-V5EWCJBT.js.map +1 -0
- package/dist/{chunk-236V2GRH.js → chunk-VCBV5JM7.js} +49 -41
- package/dist/chunk-VCBV5JM7.js.map +1 -0
- package/dist/{chunk-KREWQAEV.js → chunk-VIRYHNEM.js} +2 -2
- package/dist/{chunk-PT2XADGH.js → chunk-VPRNKJHP.js} +9 -6
- package/dist/chunk-VPRNKJHP.js.map +1 -0
- package/dist/{chunk-JXUWWPZR.js → chunk-VQYR64QB.js} +14 -8
- package/dist/chunk-VQYR64QB.js.map +1 -0
- package/dist/{chunk-72DKEBJM.js → chunk-VRPREI27.js} +3 -3
- package/dist/chunk-VRPREI27.js.map +1 -0
- package/dist/{chunk-N6CSXHFJ.js → chunk-WN5PNP6F.js} +2 -2
- package/dist/{chunk-6QLPSMTA.js → chunk-XEWMY4ZM.js} +52 -47
- package/dist/chunk-XEWMY4ZM.js.map +1 -0
- package/dist/{chunk-XR46FSOH.js → chunk-XIG3DXXX.js} +2 -2
- package/dist/{chunk-35S6QI5G.js → chunk-XJJXBUPN.js} +2 -2
- package/dist/{chunk-GHTBUJ6E.js → chunk-XRUW7DMH.js} +2 -2
- package/dist/{chunk-CSTAQX2B.js → chunk-XWZJLXJT.js} +7 -6
- package/dist/chunk-XWZJLXJT.js.map +1 -0
- package/dist/{chunk-MBC55H6M.js → chunk-Y5UTYBZW.js} +12 -6
- package/dist/chunk-Y5UTYBZW.js.map +1 -0
- package/dist/{chunk-HNPWZ3W2.js → chunk-Y7F5JBAT.js} +4 -4
- package/dist/{chunk-WTOYEWW6.js → chunk-YBH4SPMM.js} +4 -3
- package/dist/chunk-YBH4SPMM.js.map +1 -0
- package/dist/{chunk-5QWQR7XT.js → chunk-YHGOPZXW.js} +11 -8
- package/dist/chunk-YHGOPZXW.js.map +1 -0
- package/dist/{chunk-6BDYC4RA.js → chunk-YRSR5LVZ.js} +3 -3
- package/dist/{chunk-57JY4OI2.js → chunk-YUXDVW62.js} +3 -3
- package/dist/chunk-YUXDVW62.js.map +1 -0
- package/dist/{chunk-RNEYZTE4.js → chunk-Z6MCTGIK.js} +2 -2
- package/dist/{chunk-RNEYZTE4.js.map → chunk-Z6MCTGIK.js.map} +1 -1
- package/dist/{chunk-FFOQZRFC.js → chunk-ZAY6OA6F.js} +2 -2
- package/dist/data-display/AsyncStateContainer.js +4 -4
- package/dist/data-display/CardKit.js +2 -2
- package/dist/data-display/DataViews.js +55 -56
- package/dist/data-display/DescriptionItem.js +2 -2
- package/dist/data-display/FleetMap.js +5 -5
- package/dist/data-display/LazyImage.js +3 -3
- package/dist/data-display/LoadingState.js +3 -3
- package/dist/data-display/StatCard.js +3 -3
- package/dist/feedback/Dialog.js +3 -3
- package/dist/feedback/Modal.js +3 -2
- package/dist/feedback/Sonner.js +2 -2
- package/dist/feedback/StackedModal.js +4 -3
- package/dist/feedback/Toast.js +2 -1
- package/dist/feedback/TutorialOverlay.js +5 -4
- package/dist/form/total-form.js +2 -2
- package/dist/layout/Accordion.js +3 -2
- package/dist/layout/Box.js +1 -1
- package/dist/layout/Card.js +3 -3
- package/dist/layout/Collapsible.js +3 -2
- package/dist/layout/ContentToolbar.js +7 -7
- package/dist/layout/Dashboard.js +2 -2
- package/dist/layout/Drawer.js +2 -1
- package/dist/layout/ScrollArea.js +5 -4
- package/dist/layout/Separator.js +4 -2
- package/dist/layout/SettingsLayout.js +8 -8
- package/dist/layout/Sidebar.js +2 -1
- package/dist/layout/Skeleton.js +3 -2
- package/dist/layout/Spacer.js +2 -1
- package/dist/layout/Stack.js +2 -2
- package/dist/layout/TableFilter.js +1 -1
- package/dist/navigation/AppHeader.js +6 -7
- package/dist/navigation/Breadcrumbs.js +3 -3
- package/dist/navigation/CommandPalette.js +3 -3
- package/dist/navigation/ContextMenu.js +1 -1
- package/dist/navigation/DropdownMenu.js +1 -1
- package/dist/navigation/NavigationMenu.js +6 -6
- package/dist/navigation/Pagination.js +3 -3
- package/dist/navigation/Tabs.js +10 -3
- package/dist/social-login-button.js +6 -7
- package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts.map +1 -1
- package/dist/types/components/feedback/Modal/Modal.d.ts.map +1 -1
- package/dist/types/components/feedback/Modal/Modal.styles.d.ts.map +1 -1
- package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
- package/dist/types/components/feedback/StackedModal/StackedModal.styles.d.ts.map +1 -1
- package/dist/types/components/feedback/Toast/Toast.d.ts.map +1 -1
- package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.d.ts.map +1 -1
- package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.geometry.d.ts +3 -1
- package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.geometry.d.ts.map +1 -1
- package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.hooks.d.ts.map +1 -1
- package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts.map +1 -1
- package/dist/types/components/layout/Accordion/Accordion.d.ts.map +1 -1
- package/dist/types/components/layout/Accordion/Accordion.styles.d.ts.map +1 -1
- package/dist/types/components/layout/Box/Box.d.ts +2 -1
- package/dist/types/components/layout/Box/Box.d.ts.map +1 -1
- package/dist/types/components/layout/Card/Card.styles.d.ts.map +1 -1
- package/dist/types/components/layout/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/types/components/layout/Collapsible/Collapsible.helpers.d.ts +1 -1
- package/dist/types/components/layout/Collapsible/Collapsible.helpers.d.ts.map +1 -1
- package/dist/types/components/layout/Drawer/Drawer.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.styles.d.ts +6 -0
- package/dist/types/components/layout/ScrollArea/ScrollArea.styles.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts.map +1 -1
- package/dist/types/components/layout/Separator/Separator.d.ts.map +1 -1
- package/dist/types/components/layout/Separator/Separator.styles.d.ts +7 -4
- package/dist/types/components/layout/Separator/Separator.styles.d.ts.map +1 -1
- package/dist/types/components/layout/SettingsLayout/SettingsLayout.items.d.ts.map +1 -1
- package/dist/types/components/layout/SettingsLayout/SettingsLayout.rail.d.ts.map +1 -1
- package/dist/types/components/layout/SettingsLayout/SettingsLayout.styles.d.ts +4 -4
- package/dist/types/components/layout/SettingsLayout/SettingsLayout.styles.d.ts.map +1 -1
- package/dist/types/components/layout/Sidebar/Sidebar.d.ts.map +1 -1
- package/dist/types/components/layout/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/types/components/layout/Skeleton/Skeleton.styles.d.ts +8 -1
- package/dist/types/components/layout/Skeleton/Skeleton.styles.d.ts.map +1 -1
- package/dist/types/components/layout/Spacer/Spacer.d.ts.map +1 -1
- package/dist/types/components/layout/TableFilter/TableFilter.d.ts.map +1 -1
- package/dist/types/components/navigation/AppHeader/AppHeader.d.ts.map +1 -1
- package/dist/types/components/navigation/AppHeader/AppHeader.details.d.ts.map +1 -1
- package/dist/types/components/navigation/AppHeader/AppHeader.identity.d.ts.map +1 -1
- package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.styles.d.ts +2 -2
- package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.styles.d.ts.map +1 -1
- package/dist/types/components/navigation/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/types/components/navigation/NavigationMenu/NavigationMegaSection.d.ts.map +1 -1
- package/dist/types/components/navigation/NavigationMenu/NavigationMenu.d.ts.map +1 -1
- package/dist/types/components/navigation/NavigationMenu/NavigationMenu.shell.d.ts.map +1 -1
- package/dist/types/components/navigation/NavigationMenu/NavigationMenu.styles.d.ts +2 -2
- package/dist/types/components/navigation/NavigationMenu/NavigationMenu.styles.d.ts.map +1 -1
- package/dist/types/components/navigation/NavigationMenu/NavigationStandardBody.d.ts.map +1 -1
- package/dist/types/components/navigation/Pagination/Pagination.d.ts.map +1 -1
- package/dist/types/components/navigation/Pagination/PaginationParts.d.ts.map +1 -1
- package/dist/types/components/navigation/Tabs/Tabs.d.ts.map +1 -1
- package/dist/types/components/navigation/Tabs/Tabs.styles.d.ts.map +1 -1
- package/dist/types/components/navigation/Tabs/TabsPanel.d.ts.map +1 -1
- package/dist/types/components/utility/AnimatedIcon/AnimatedIcon.animations.d.ts +9 -8
- package/dist/types/components/utility/AnimatedIcon/AnimatedIcon.animations.d.ts.map +1 -1
- package/dist/types/components/utility/AnimatedIcon/AnimatedIcon.styles.d.ts +1 -1
- package/dist/types/components/utility/AnimatedIcon/AnimatedIcon.styles.d.ts.map +1 -1
- package/dist/types/components/utility/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/types/social-login-button/social-login-button.d.ts.map +1 -1
- package/dist/typography/Blockquote.js +1 -1
- package/dist/typography/Code.js +1 -1
- package/dist/typography/Text.js +1 -1
- package/dist/user-avatar.js +4 -5
- package/dist/utility/AnimatedIcon.js +3 -3
- package/dist/utility/AspectRatio.js +2 -1
- package/dist/utility/WorkflowStep.js +3 -3
- package/package.json +1 -1
- package/src/components/feedback/Dialog/Dialog.styles.ts +16 -28
- package/src/components/feedback/Modal/Modal.styles.ts +9 -8
- package/src/components/feedback/Modal/Modal.tsx +3 -2
- package/src/components/feedback/Sonner/Sonner.tsx +4 -4
- package/src/components/feedback/Sonner/SonnerToast.tsx +9 -9
- package/src/components/feedback/StackedModal/StackedModal.parts.tsx +26 -19
- package/src/components/feedback/StackedModal/StackedModal.styles.ts +11 -9
- package/src/components/feedback/Toast/Toast.tsx +11 -7
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.geometry.ts +2 -3
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.hooks.ts +6 -1
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +43 -37
- package/src/components/feedback/TutorialOverlay/TutorialStepBody.tsx +3 -2
- package/src/components/layout/Accordion/Accordion.styles.ts +8 -6
- package/src/components/layout/Accordion/Accordion.tsx +10 -8
- package/src/components/layout/Box/Box.tsx +18 -5
- package/src/components/layout/Card/Card.styles.ts +22 -30
- package/src/components/layout/Collapsible/Collapsible.helpers.ts +4 -2
- package/src/components/layout/Collapsible/Collapsible.tsx +8 -4
- package/src/components/layout/ContentToolbar/ColumnsMenu.tsx +1 -1
- package/src/components/layout/ContentToolbar/ContentToolbar.tsx +2 -2
- package/src/components/layout/ContentToolbar/FilterTrigger.tsx +2 -2
- package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +1 -1
- package/src/components/layout/ContentToolbar/SavedViewsMenu.tsx +2 -2
- package/src/components/layout/ContentToolbar/SortByDropdown.tsx +2 -2
- package/src/components/layout/ContentToolbar/ViewSelector.tsx +2 -2
- package/src/components/layout/Dashboard/Dashboard.tsx +1 -1
- package/src/components/layout/Dashboard/DashboardParts.tsx +1 -1
- package/src/components/layout/Drawer/Drawer.tsx +23 -10
- package/src/components/layout/ScrollArea/ScrollArea.styles.ts +45 -32
- package/src/components/layout/ScrollArea/ScrollArea.tsx +31 -16
- package/src/components/layout/ScrollArea/ScrollAreaContent.tsx +2 -2
- package/src/components/layout/ScrollArea/ScrollViewport.tsx +6 -4
- package/src/components/layout/Separator/Separator.styles.ts +30 -9
- package/src/components/layout/Separator/Separator.tsx +4 -3
- package/src/components/layout/SettingsLayout/SettingsLayout.items.tsx +4 -2
- package/src/components/layout/SettingsLayout/SettingsLayout.rail.tsx +6 -5
- package/src/components/layout/SettingsLayout/SettingsLayout.styles.ts +9 -7
- package/src/components/layout/SettingsLayout/SettingsLayout.tsx +2 -2
- package/src/components/layout/SettingsLayout/SettingsPanel.tsx +1 -1
- package/src/components/layout/SettingsLayout/SettingsSectionChips.tsx +3 -3
- package/src/components/layout/SettingsLayout/SettingsSectionHeader.tsx +3 -3
- package/src/components/layout/SettingsLayout/SettingsStatusMarker.tsx +2 -2
- package/src/components/layout/Sidebar/Sidebar.tsx +16 -6
- package/src/components/layout/Skeleton/Skeleton.styles.ts +13 -3
- package/src/components/layout/Skeleton/Skeleton.tsx +6 -4
- package/src/components/layout/Spacer/Spacer.tsx +16 -1
- package/src/components/layout/TableFilter/TableFilter.tsx +2 -1
- package/src/components/navigation/AppHeader/AppHeader.brand.tsx +2 -2
- package/src/components/navigation/AppHeader/AppHeader.details.tsx +9 -7
- package/src/components/navigation/AppHeader/AppHeader.identity.tsx +28 -15
- package/src/components/navigation/AppHeader/AppHeader.tsx +18 -6
- package/src/components/navigation/Breadcrumbs/BreadcrumbEntry.tsx +4 -4
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.styles.tsx +15 -15
- package/src/components/navigation/CommandPalette/CommandPalette.tsx +7 -7
- package/src/components/navigation/CommandPalette/CommandPaletteResults.tsx +5 -5
- package/src/components/navigation/CommandPalette/ShortcutChip.tsx +1 -1
- package/src/components/navigation/ContextMenu/ContextMenu.tsx +8 -8
- package/src/components/navigation/DropdownMenu/DropdownMenu.tsx +25 -16
- package/src/components/navigation/NavigationMenu/NavigationMegaSection.tsx +5 -4
- package/src/components/navigation/NavigationMenu/NavigationMenu.shell.tsx +22 -20
- package/src/components/navigation/NavigationMenu/NavigationMenu.styles.ts +11 -11
- package/src/components/navigation/NavigationMenu/NavigationMenu.tsx +7 -2
- package/src/components/navigation/NavigationMenu/NavigationMenuItem.tsx +12 -12
- package/src/components/navigation/NavigationMenu/NavigationStandardBody.tsx +3 -2
- package/src/components/navigation/Pagination/Pagination.styles.ts +18 -18
- package/src/components/navigation/Pagination/Pagination.tsx +2 -1
- package/src/components/navigation/Pagination/PaginationParts.tsx +4 -3
- package/src/components/navigation/Tabs/Tabs.styles.ts +14 -12
- package/src/components/navigation/Tabs/Tabs.tsx +11 -9
- package/src/components/navigation/Tabs/TabsPanel.tsx +10 -3
- package/src/components/typography/Blockquote/Blockquote.tsx +8 -8
- package/src/components/typography/Code/Code.tsx +17 -17
- package/src/components/typography/Text/Text.tsx +2 -2
- package/src/components/utility/AnimatedIcon/AnimatedIcon.animations.ts +38 -35
- package/src/components/utility/AnimatedIcon/AnimatedIcon.styles.ts +51 -46
- package/src/components/utility/AnimatedIcon/AnimatedIcon.tsx +1 -1
- package/src/components/utility/AspectRatio/AspectRatio.tsx +13 -2
- package/src/components/utility/WorkflowStep/WorkflowStep.parts.tsx +7 -7
- package/src/social-login-button/social-login-button.tsx +25 -8
- package/dist/chunk-236V2GRH.js.map +0 -1
- package/dist/chunk-2CTTASUD.js.map +0 -1
- package/dist/chunk-2E2WOBID.js.map +0 -1
- package/dist/chunk-2NLYGZP3.js.map +0 -1
- package/dist/chunk-3CVTQZQJ.js.map +0 -1
- package/dist/chunk-3D6HXKZM.js.map +0 -1
- package/dist/chunk-3T5Z5HXF.js.map +0 -1
- package/dist/chunk-3VMGE7CU.js.map +0 -1
- package/dist/chunk-4OEKIFBC.js.map +0 -1
- package/dist/chunk-57JY4OI2.js.map +0 -1
- package/dist/chunk-5CKDRLRN.js.map +0 -1
- package/dist/chunk-5QWQR7XT.js.map +0 -1
- package/dist/chunk-5W4BLTDI.js.map +0 -1
- package/dist/chunk-6CTPDNNX.js.map +0 -1
- package/dist/chunk-6GRZ77IS.js.map +0 -1
- package/dist/chunk-6QLPSMTA.js.map +0 -1
- package/dist/chunk-72DKEBJM.js.map +0 -1
- package/dist/chunk-73BEVJCS.js +0 -28
- package/dist/chunk-73BEVJCS.js.map +0 -1
- package/dist/chunk-7F7TTOYN.js.map +0 -1
- package/dist/chunk-7UZ2TFIK.js.map +0 -1
- package/dist/chunk-B76QCDCE.js.map +0 -1
- package/dist/chunk-BLJDCMFU.js.map +0 -1
- package/dist/chunk-CAHWCSRE.js.map +0 -1
- package/dist/chunk-CPTY6UZ6.js.map +0 -1
- package/dist/chunk-CSTAQX2B.js.map +0 -1
- package/dist/chunk-DYVAOEW4.js.map +0 -1
- package/dist/chunk-E7MSDXED.js.map +0 -1
- package/dist/chunk-EFHIMCJN.js.map +0 -1
- package/dist/chunk-EL7CMURV.js.map +0 -1
- package/dist/chunk-FYTLKHEN.js.map +0 -1
- package/dist/chunk-GRDPGHQJ.js.map +0 -1
- package/dist/chunk-GUW5BUK7.js.map +0 -1
- package/dist/chunk-HB7ISSLK.js.map +0 -1
- package/dist/chunk-HXEBKOSM.js.map +0 -1
- package/dist/chunk-IVIHRZEY.js.map +0 -1
- package/dist/chunk-IYTBTK2M.js.map +0 -1
- package/dist/chunk-JXUWWPZR.js.map +0 -1
- package/dist/chunk-KLWW67WP.js.map +0 -1
- package/dist/chunk-L7SFH3ED.js.map +0 -1
- package/dist/chunk-LIG7TKIB.js.map +0 -1
- package/dist/chunk-LVEG6XQL.js.map +0 -1
- package/dist/chunk-MBC55H6M.js.map +0 -1
- package/dist/chunk-MBSYD3ZU.js.map +0 -1
- package/dist/chunk-MJ3BVWPZ.js.map +0 -1
- package/dist/chunk-MK4CH4VT.js.map +0 -1
- package/dist/chunk-MP4VSWHK.js.map +0 -1
- package/dist/chunk-MVKYNDT2.js.map +0 -1
- package/dist/chunk-MVXFMIVZ.js.map +0 -1
- package/dist/chunk-N52O2OKZ.js.map +0 -1
- package/dist/chunk-NEGCJNGJ.js.map +0 -1
- package/dist/chunk-NYZO3JNB.js.map +0 -1
- package/dist/chunk-OATHOXIU.js.map +0 -1
- package/dist/chunk-PMP6WJJS.js.map +0 -1
- package/dist/chunk-PT2XADGH.js.map +0 -1
- package/dist/chunk-Q4BQYYPU.js.map +0 -1
- package/dist/chunk-Q4CAZ2TP.js.map +0 -1
- package/dist/chunk-Q73PTVNO.js.map +0 -1
- package/dist/chunk-QAP3FW33.js.map +0 -1
- package/dist/chunk-QKPD322X.js.map +0 -1
- package/dist/chunk-RSQMPCCR.js.map +0 -1
- package/dist/chunk-RWTFZ7J5.js.map +0 -1
- package/dist/chunk-T3WHW7ZC.js.map +0 -1
- package/dist/chunk-TBF2CPJW.js.map +0 -1
- package/dist/chunk-TVL5V2JK.js.map +0 -1
- package/dist/chunk-U342T7ZR.js.map +0 -1
- package/dist/chunk-UUUMNJPP.js.map +0 -1
- package/dist/chunk-VFHGILXI.js.map +0 -1
- package/dist/chunk-VRDNUY4H.js.map +0 -1
- package/dist/chunk-WTOYEWW6.js.map +0 -1
- package/dist/chunk-WUTHROII.js.map +0 -1
- package/dist/chunk-YVUD3MY4.js.map +0 -1
- package/dist/chunk-ZTYUKEN3.js.map +0 -1
- /package/dist/{chunk-SJO3K7SB.js.map → chunk-2OYFTSG4.js.map} +0 -0
- /package/dist/{chunk-CRZXSZ5O.js.map → chunk-2S752BIJ.js.map} +0 -0
- /package/dist/{chunk-BAQBUKDU.js.map → chunk-3KREF4ZF.js.map} +0 -0
- /package/dist/{chunk-SYN46YL6.js.map → chunk-3RMDIO4G.js.map} +0 -0
- /package/dist/{chunk-IL7JZKXY.js.map → chunk-442FSG7G.js.map} +0 -0
- /package/dist/{chunk-CS3KOKL3.js.map → chunk-4GWHYLEB.js.map} +0 -0
- /package/dist/{chunk-E7T3A4IR.js.map → chunk-5JCGBCFJ.js.map} +0 -0
- /package/dist/{chunk-FC7NQ6XM.js.map → chunk-5MW7OYBM.js.map} +0 -0
- /package/dist/{chunk-CQLPDY2J.js.map → chunk-5OBXEMQO.js.map} +0 -0
- /package/dist/{chunk-BW62QQAG.js.map → chunk-6N4AA2Y7.js.map} +0 -0
- /package/dist/{chunk-7EIOXZWL.js.map → chunk-74P3YX7R.js.map} +0 -0
- /package/dist/{chunk-VT5HQ2AD.js.map → chunk-BFMDA6UO.js.map} +0 -0
- /package/dist/{chunk-R75DZ3AK.js.map → chunk-BVLMKSHX.js.map} +0 -0
- /package/dist/{chunk-UZ6AUTE6.js.map → chunk-CNQUCNEA.js.map} +0 -0
- /package/dist/{chunk-JL75FJRG.js.map → chunk-CZIX4BW2.js.map} +0 -0
- /package/dist/{chunk-HU7TX7RB.js.map → chunk-DUBTI4DI.js.map} +0 -0
- /package/dist/{chunk-RMCNEKBZ.js.map → chunk-DW6F7354.js.map} +0 -0
- /package/dist/{chunk-XJUEHG72.js.map → chunk-EERUSI52.js.map} +0 -0
- /package/dist/{chunk-C55AWF3U.js.map → chunk-FFCJ7NR2.js.map} +0 -0
- /package/dist/{chunk-AYLEZM6T.js.map → chunk-GLFTIGOF.js.map} +0 -0
- /package/dist/{chunk-L4UP5VYS.js.map → chunk-GVH7C2PT.js.map} +0 -0
- /package/dist/{chunk-AER4245J.js.map → chunk-H67EL3CG.js.map} +0 -0
- /package/dist/{chunk-57JLS55D.js.map → chunk-I4QA2F4L.js.map} +0 -0
- /package/dist/{chunk-AJ5SDHX5.js.map → chunk-JCL7WK4G.js.map} +0 -0
- /package/dist/{chunk-WE3LJPRN.js.map → chunk-KE473LK6.js.map} +0 -0
- /package/dist/{chunk-CQPFSEJB.js.map → chunk-L7NQCLFU.js.map} +0 -0
- /package/dist/{chunk-2ZIHZLF5.js.map → chunk-M2JTIH5M.js.map} +0 -0
- /package/dist/{chunk-2BIVCYTO.js.map → chunk-MR2HKBHS.js.map} +0 -0
- /package/dist/{chunk-KK57AHWS.js.map → chunk-OAEYCKBN.js.map} +0 -0
- /package/dist/{chunk-JGRE56GQ.js.map → chunk-OB56SZGL.js.map} +0 -0
- /package/dist/{chunk-E4TNDTWV.js.map → chunk-OL2BEJZR.js.map} +0 -0
- /package/dist/{chunk-NDNYD4FG.js.map → chunk-OS6KPL4D.js.map} +0 -0
- /package/dist/{chunk-75LOTMSN.js.map → chunk-PPRV4LTM.js.map} +0 -0
- /package/dist/{chunk-LT4NEKXB.js.map → chunk-QA2ZGCRL.js.map} +0 -0
- /package/dist/{chunk-ROT57BP4.js.map → chunk-R2XVTUVR.js.map} +0 -0
- /package/dist/{chunk-QEG3P5D4.js.map → chunk-R6SN73RX.js.map} +0 -0
- /package/dist/{chunk-IKLOIONQ.js.map → chunk-RZYSKQTS.js.map} +0 -0
- /package/dist/{chunk-NCPWLHZT.js.map → chunk-SKT2V2OX.js.map} +0 -0
- /package/dist/{chunk-EOW2ECB3.js.map → chunk-SNURSSTN.js.map} +0 -0
- /package/dist/{chunk-CZBND7AY.js.map → chunk-T7DE44SP.js.map} +0 -0
- /package/dist/{chunk-DB2ZFZVW.js.map → chunk-TKC6WHGB.js.map} +0 -0
- /package/dist/{chunk-JLQGRZMN.js.map → chunk-UEVHI62V.js.map} +0 -0
- /package/dist/{chunk-4CXEWFKO.js.map → chunk-UFJYJHQI.js.map} +0 -0
- /package/dist/{chunk-BNEWMFVB.js.map → chunk-UGGJ3KDT.js.map} +0 -0
- /package/dist/{chunk-KREWQAEV.js.map → chunk-VIRYHNEM.js.map} +0 -0
- /package/dist/{chunk-N6CSXHFJ.js.map → chunk-WN5PNP6F.js.map} +0 -0
- /package/dist/{chunk-XR46FSOH.js.map → chunk-XIG3DXXX.js.map} +0 -0
- /package/dist/{chunk-35S6QI5G.js.map → chunk-XJJXBUPN.js.map} +0 -0
- /package/dist/{chunk-GHTBUJ6E.js.map → chunk-XRUW7DMH.js.map} +0 -0
- /package/dist/{chunk-HNPWZ3W2.js.map → chunk-Y7F5JBAT.js.map} +0 -0
- /package/dist/{chunk-6BDYC4RA.js.map → chunk-YRSR5LVZ.js.map} +0 -0
- /package/dist/{chunk-FFOQZRFC.js.map → chunk-ZAY6OA6F.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/utility/AnimatedIcon/AnimatedIcon.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport {\n bounceAnimation,\n breatheAnimation,\n fadeInOutAnimation,\n flipAnimation,\n floatAnimation,\n glowPulseAnimation,\n heartbeatAnimation,\n jelloAnimation,\n morphAnimation,\n neonFlickerAnimation,\n pulseAnimation,\n rippleAnimation,\n rotateAnimation,\n shakeAnimation,\n spinAnimation,\n swingAnimation,\n translateAnimation,\n wobbleAnimation,\n} from './AnimatedIcon.animations';\nimport type { AnimationSize, AnimationVariant } from './AnimatedIcon.types';\nimport { neutralTones, shadowInk, sheen } from '../../../tokens/ink';\nimport { rem } from '../../../tokens/relative';\n\n/** Per size: the ring's edge and the glyph's edge (its font size, width and height), in design px. */\nexport const sizeConfigs: Record<AnimationSize, { size: number; glyph: number }> = {\n xs: { size: 12, glyph: 10 },\n sm: { size: 24, glyph: 20 },\n md: { size: 32, glyph: 28 },\n lg: { size: 48, glyph: 44 },\n xl: { size: 64, glyph: 60 },\n};\n\n/**\n * Every variant produces the same shorthand — keyframes, duration, easing,\n * iteration count, delay — so only the three things that actually differ are\n * tabulated. `scale` multiplies the caller's duration for the variants that\n * read as slower than the rest.\n */\nconst ANIMATIONS: Record<string, { keyframes: string; easing: string; scale: number }> = {\n rotate: { keyframes: `${rotateAnimation}`, easing: 'linear', scale: 1 },\n pulse: { keyframes: `${pulseAnimation}`, easing: 'ease-in-out', scale: 1 },\n translate: { keyframes: `${translateAnimation}`, easing: 'ease-in-out', scale: 1 },\n bounce: { keyframes: `${bounceAnimation}`, easing: 'ease-in-out', scale: 1 },\n shake: { keyframes: `${shakeAnimation}`, easing: 'ease-in-out', scale: 1 },\n flip: { keyframes: `${flipAnimation}`, easing: 'ease-in-out', scale: 1 },\n spin: { keyframes: `${spinAnimation}`, easing: 'ease-in-out', scale: 1 },\n fadeInOut: { keyframes: `${fadeInOutAnimation}`, easing: 'ease-in-out', scale: 1 },\n heartbeat: { keyframes: `${heartbeatAnimation}`, easing: 'ease-in-out', scale: 1 },\n wobble: { keyframes: `${wobbleAnimation}`, easing: 'ease-in-out', scale: 1 },\n morph: { keyframes: `${morphAnimation}`, easing: 'ease-in-out', scale: 1 },\n swing: { keyframes: `${swingAnimation}`, easing: 'ease-in-out', scale: 1 },\n jello: { keyframes: `${jelloAnimation}`, easing: 'ease-in-out', scale: 1 },\n float: { keyframes: `${floatAnimation}`, easing: 'ease-in-out', scale: 2 },\n neonFlicker: { keyframes: `${neonFlickerAnimation}`, easing: 'ease-in-out', scale: 2 },\n breathe: { keyframes: `${breatheAnimation}`, easing: 'ease-in-out', scale: 1.5 },\n};\n\nconst animationFor = (\n variant: AnimationVariant,\n duration: number,\n delay: number,\n loop: boolean,\n) => {\n const spec = ANIMATIONS[variant];\n if (!spec) return 'none';\n\n const iterationCount = loop ? 'infinite' : '1';\n return `${spec.keyframes} ${duration * spec.scale}s ${spec.easing} ${iterationCount} ${delay > 0 ? `${delay}s` : '0s'}`;\n};\n\nconst SHADOWS: Record<string, (theme: Theme) => string> = {\n soft: (theme) => `0 4px 20px ${shadowInk(theme, 0.15)}`,\n hard: (theme) => `4px 4px 0px ${shadowInk(theme, 0.25)}`,\n elevated: (theme) =>\n `0 10px 40px ${shadowInk(theme, 0.2)}, 0 2px 10px ${shadowInk(theme, 0.1)}`,\n};\n\nexport interface IconStyleFlags {\n $size: number;\n $fontSize: number;\n $animationVariant: AnimationVariant;\n $duration: number;\n $delay: number;\n $loop: boolean;\n $glow: boolean;\n $glass: boolean;\n $glowColor?: string;\n $customColor?: string;\n $metallic?: boolean;\n $gradient?: boolean;\n $shadow?: 'soft' | 'hard' | 'elevated' | 'none';\n $ripple?: boolean;\n $neon?: boolean;\n $holographic?: boolean;\n}\n\n/**\n * The four surface treatments that paint the icon themselves — metallic,\n * gradient, neon and holographic — each run a second animation alongside the\n * chosen one, so they all need the base animation string.\n */\nconst effectStyles = (\n theme: Theme,\n flags: IconStyleFlags,\n animation: string,\n color: string,\n): CSSObject => {\n const { $glass, $metallic, $gradient, $neon, $holographic } = flags;\n\n return {\n ...($glass && {\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.2)}, ${alpha(theme.palette.background.paper, 0.1)})`,\n backdropFilter: 'blur(10px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: `inset 0 1px 1px ${sheen(theme, 0.3)}, 0 8px 32px ${shadowInk(theme, 0.1)}`,\n }),\n ...($metallic && {\n background: `linear-gradient(145deg,\n ${neutralTones(theme).track} 0%,\n ${neutralTones(theme).muted} 25%,\n ${neutralTones(theme).subtle} 50%,\n ${neutralTones(theme).emphasis} 75%,\n ${neutralTones(theme).subtle} 100%)`,\n backgroundSize: '200% 200%',\n animation: `${animation}, ${breatheAnimation} 4s ease-in-out infinite`,\n boxShadow: `inset 0 2px 4px ${sheen(theme, 0.5)},\n inset 0 -2px 4px ${shadowInk(theme, 0.3)},\n 0 4px 8px ${shadowInk(theme, 0.2)}`,\n }),\n ...($gradient && {\n background: `linear-gradient(135deg,\n ${theme.palette.primary.main} 0%,\n ${theme.palette.secondary.main} 100%)`,\n backgroundSize: '200% 200%',\n animation: `${animation}, ${breatheAnimation} 3s ease-in-out infinite`,\n }),\n ...($neon && {\n color,\n textShadow: `0 0 10px ${color}, 0 0 20px ${color}, 0 0 30px ${color}`,\n filter: `brightness(1.2) contrast(1.2)`,\n animation: `${animation}, ${neonFlickerAnimation} 3s ease-in-out infinite`,\n }),\n ...($holographic && {\n background: `linear-gradient(45deg,\n ${theme.palette.primary.main} 0%,\n ${theme.palette.secondary.main} 25%,\n ${theme.palette.error.main} 50%,\n ${theme.palette.warning.main} 75%,\n ${theme.palette.primary.main} 100%)`,\n backgroundSize: '400% 400%',\n animation: `${animation}, ${floatAnimation} 6s ease-in-out infinite`,\n backgroundClip: 'text',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n filter: `hue-rotate(0deg)`,\n '@keyframes hueRotate': {\n '0%': { filter: 'hue-rotate(0deg)' },\n '100%': { filter: 'hue-rotate(360deg)' },\n },\n '&::before': {\n content: '\"\"',\n position: 'absolute' as const,\n inset: -2,\n borderRadius: '50%',\n background: 'inherit',\n filter: 'blur(10px)',\n opacity: 0.5,\n zIndex: -1,\n },\n }),\n };\n};\n\nexport const iconSx = (theme: Theme, flags: IconStyleFlags): CSSObject => {\n const {\n $size, $fontSize, $animationVariant, $duration, $delay, $loop,\n $glow, $glowColor, $customColor, $shadow, $ripple, $neon,\n } = flags;\n\n const color = $customColor || theme.palette.primary.main;\n const glowColor = $glowColor || color;\n const animation = animationFor($animationVariant, $duration, $delay, $loop);\n\n // Both selectors size the same glyph — MUI icons render an MuiSvgIcon-root,\n // a bare child renders an svg.\n const glyphSize = { fontSize: rem(theme, $fontSize), width: $fontSize, height: $fontSize };\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: $size,\n height: $size,\n color,\n animation,\n position: 'relative' as const,\n cursor: 'default',\n borderRadius: '50%',\n transition: 'all 0.3s ease',\n boxShadow: SHADOWS[$shadow ?? 'none']?.(theme) ?? 'none',\n ...($glow && {\n '&::before': {\n content: '\"\"',\n position: 'absolute' as const,\n inset: -8,\n borderRadius: '50%',\n background: `radial-gradient(circle, ${alpha(glowColor, 0.3)} 0%, transparent 70%)`,\n animation: `${glowPulseAnimation} ${$duration * 1.2}s ease-in-out infinite`,\n zIndex: -1,\n },\n filter: `drop-shadow(0 0 8px ${alpha(glowColor, 0.5)})`,\n }),\n ...effectStyles(theme, flags, animation, color),\n ...($ripple && {\n '&::after': {\n content: '\"\"',\n position: 'absolute' as const,\n inset: 0,\n borderRadius: '50%',\n border: `2px solid ${color}`,\n animation: `${rippleAnimation} ${$duration * 1.5}s ease-out infinite`,\n },\n }),\n '& .MuiSvgIcon-root': glyphSize,\n '& svg': glyphSize,\n '&:hover': {\n transform: 'scale(1.05)',\n filter: $neon ? `brightness(1.4) contrast(1.3)` : undefined,\n },\n };\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/ContentToolbar/ViewSelector.tsx"],"sourcesContent":["'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport GridIcon from '@mui/icons-material/GridViewOutlined';\nimport ListIcon from '@mui/icons-material/FormatListBulletedRounded';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Slider from '@mui/material/Slider/index.js';\n// `SvgIconComponent` is declared inline in @mui/icons-material's barrel and has\n// no module of its own, so the deep-import equivalent is its own definition:\n// `type SvgIconComponent = typeof SvgIcon`.\nimport type SvgIcon from '@mui/material/SvgIcon/index.js';\nimport React, { useState } from 'react';\n\nimport type { ViewMode, ViewSelectorProps } from './ContentToolbar.types';\nimport { fieldRadiusPx } from '../../../tokens/field-radius';\nimport { fieldHeight } from '../../../tokens/field-height';\nimport { sxRem } from '../../../tokens/relative';\n\nconst VIEW_OPTIONS: { value: ViewMode; label: string; icon: typeof SvgIcon }[] = [\n { value: 'grid', label: 'Grid View', icon: GridIcon },\n { value: 'list', label: 'List View', icon: ListIcon },\n];\n\n/**\n * View selector: a grid/list dropdown plus a card-size zoom slider (grid mode\n * only). Faithful MUI port of the reference toolbar's view control.\n */\nexport function ViewSelector({\n viewMode,\n onViewModeChange,\n zoom,\n onZoomChange,\n cardSizeLabel,\n}: ViewSelectorProps): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const activeOption = VIEW_OPTIONS.find((option) => option.value === viewMode) ?? VIEW_OPTIONS[0]!;\n const ActiveIcon = activeOption.icon;\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n {viewMode === 'grid' && (\n <Box sx={{ width: 96, display: 'flex', alignItems: 'center' }}>\n <Slider\n data-testid=\"resize-card-slider\"\n aria-label={cardSizeLabel}\n value={zoom[0] ?? 0}\n onChange={(_, value) => onZoomChange([value as number])}\n min={0}\n max={100}\n step={1}\n size=\"small\"\n />\n </Box>\n )}\n\n <Button\n data-testid=\"view-mode-btn\"\n variant=\"text\"\n size=\"small\"\n color=\"inherit\"\n aria-label={activeOption.label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n sx={{ minWidth: 0, height: fieldHeight, px: 1, gap: 1, borderRadius: fieldRadiusPx, color: 'text.secondary' }}\n >\n <ActiveIcon sx={{ fontSize: sxRem(16) }} />\n <ChevronDownIcon sx={{ fontSize: sxRem(14) }} />\n </Button>\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: { minWidth: 180 } } }}\n >\n {VIEW_OPTIONS.map((option) => {\n const OptionIcon = option.icon;\n const selected = viewMode === option.value;\n return (\n <MenuItem\n key={option.value}\n data-testid={`view-mode-${option.value}`}\n onClick={() => {\n onViewModeChange(option.value);\n setAnchorEl(null);\n }}\n sx={{ gap: 1.5 }}\n >\n <ListItemText>{option.label}</ListItemText>\n <OptionIcon sx={{ fontSize: sxRem(16), color: 'text.secondary' }} />\n <ListItemIcon sx={{ minWidth: 'auto !important' }}>\n <CheckIcon sx={{ fontSize: sxRem(16), color: selected ? 'text.primary' : 'transparent' }} />\n </ListItemIcon>\n </MenuItem>\n );\n })}\n </Menu>\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-73BEVJCS.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// src/tokens/shadow.ts
|
|
2
|
-
var len = (value) => value === 0 ? "0" : `${value}px`;
|
|
3
|
-
var shadowCss = (shadow) => [
|
|
4
|
-
len(shadow.offsetX),
|
|
5
|
-
len(shadow.offsetY),
|
|
6
|
-
len(shadow.blurRadius),
|
|
7
|
-
...shadow.spreadDistance === 0 ? [] : [len(shadow.spreadDistance)],
|
|
8
|
-
shadow.color
|
|
9
|
-
].join(" ");
|
|
10
|
-
var shadowListCss = (shadows) => shadows.map(shadowCss).join(", ");
|
|
11
|
-
var BLACK = "#000";
|
|
12
|
-
var WHITE = "#fff";
|
|
13
|
-
var halo = (blurRadius, color) => [
|
|
14
|
-
{ offsetX: 0, offsetY: 0, blurRadius, spreadDistance: 0, color }
|
|
15
|
-
];
|
|
16
|
-
var drop = (offsetY, blurRadius, color) => [
|
|
17
|
-
{ offsetX: 0, offsetY, blurRadius, spreadDistance: 0, color }
|
|
18
|
-
];
|
|
19
|
-
|
|
20
|
-
export {
|
|
21
|
-
shadowCss,
|
|
22
|
-
shadowListCss,
|
|
23
|
-
BLACK,
|
|
24
|
-
WHITE,
|
|
25
|
-
halo,
|
|
26
|
-
drop
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=chunk-73BEVJCS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tokens/shadow.ts"],"sourcesContent":["/**\n * ONE SHADOW, IN THE SHAPE BOTH RENDERERS READ.\n *\n * A drop shadow is one of the few decorations the two sides express in the same\n * numbers and different syntax: CSS wants `0 8px 32px rgba(…)`, React Native\n * wants `{ offsetX, offsetY, blurRadius, spreadDistance, color }` (its\n * `BoxShadowValue`, which `boxShadow` takes an array of). So the numbers live in\n * a component's `*.metrics.ts` as this object, native passes it straight\n * through, and the web renders it with {@link shadowCss}.\n *\n * {@link shadowCss} reproduces the text the web components already wrote by\n * hand: a bare `0` for a zero length, and no spread at all when the spread is\n * zero. That is what makes moving a shadow into a metrics table a refactor\n * rather than a restyle.\n */\nexport interface UiShadow {\n offsetX: number;\n offsetY: number;\n blurRadius: number;\n spreadDistance: number;\n color: string;\n}\n\n/** A length the way the web writes it: a bare `0`, otherwise px. */\nconst len = (value: number): string => (value === 0 ? '0' : `${value}px`);\n\n/** One shadow as CSS. A zero spread is omitted, as the web has always written it. */\nexport const shadowCss = (shadow: UiShadow): string =>\n [\n len(shadow.offsetX),\n len(shadow.offsetY),\n len(shadow.blurRadius),\n ...(shadow.spreadDistance === 0 ? [] : [len(shadow.spreadDistance)]),\n shadow.color,\n ].join(' ');\n\n/** Several shadows as one CSS declaration. */\nexport const shadowListCss = (shadows: readonly UiShadow[]): string =>\n shadows.map(shadowCss).join(', ');\n\n/**\n * MUI's `palette.common`, which `UiTheme` has no slot for.\n *\n * Here rather than beside each caller because the neumorphic, glass and scrim\n * arithmetic in more than one component mixes from exactly these two, and a\n * per-component copy is a per-component chance to write `#000000`.\n */\nexport const BLACK = '#000';\nexport const WHITE = '#fff';\n\n/** A shadow with no offset — a halo all round, which is how `glow` reads. */\nexport const halo = (blurRadius: number, color: string): UiShadow[] => [\n { offsetX: 0, offsetY: 0, blurRadius, spreadDistance: 0, color },\n];\n\n/** A dropped shadow straight down, which is how a lifted surface sits. */\nexport const drop = (offsetY: number, blurRadius: number, color: string): UiShadow[] => [\n { offsetX: 0, offsetY, blurRadius, spreadDistance: 0, color },\n];\n"],"mappings":";AAwBA,IAAM,MAAM,CAAC,UAA2B,UAAU,IAAI,MAAM,GAAG,KAAK;AAG7D,IAAM,YAAY,CAAC,WACxB;AAAA,EACE,IAAI,OAAO,OAAO;AAAA,EAClB,IAAI,OAAO,OAAO;AAAA,EAClB,IAAI,OAAO,UAAU;AAAA,EACrB,GAAI,OAAO,mBAAmB,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,cAAc,CAAC;AAAA,EAClE,OAAO;AACT,EAAE,KAAK,GAAG;AAGL,IAAM,gBAAgB,CAAC,YAC5B,QAAQ,IAAI,SAAS,EAAE,KAAK,IAAI;AAS3B,IAAM,QAAQ;AACd,IAAM,QAAQ;AAGd,IAAM,OAAO,CAAC,YAAoB,UAA8B;AAAA,EACrE,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,gBAAgB,GAAG,MAAM;AACjE;AAGO,IAAM,OAAO,CAAC,SAAiB,YAAoB,UAA8B;AAAA,EACtF,EAAE,SAAS,GAAG,SAAS,YAAY,gBAAgB,GAAG,MAAM;AAC9D;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/Skeleton/Skeleton.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport MuiSkeleton from '@mui/material/Skeleton/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { resolveSkeletonProps, skeletonInstanceTestId } from './Skeleton.helpers';\nimport {\n defaultDimensions,\n muiAnimationFor,\n muiVariantFor,\n skeletonStyles,\n} from './Skeleton.styles';\nimport type { SkeletonProps } from './Skeleton.types';\nimport { resolveTestId, withoutTestIdProps } from '../../../platform/test-id';\n\nexport const Skeleton: React.FC<SkeletonProps> = React.memo((rawProps) => {\n const {\n variant,\n animation,\n width,\n height,\n count,\n spacing,\n borderRadius,\n className,\n intensity,\n glassmorphism,\n shimmer,\n style,\n ...others\n } = resolveSkeletonProps(rawProps);\n // `testID` and `dataTestId` are the shared contract's spellings; the DOM\n // wants `data-testid`, and must not see the other two as attributes.\n const dataTestId = resolveTestId(others);\n const props = withoutTestIdProps(others);\n const theme = useTheme();\n\n const defaults = defaultDimensions(variant);\n const finalWidth = width ?? defaults.width;\n const finalHeight = height ?? defaults.height;\n\n // Handle edge case: count of 0 should render nothing\n if (count === 0) {\n return null;\n }\n\n const singleSkeleton = (\n <MuiSkeleton\n variant={muiVariantFor(variant)}\n animation={muiAnimationFor(variant, animation)}\n width={finalWidth}\n height={finalHeight}\n sx={skeletonStyles(theme, {\n intensity,\n borderRadius,\n glassmorphism,\n shimmer,\n style,\n })}\n className={className}\n data-testid={dataTestId}\n aria-hidden=\"true\"\n {...props}\n />\n );\n\n if (count === 1) {\n return singleSkeleton;\n }\n\n return (\n <Stack spacing={spacing}>\n {Array.from({ length: count }).map((_, index) => (\n <Box key={`skeleton-${index}`}>\n {React.cloneElement(singleSkeleton, {\n 'data-testid': skeletonInstanceTestId(dataTestId, index),\n })}\n </Box>\n ))}\n </Stack>\n );\n});\n\nSkeleton.displayName = 'Skeleton';\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,iBAAiB;AACxB,OAAO,WAAW;AAClB,SAAS,gBAAgB;AACzB,OAAO,WAAW;AA4Cd;AAhCG,IAAM,WAAoC,MAAM,KAAK,CAAC,aAAa;AACxE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI,qBAAqB,QAAQ;AAGjC,QAAM,aAAa,cAAc,MAAM;AACvC,QAAM,QAAQ,mBAAmB,MAAM;AACvC,QAAM,QAAQ,SAAS;AAEvB,QAAM,WAAW,kBAAkB,OAAO;AAC1C,QAAM,aAAa,SAAS,SAAS;AACrC,QAAM,cAAc,UAAU,SAAS;AAGvC,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AAEA,QAAM,iBACJ;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,cAAc,OAAO;AAAA,MAC9B,WAAW,gBAAgB,SAAS,SAAS;AAAA,MAC7C,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,IAAI,eAAe,OAAO;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD;AAAA,MACA,eAAa;AAAA,MACb,eAAY;AAAA,MACX,GAAG;AAAA;AAAA,EACN;AAGF,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AAEA,SACE,oBAAC,SAAM,SACJ,gBAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,UACrC,oBAAC,OACE,gBAAM,aAAa,gBAAgB;AAAA,IAClC,eAAe,uBAAuB,YAAY,KAAK;AAAA,EACzD,CAAC,KAHO,YAAY,KAAK,EAI3B,CACD,GACH;AAEJ,CAAC;AAED,SAAS,cAAc;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/navigation/Tabs/TabsPanel.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport CircularProgress from '@mui/material/CircularProgress/index.js';\nimport Fade from '@mui/material/Fade/index.js';\nimport { styled } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { TabPanelProps } from './Tabs.types';\n\nconst TabPanel = styled(Box, {\n shouldForwardProp: (prop) => !['animate', 'persist'].includes(prop as string),\n})<{ animate?: boolean; persist?: boolean }>(({ animate, persist }) => ({\n width: '100%',\n\n ...(animate && {\n transition: 'all 0.3s ease-in-out',\n }),\n\n ...(persist && {\n '&[hidden]': {\n display: 'none !important',\n },\n }),\n}));\n\nconst LoadingContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n color: theme.palette.text.secondary,\n}));\n\n// A loading panel shows the caller's placeholder, or a spinner if there isn't one.\nconst panelContent = (\n loading: boolean,\n loadingComponent: React.ReactNode,\n children: React.ReactNode,\n): React.ReactNode => {\n if (!loading) return children;\n\n return (\n loadingComponent || (\n <LoadingContainer>\n <CircularProgress size={32} />\n </LoadingContainer>\n )\n );\n};\n\nconst panelTestId = (dataTestId: string | undefined, index: number): string =>\n dataTestId ? `${dataTestId}-panel-${index}` : `tabs-panel-${index}`;\n\nexport const CustomTabPanel: React.FC<TabPanelProps & { dataTestId?: string; index: number }> = ({\n children,\n id,\n value,\n animate = false,\n animationDuration = 300,\n persist = false,\n loading = false,\n loadingComponent,\n className,\n dataTestId,\n index,\n ...props\n}) => {\n const isActive = value === id;\n const shouldRender = isActive || persist;\n\n if (!shouldRender) {\n return null;\n }\n\n const content = panelContent(loading, loadingComponent, children);\n const testId = panelTestId(dataTestId, index);\n\n const panel = (\n <TabPanel\n role=\"tabpanel\"\n hidden={!isActive}\n id={`tabpanel-${id}`}\n aria-labelledby={`tab-${id}`}\n animate={animate}\n persist={persist}\n className={className}\n data-testid={testId}\n {...props}\n >\n {content}\n </TabPanel>\n );\n\n // The animated and plain panels are the same element; only the Fade wrapper\n // differs.\n if (!animate) return panel;\n\n return (\n <Fade in={isActive} timeout={animationDuration}>\n {panel}\n </Fade>\n );\n};\n"],"mappings":";AAAA,OAAO,SAAS;AAChB,OAAO,sBAAsB;AAC7B,OAAO,UAAU;AACjB,SAAS,cAAc;AAwCf;AAnCR,IAAM,WAAW,OAAO,KAAK;AAAA,EAC3B,mBAAmB,CAAC,SAAS,CAAC,CAAC,WAAW,SAAS,EAAE,SAAS,IAAc;AAC9E,CAAC,EAA4C,CAAC,EAAE,SAAS,QAAQ,OAAO;AAAA,EACtE,OAAO;AAAA,EAEP,GAAI,WAAW;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EAEA,GAAI,WAAW;AAAA,IACb,aAAa;AAAA,MACX,SAAS;AAAA,IACX;AAAA,EACF;AACF,EAAE;AAEF,IAAM,mBAAmB,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACnD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,OAAO,MAAM,QAAQ,KAAK;AAC5B,EAAE;AAGF,IAAM,eAAe,CACnB,SACA,kBACA,aACoB;AACpB,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,oBACE,oBAAC,oBACC,8BAAC,oBAAiB,MAAM,IAAI,GAC9B;AAGN;AAEA,IAAM,cAAc,CAAC,YAAgC,UACnD,aAAa,GAAG,UAAU,UAAU,KAAK,KAAK,cAAc,KAAK;AAE5D,IAAM,iBAAmF,CAAC;AAAA,EAC/F;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,WAAW,UAAU;AAC3B,QAAM,eAAe,YAAY;AAEjC,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,aAAa,SAAS,kBAAkB,QAAQ;AAChE,QAAM,SAAS,YAAY,YAAY,KAAK;AAE5C,QAAM,QACJ;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,IAAI,YAAY,EAAE;AAAA,MAClB,mBAAiB,OAAO,EAAE;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAa;AAAA,MACZ,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAKF,MAAI,CAAC,QAAS,QAAO;AAErB,SACE,oBAAC,QAAK,IAAI,UAAU,SAAS,mBAC1B,iBACH;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/feedback/TutorialOverlay/TutorialStepBody.tsx"],"sourcesContent":["import CompleteIcon from '@mui/icons-material/CheckCircle';\nimport CloseIcon from '@mui/icons-material/Close';\nimport PrevIcon from '@mui/icons-material/NavigateBefore';\nimport NextIcon from '@mui/icons-material/NavigateNext';\nimport RestartIcon from '@mui/icons-material/Refresh';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport React, { } from 'react';\n\nimport { onMedia, uiInk } from '../../../tokens/ink';\n\nimport type { TutorialOverlayProps } from './TutorialOverlay.types';\nimport type { TutorialCopy } from '../../../copy';\n\n// Animation keyframes\n\nconst StepIndicator = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(1),\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2) }));\n\n\nconst StepDot = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'active' && prop !== 'completed' })<{ active?: boolean; completed?: boolean }>(({ theme, active, completed }) => ({\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: completed\n ? theme.palette.success.main\n : active\n ? theme.palette.primary.main\n : alpha(theme.palette.text.primary, 0.3),\n transition: 'all 0.3s ease',\n ...(active && {\n transform: 'scale(1.5)' }) }));\n\n// Title, body copy, the step dots and the navigation row.\n\n// The step's controls: skip/restart on the left, previous/next on the right.\nconst TutorialStepNav: React.FC<{\n copy: TutorialCopy;\n currentStep: number;\n stepCount: number;\n isLastStep: boolean;\n allowSkip: boolean;\n requiresActionBeforeNext?: boolean;\n onNext: () => void;\n onPrev: () => void;\n onSkip: () => void;\n onRestart: () => void;\n}> = ({\n copy,\n currentStep,\n stepCount,\n isLastStep,\n allowSkip,\n requiresActionBeforeNext,\n onNext,\n onPrev,\n onSkip,\n onRestart }) => (\n <Stack\n direction=\"row\"\n spacing={1}\n justifyContent=\"space-between\"\n data-testid=\"tutorial-navigation\"\n >\n <Stack direction=\"row\" spacing={1}>\n {allowSkip && (\n <Button size=\"small\" onClick={onSkip} variant=\"text\">\n {copy.skip}\n </Button>\n )}\n {stepCount > 1 && (\n <IconButton\n size=\"small\"\n onClick={onRestart}\n disabled={currentStep === 0}\n title={copy.restart}\n >\n <RestartIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Stack>\n\n <Stack direction=\"row\" spacing={1}>\n {stepCount > 1 && currentStep > 0 && (\n <Button\n size=\"small\"\n startIcon={<PrevIcon />}\n onClick={onPrev}\n disabled={currentStep === 0}\n data-testid=\"tutorial-prev-button\"\n >\n {copy.previous}\n </Button>\n )}\n\n {!isLastStep ? (\n <Button\n variant=\"contained\"\n size=\"small\"\n endIcon={<NextIcon />}\n onClick={onNext}\n disabled={requiresActionBeforeNext}\n title={requiresActionBeforeNext ? 'Complete the required action first' : ''}\n data-testid=\"tutorial-next-button\"\n >\n {copy.next}\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n size=\"small\"\n endIcon={<CompleteIcon />}\n onClick={onNext}\n sx={(theme) => {\n const [from, to] = uiInk(theme).celebration.mint;\n return { background: `linear-gradient(135deg, ${from} 0%, ${to} 100%)` };\n }}\n data-testid=\"tutorial-finish-button\"\n >\n {stepCount === 1 ? 'Complete' : 'Finish'}\n </Button>\n )}\n </Stack>\n </Stack>\n);\n\nconst StepDots: React.FC<{ currentStep: number; stepCount: number }> = ({\n currentStep,\n stepCount }) => (\n <StepIndicator data-testid=\"tutorial-step-indicators\">\n {Array.from({ length: stepCount }).map((_, index) => (\n <StepDot\n key={index}\n active={index === currentStep}\n completed={index < currentStep}\n data-testid={`tutorial-indicator-${index}`}\n />\n ))}\n </StepIndicator>\n);\n\n// Title, and the close button when skipping is allowed.\nconst TutorialStepHeader: React.FC<{\n title: React.ReactNode;\n currentStep: number;\n allowSkip: boolean;\n onSkip: () => void;\n}> = ({ title, currentStep, allowSkip, onSkip }) => (\n <Box\n sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start' }}\n >\n <Typography\n id={`tutorial-title-${currentStep}`}\n variant=\"h6\"\n fontWeight=\"bold\"\n sx={{ flex: 1 }}\n data-testid=\"tutorial-step-title\"\n >\n {title}\n </Typography>\n {allowSkip && (\n <IconButton\n size=\"small\"\n onClick={onSkip}\n sx={{ ml: 1, mt: -1, mr: -1 }}\n data-testid=\"tutorial-close-button\"\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n);\n\nexport const TutorialStepBody: React.FC<{\n copy: TutorialCopy;\n step: TutorialOverlayProps['steps'][number];\n currentStep: number;\n stepCount: number;\n progress: number;\n isLastStep: boolean;\n allowSkip: boolean;\n showProgress: boolean;\n requiresActionBeforeNext?: boolean;\n onNext: () => void;\n onPrev: () => void;\n onSkip: () => void;\n onRestart: () => void;\n}> = ({\n copy,\n step,\n currentStep,\n stepCount,\n progress: _progress,\n isLastStep,\n allowSkip,\n showProgress,\n requiresActionBeforeNext,\n onNext,\n onPrev,\n onSkip,\n onRestart }) => (\n <Stack spacing={2}>\n <TutorialStepHeader\n title={step.title}\n currentStep={currentStep}\n allowSkip={allowSkip}\n onSkip={onSkip}\n />\n\n <Typography\n id={`tutorial-content-${currentStep}`}\n variant=\"body2\"\n color=\"text.secondary\"\n data-testid=\"tutorial-step-content\"\n >\n {step.content}\n </Typography>\n\n {showProgress && (\n <Typography variant=\"caption\" color=\"text.secondary\" align=\"center\">\n {currentStep + 1} of {stepCount}\n </Typography>\n )}\n\n {step.action && (\n <Button\n variant=\"contained\"\n size=\"small\"\n onClick={step.action.onClick}\n sx={(theme) => {\n const [from, to] = uiInk(theme).celebration.violet;\n return { background: `linear-gradient(135deg, ${from} 0%, ${to} 100%)`, color: onMedia(theme) };\n }}\n >\n {step.action.label}\n </Button>\n )}\n\n <StepDots currentStep={currentStep} stepCount={stepCount} />\n\n <TutorialStepNav\n copy={copy}\n currentStep={currentStep}\n stepCount={stepCount}\n isLastStep={isLastStep}\n allowSkip={allowSkip}\n requiresActionBeforeNext={requiresActionBeforeNext}\n onNext={onNext}\n onPrev={onPrev}\n onSkip={onSkip}\n onRestart={onRestart}\n />\n </Stack>\n);\n\n// Main component\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/navigation/CommandPalette/CommandPaletteResults.tsx"],"sourcesContent":["import RecentIcon from '@mui/icons-material/History';\nimport Box from '@mui/material/Box/index.js';\nimport Divider from '@mui/material/Divider/index.js';\nimport List from '@mui/material/List/index.js';\nimport ListItem from '@mui/material/ListItem/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { ShortcutChip } from './ShortcutChip';\nimport type { PaletteCommand } from './CommandPalette.types';\nimport type { CommandPaletteCopy } from '../../../copy';\nimport { rem, sxRem } from '../../../tokens/relative';\n\nconst ResultsList = styled(List)(({ theme }) => ({\n maxHeight: 400,\n overflowY: 'auto',\n padding: theme.spacing(1),\n '&::-webkit-scrollbar': {\n width: 8,\n },\n '&::-webkit-scrollbar-track': {\n background: alpha(theme.palette.action.disabled, 0.1),\n },\n '&::-webkit-scrollbar-thumb': {\n background: alpha(theme.palette.primary.main, 0.3),\n borderRadius: 4,\n '&:hover': {\n background: alpha(theme.palette.primary.main, 0.5),\n },\n },\n}));\n\nconst CommandItem = styled(ListItem)<{ selected?: boolean }>(({ theme, selected }) => ({\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(0.5),\n transition: theme.transitions.create(['background-color', 'transform']),\n cursor: 'pointer',\n ...(selected && {\n backgroundColor: alpha(theme.palette.primary.main, 0.12),\n transform: 'translateX(4px)',\n '& .MuiListItemIcon-root': {\n color: theme.palette.primary.main,\n },\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n },\n}));\n\nconst CategoryLabel = styled(Typography)(({ theme }) => ({\n fontSize: rem(theme, 12),\n fontWeight: 600,\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n letterSpacing: '0.1em',\n padding: theme.spacing(1, 2, 0.5, 2),\n marginTop: theme.spacing(1),\n}));\n\nconst NoResults = styled(Box)(({ theme }) => ({\n padding: theme.spacing(4, 2),\n textAlign: 'center',\n color: theme.palette.text.secondary,\n}));\n\nconst CommandRow: React.FC<{\n command: PaletteCommand;\n index: number;\n selected: boolean;\n dataTestId?: string;\n onSelect: (index: number) => void;\n onExecute: (command: PaletteCommand) => void;\n}> = ({ command, index, selected, dataTestId, onSelect, onExecute }) => (\n <CommandItem\n data-index={index}\n data-testid={`${dataTestId}-item-${command.id}`}\n selected={selected}\n onClick={() => onExecute(command)}\n onMouseEnter={() => onSelect(index)}\n >\n {command.icon && <ListItemIcon sx={{ minWidth: 40 }}>{command.icon}</ListItemIcon>}\n <ListItemText\n primary={command.label}\n secondary={command.description}\n primaryTypographyProps={{ fontSize: sxRem(14.4), fontWeight: selected ? 500 : 400 }}\n secondaryTypographyProps={{ fontSize: sxRem(12) }}\n />\n {command.shortcut && <ShortcutChip label={command.shortcut} size=\"small\" />}\n </CommandItem>\n);\n\nconst slug = (value: string) => value.toLowerCase().replace(/\\s+/g, '-');\n\n// The list, its recent section and the empty state. The running commandIndex\n// has to stay consistent across both sections, so it is threaded through here\n// rather than mutated from inside the render as it was before.\nexport const PaletteResults: React.FC<{\n copy: CommandPaletteCopy;\n listRef: React.Ref<globalThis.HTMLUListElement>;\n dataTestId?: string;\n searchQuery: string;\n showRecent?: boolean;\n commands: PaletteCommand[];\n recentCommandIds: string[];\n filteredCommands: PaletteCommand[];\n groupedCommands: Record<string, PaletteCommand[]>;\n selectedIndex: number;\n onSelect: (index: number) => void;\n onExecute: (command: PaletteCommand) => void;\n}> = ({\n copy,\n listRef,\n dataTestId,\n searchQuery,\n showRecent,\n commands,\n recentCommandIds,\n filteredCommands,\n groupedCommands,\n selectedIndex,\n onSelect,\n onExecute,\n}) => {\n if (filteredCommands.length === 0) {\n return (\n <NoResults data-testid={`${dataTestId}-no-results`}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No commands found for \"{searchQuery}\"\n </Typography>\n <Typography variant=\"caption\" color=\"text.disabled\" sx={{ mt: 1 }}>\n {copy.tryAnotherTerm}\n </Typography>\n </NoResults>\n );\n }\n\n const showRecentSection = !searchQuery && showRecent && recentCommandIds.length > 0;\n const recent = showRecentSection\n ? (recentCommandIds\n .map((id) => commands.find((command) => command.id === id))\n .filter(Boolean) as PaletteCommand[])\n : [];\n\n // One running index across both sections, so keyboard selection lines up with\n // what is on screen.\n let commandIndex = 0;\n const row = (command: PaletteCommand) => {\n const index = commandIndex++;\n return (\n <CommandRow\n key={command.id}\n command={command}\n index={index}\n selected={index === selectedIndex}\n dataTestId={dataTestId}\n onSelect={onSelect}\n onExecute={onExecute}\n />\n );\n };\n\n const showCategoryLabels = Object.keys(groupedCommands).length > 1;\n\n return (\n <ResultsList ref={listRef} data-testid={`${dataTestId}-list`}>\n {showRecentSection && (\n <>\n <CategoryLabel data-testid={`${dataTestId}-group-recent`}>\n <RecentIcon sx={{ fontSize: sxRem(14), mr: 0.5, verticalAlign: 'middle' }} />\n {copy.recent}\n </CategoryLabel>\n {recent.map(row)}\n {filteredCommands.length > recentCommandIds.length && <Divider sx={{ my: 1 }} />}\n </>\n )}\n\n {Object.entries(groupedCommands).map(([category, categoryCommands]) => (\n <Box key={category} data-testid={`${dataTestId}-group-${slug(category)}`}>\n {showCategoryLabels && (\n <CategoryLabel data-testid={`${dataTestId}-group-label-${slug(category)}`}>\n {category}\n </CategoryLabel>\n )}\n {categoryCommands.map(row)}\n </Box>\n ))}\n </ResultsList>\n );\n};\n"],"mappings":";;;;;;;;;AAAA,OAAO,gBAAgB;AACvB,OAAO,SAAS;AAChB,OAAO,aAAa;AACpB,OAAO,UAAU;AACjB,OAAO,cAAc;AACrB,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,OAAO,gBAAgB;AACvB,SAAS,OAAO,cAAc;AAoE5B,SA6FM,UAtFa,KAPnB;AA5DF,IAAM,cAAc,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EAC/C,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS,MAAM,QAAQ,CAAC;AAAA,EACxB,wBAAwB;AAAA,IACtB,OAAO;AAAA,EACT;AAAA,EACA,8BAA8B;AAAA,IAC5B,YAAY,MAAM,MAAM,QAAQ,OAAO,UAAU,GAAG;AAAA,EACtD;AAAA,EACA,8BAA8B;AAAA,IAC5B,YAAY,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,IACjD,cAAc;AAAA,IACd,WAAW;AAAA,MACT,YAAY,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAAA,IACnD;AAAA,EACF;AACF,EAAE;AAEF,IAAM,cAAc,OAAO,QAAQ,EAA0B,CAAC,EAAE,OAAO,SAAS,OAAO;AAAA,EACrF,cAAc,MAAM,MAAM;AAAA,EAC1B,cAAc,MAAM,QAAQ,GAAG;AAAA,EAC/B,YAAY,MAAM,YAAY,OAAO,CAAC,oBAAoB,WAAW,CAAC;AAAA,EACtE,QAAQ;AAAA,EACR,GAAI,YAAY;AAAA,IACd,iBAAiB,MAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAAA,IACvD,WAAW;AAAA,IACX,2BAA2B;AAAA,MACzB,OAAO,MAAM,QAAQ,QAAQ;AAAA,IAC/B;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,iBAAiB,MAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAAA,EACzD;AACF,EAAE;AAEF,IAAM,gBAAgB,OAAO,UAAU,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACvD,UAAU,IAAI,OAAO,EAAE;AAAA,EACvB,YAAY;AAAA,EACZ,OAAO,MAAM,QAAQ,KAAK;AAAA,EAC1B,eAAe;AAAA,EACf,eAAe;AAAA,EACf,SAAS,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC;AAAA,EACnC,WAAW,MAAM,QAAQ,CAAC;AAC5B,EAAE;AAEF,IAAM,YAAY,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EAC5C,SAAS,MAAM,QAAQ,GAAG,CAAC;AAAA,EAC3B,WAAW;AAAA,EACX,OAAO,MAAM,QAAQ,KAAK;AAC5B,EAAE;AAEF,IAAM,aAOD,CAAC,EAAE,SAAS,OAAO,UAAU,YAAY,UAAU,UAAU,MAChE;AAAA,EAAC;AAAA;AAAA,IACC,cAAY;AAAA,IACZ,eAAa,GAAG,UAAU,SAAS,QAAQ,EAAE;AAAA,IAC7C;AAAA,IACA,SAAS,MAAM,UAAU,OAAO;AAAA,IAChC,cAAc,MAAM,SAAS,KAAK;AAAA,IAEjC;AAAA,cAAQ,QAAQ,oBAAC,gBAAa,IAAI,EAAE,UAAU,GAAG,GAAI,kBAAQ,MAAK;AAAA,MACnE;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,QAAQ;AAAA,UACjB,WAAW,QAAQ;AAAA,UACnB,wBAAwB,EAAE,UAAU,MAAM,IAAI,GAAG,YAAY,WAAW,MAAM,IAAI;AAAA,UAClF,0BAA0B,EAAE,UAAU,MAAM,EAAE,EAAE;AAAA;AAAA,MAClD;AAAA,MACC,QAAQ,YAAY,oBAAC,gBAAa,OAAO,QAAQ,UAAU,MAAK,SAAQ;AAAA;AAAA;AAC3E;AAGF,IAAM,OAAO,CAAC,UAAkB,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAKhE,IAAM,iBAaR,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,iBAAiB,WAAW,GAAG;AACjC,WACE,qBAAC,aAAU,eAAa,GAAG,UAAU,eACnC;AAAA,2BAAC,cAAW,SAAQ,SAAQ,OAAM,kBAAiB;AAAA;AAAA,QACzB;AAAA,QAAY;AAAA,SACtC;AAAA,MACA,oBAAC,cAAW,SAAQ,WAAU,OAAM,iBAAgB,IAAI,EAAE,IAAI,EAAE,GAC7D,eAAK,gBACR;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,oBAAoB,CAAC,eAAe,cAAc,iBAAiB,SAAS;AAClF,QAAM,SAAS,oBACV,iBACE,IAAI,CAAC,OAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,EAAE,CAAC,EACzD,OAAO,OAAO,IACjB,CAAC;AAIL,MAAI,eAAe;AACnB,QAAM,MAAM,CAAC,YAA4B;AACvC,UAAM,QAAQ;AACd,WACE;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA,UAAU,UAAU;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MANK,QAAQ;AAAA,IAOf;AAAA,EAEJ;AAEA,QAAM,qBAAqB,OAAO,KAAK,eAAe,EAAE,SAAS;AAEjE,SACE,qBAAC,eAAY,KAAK,SAAS,eAAa,GAAG,UAAU,SAClD;AAAA,yBACC,iCACE;AAAA,2BAAC,iBAAc,eAAa,GAAG,UAAU,iBACvC;AAAA,4BAAC,cAAW,IAAI,EAAE,UAAU,MAAM,EAAE,GAAG,IAAI,KAAK,eAAe,SAAS,GAAG;AAAA,QAC1E,KAAK;AAAA,SACR;AAAA,MACC,OAAO,IAAI,GAAG;AAAA,MACd,iBAAiB,SAAS,iBAAiB,UAAU,oBAAC,WAAQ,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA,OAChF;AAAA,IAGD,OAAO,QAAQ,eAAe,EAAE,IAAI,CAAC,CAAC,UAAU,gBAAgB,MAC/D,qBAAC,OAAmB,eAAa,GAAG,UAAU,UAAU,KAAK,QAAQ,CAAC,IACnE;AAAA,4BACC,oBAAC,iBAAc,eAAa,GAAG,UAAU,gBAAgB,KAAK,QAAQ,CAAC,IACpE,oBACH;AAAA,MAED,iBAAiB,IAAI,GAAG;AAAA,SANjB,QAOV,CACD;AAAA,KACH;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/Separator/Separator.styles.ts"],"sourcesContent":["import type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport type {\n SeparatorOrientation,\n SeparatorProps,\n SeparatorSize,\n SeparatorVariant,\n} from './Separator.types';\n\nconst THICKNESS_PX: Record<SeparatorSize, number> = {\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 6,\n};\n\nconst MARGIN_PX: Record<SeparatorSize, number> = {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n};\n\nconst separatorThickness = (size: SeparatorSize): number =>\n THICKNESS_PX[size] ?? THICKNESS_PX.md;\n\n/** An explicit `margin` wins; otherwise the size picks one. */\nexport const separatorMargin = (\n size: SeparatorSize,\n margin?: number | string,\n): number | string => margin ?? MARGIN_PX[size] ?? MARGIN_PX.md;\n\n// `gradient` paints a background rather than a border, so it draws its line as a\n// solid border of zero visual consequence.\nconst borderStyleFor = (variant: SeparatorVariant): 'dashed' | 'dotted' | 'solid' => {\n switch (variant) {\n case 'dashed':\n return 'dashed';\n case 'dotted':\n return 'dotted';\n default:\n return 'solid';\n }\n};\n\nconst gradientBackground = (\n variant: SeparatorVariant,\n orientation: SeparatorOrientation,\n color: string,\n): string | undefined => {\n if (variant !== 'gradient') return undefined;\n const angle = orientation === 'horizontal' ? '90deg' : '180deg';\n return `linear-gradient(${angle}, transparent 0%, ${color} 50%, transparent 100%)`;\n};\n\n// Only the leading edge carries the rule; the other three are zeroed explicitly so\n// a parent's border shorthand cannot leak through.\nconst borderEdges = (\n isHorizontal: boolean,\n thickness: number,\n style: 'dashed' | 'dotted' | 'solid',\n color: string,\n): CSSObject => {\n const leading = isHorizontal ? 'Top' : 'Left';\n const blank: CSSObject = {\n borderTopWidth: 0,\n borderBottomWidth: 0,\n borderLeftWidth: 0,\n borderRightWidth: 0,\n borderTopStyle: 'none',\n borderBottomStyle: 'none',\n borderLeftStyle: 'none',\n borderRightStyle: 'none',\n borderTopColor: 'transparent',\n borderBottomColor: 'transparent',\n borderLeftColor: 'transparent',\n borderRightColor: 'transparent',\n };\n\n return {\n ...blank,\n [`border${leading}Width`]: thickness,\n [`border${leading}Style`]: style,\n [`border${leading}Color`]: color,\n };\n};\n\ntype SeparatorStyleArgs = Required<\n Pick<SeparatorProps, 'variant' | 'orientation' | 'size'>\n> &\n Pick<SeparatorProps, 'color' | 'margin' | 'length'>;\n\n/**\n * The separator's margin, on the axis it separates along only: above and below\n * a horizontal rule, either side of a vertical one. A margin given as a string\n * carries its own units; a number is pixels.\n *\n * The LABELLED separator uses this too. It used to hand the number straight to\n * `sx.margin`, where a number is SPACING UNITS — `md`'s 16 drew 128px on all\n * four sides, against 16px above and below for the unlabelled one.\n */\nexport const separatorBlockMargin = (\n size: SeparatorSize,\n margin: number | string | undefined,\n isHorizontal: boolean,\n): string => {\n const value = separatorMargin(size, margin);\n const length = typeof value === 'string' ? value : `${value}px`;\n return isHorizontal ? `${length} 0` : `0 ${length}`;\n};\n\nexport const separatorStyles = (\n theme: Theme,\n { variant, orientation, size, color, margin, length }: SeparatorStyleArgs,\n): CSSObject => {\n const isHorizontal = orientation === 'horizontal';\n const thickness = separatorThickness(size);\n const resolvedColor = color || theme.palette.divider;\n\n const baseStyles: CSSObject = {\n display: 'flex',\n alignItems: 'center',\n margin: separatorBlockMargin(size, margin, isHorizontal),\n width: isHorizontal ? length || '100%' : `${thickness}px`,\n height: isHorizontal ? `${thickness}px` : length || '100%',\n boxSizing: 'border-box',\n };\n\n if (variant === 'gradient') {\n return {\n ...baseStyles,\n background: gradientBackground(variant, orientation, resolvedColor),\n };\n }\n\n return {\n ...baseStyles,\n backgroundColor: 'transparent',\n ...borderEdges(isHorizontal, thickness, borderStyleFor(variant), resolvedColor),\n };\n};\n"],"mappings":";AASA,IAAM,eAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,YAA2C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,qBAAqB,CAAC,SAC1B,aAAa,IAAI,KAAK,aAAa;AAG9B,IAAM,kBAAkB,CAC7B,MACA,WACoB,UAAU,UAAU,IAAI,KAAK,UAAU;AAI7D,IAAM,iBAAiB,CAAC,YAA6D;AACnF,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,qBAAqB,CACzB,SACA,aACA,UACuB;AACvB,MAAI,YAAY,WAAY,QAAO;AACnC,QAAM,QAAQ,gBAAgB,eAAe,UAAU;AACvD,SAAO,mBAAmB,KAAK,qBAAqB,KAAK;AAC3D;AAIA,IAAM,cAAc,CAClB,cACA,WACA,OACA,UACc;AACd,QAAM,UAAU,eAAe,QAAQ;AACvC,QAAM,QAAmB;AAAA,IACvB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,CAAC,SAAS,OAAO,OAAO,GAAG;AAAA,IAC3B,CAAC,SAAS,OAAO,OAAO,GAAG;AAAA,IAC3B,CAAC,SAAS,OAAO,OAAO,GAAG;AAAA,EAC7B;AACF;AAgBO,IAAM,uBAAuB,CAClC,MACA,QACA,iBACW;AACX,QAAM,QAAQ,gBAAgB,MAAM,MAAM;AAC1C,QAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,GAAG,KAAK;AAC3D,SAAO,eAAe,GAAG,MAAM,OAAO,KAAK,MAAM;AACnD;AAEO,IAAM,kBAAkB,CAC7B,OACA,EAAE,SAAS,aAAa,MAAM,OAAO,QAAQ,OAAO,MACtC;AACd,QAAM,eAAe,gBAAgB;AACrC,QAAM,YAAY,mBAAmB,IAAI;AACzC,QAAM,gBAAgB,SAAS,MAAM,QAAQ;AAE7C,QAAM,aAAwB;AAAA,IAC5B,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ,qBAAqB,MAAM,QAAQ,YAAY;AAAA,IACvD,OAAO,eAAe,UAAU,SAAS,GAAG,SAAS;AAAA,IACrD,QAAQ,eAAe,GAAG,SAAS,OAAO,UAAU;AAAA,IACpD,WAAW;AAAA,EACb;AAEA,MAAI,YAAY,YAAY;AAC1B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY,mBAAmB,SAAS,aAAa,aAAa;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iBAAiB;AAAA,IACjB,GAAG,YAAY,cAAc,WAAW,eAAe,OAAO,GAAG,aAAa;AAAA,EAChF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/SettingsLayout/SettingsSectionHeader.tsx"],"sourcesContent":["'use client';\n\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport Box from '@mui/material/Box/index.js';\nimport React from 'react';\n\nimport { displayAcrossRail, TOUCH_TARGET } from './SettingsLayout.styles';\nimport type { SettingsLayoutProps, SettingsRailBreakpoint } from './SettingsLayout.types';\nimport { sxRem } from '../../../tokens/relative';\n\n/** One line that must not wrap, whatever the section is called. */\nconst CLIP = {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n} as const;\n\n/**\n * The name of where you are, and optionally what it holds.\n *\n * `minWidth: 0` on the wrapper is what lets the clipping work at all: without\n * it a flex item refuses to shrink below its content, so a long section name\n * pushes the back button off the row instead of ellipsising.\n */\nfunction HeaderText({\n title,\n description,\n}: {\n title: string;\n description?: string;\n}): React.JSX.Element {\n return (\n <Box sx={{ minWidth: 0 }}>\n <Box\n component=\"h2\"\n sx={{ m: 0, font: 'inherit', fontSize: sxRem(16), fontWeight: 600, lineHeight: 1.3, ...CLIP }}\n >\n {title}\n </Box>\n {description !== undefined && description !== '' && (\n <Box\n component=\"p\"\n sx={{\n m: 0,\n font: 'inherit',\n fontSize: sxRem(13),\n color: 'text.secondary',\n lineHeight: 1.35,\n ...CLIP,\n }}\n >\n {description}\n </Box>\n )}\n </Box>\n );\n}\n\n/**\n * The narrow-width panel header: a back control, and the name of where you are.\n *\n * ## Why this replaced a \"‹ Voltar\" link\n *\n * The bare link spent a whole row saying only that a back existed. Under it came\n * the sibling chips and under those the section's own Salvar, so three stacked\n * rows went by before the first field — on the width with the least room for\n * them. Worse, none of the three said WHICH section was open: the chips mark the\n * active one, but a chip strip scrolls, so the answer could be off-screen.\n *\n * Folding the control into a square button beside the title buys back a row and\n * makes the header say where you are, which is what a header is for.\n *\n * ## Narrow only, and mounted at every width\n *\n * `displayAcrossRail` hides this above the breakpoint rather than unmounting it,\n * for the reason the whole component works that way: navigation that exists at\n * one width and not the other is navigation nothing can assert about. Above the\n * breakpoint the rail is on screen with the open row marked, so a back control\n * would point at a list already visible.\n *\n * The button is `TOUCH_TARGET` square because this is the phone shape, and it\n * keeps the accessible name — the visible text is the section, not the verb, so\n * a screen reader still hears \"Voltar\" rather than being handed an icon.\n */\nexport function SettingsSectionHeader({\n href,\n backLabel,\n title,\n description,\n breakpoint,\n linkComponent,\n testIdPrefix,\n}: {\n href: string;\n backLabel: string;\n title: string;\n description?: string;\n breakpoint: SettingsRailBreakpoint;\n linkComponent: NonNullable<SettingsLayoutProps['linkComponent']>;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Box\n data-testid={`${testIdPrefix}-section-header`}\n sx={(theme) => ({\n ...displayAcrossRail(theme, breakpoint, 'flex', 'none'),\n alignItems: 'center',\n gap: 1.5,\n minWidth: 0,\n // ITS OWN SURFACE, not the panel's.\n //\n // The header, the chip strip and the first card were all the same\n // white, so nothing said where \"you are here\" ended and the screen\n // began — the eye had only the type sizes to go on. A tint plus the\n // rule below turns three stacked runs of text into two blocks.\n //\n // `paper` against a `default` panel rather than a hand-picked grey, so\n // it tracks the host's theme (and its dark mode) instead of being a\n // light-mode constant that goes wrong the moment the palette does.\n bgcolor: 'background.paper',\n px: 1.5,\n pt: 1.5,\n pb: 1.5,\n mb: 1,\n borderRadius: 1,\n // A rule under the header, because what follows it is the sibling strip\n // — a row of other sections. Without a line the section's own name and\n // the chip naming a DIFFERENT section sit in one undifferentiated\n // block, which reads as one navigation rather than as \"you are here\"\n // above \"go elsewhere\".\n borderBottom: 1,\n borderColor: 'divider',\n })}\n >\n <Box\n component={linkComponent}\n href={href}\n aria-label={backLabel}\n data-testid={`${testIdPrefix}-back`}\n sx={(theme) => ({\n flex: '0 0 auto',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: TOUCH_TARGET,\n height: TOUCH_TARGET,\n border: 1,\n borderColor: 'divider',\n borderRadius: 2,\n color: 'text.primary',\n textDecoration: 'none',\n '&:hover': { backgroundColor: theme.palette.action.hover },\n })}\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </Box>\n\n <HeaderText title={title} description={description} />\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;AAEA,OAAO,qBAAqB;AAC5B,OAAO,SAAS;AA6BZ,SACE,KADF;AArBJ,IAAM,OAAO;AAAA,EACX,UAAU;AAAA,EACV,cAAc;AAAA,EACd,YAAY;AACd;AASA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AACF,GAGsB;AACpB,SACE,qBAAC,OAAI,IAAI,EAAE,UAAU,EAAE,GACrB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,IAAI,EAAE,GAAG,GAAG,MAAM,WAAW,UAAU,MAAM,EAAE,GAAG,YAAY,KAAK,YAAY,KAAK,GAAG,KAAK;AAAA,QAE3F;AAAA;AAAA,IACH;AAAA,IACC,gBAAgB,UAAa,gBAAgB,MAC5C;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,IAAI;AAAA,UACF,GAAG;AAAA,UACH,MAAM;AAAA,UACN,UAAU,MAAM,EAAE;AAAA,UAClB,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,GAAG;AAAA,QACL;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;AA4BO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQsB;AACpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa,GAAG,YAAY;AAAA,MAC5B,IAAI,CAAC,WAAW;AAAA,QACd,GAAG,kBAAkB,OAAO,YAAY,QAAQ,MAAM;AAAA,QACtD,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWV,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMd,cAAc;AAAA,QACd,aAAa;AAAA,MACf;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,YACX;AAAA,YACA,cAAY;AAAA,YACZ,eAAa,GAAG,YAAY;AAAA,YAC5B,IAAI,CAAC,WAAW;AAAA,cACd,MAAM;AAAA,cACN,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,aAAa;AAAA,cACb,cAAc;AAAA,cACd,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,WAAW,EAAE,iBAAiB,MAAM,QAAQ,OAAO,MAAM;AAAA,YAC3D;AAAA,YAEA,8BAAC,mBAAgB,UAAS,SAAQ;AAAA;AAAA,QACpC;AAAA,QAEA,oBAAC,cAAW,OAAc,aAA0B;AAAA;AAAA;AAAA,EACtD;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/SettingsLayout/SettingsSectionChips.tsx"],"sourcesContent":["'use client';\n\nimport Box from '@mui/material/Box/index.js';\nimport { alpha, useTheme, type Theme } from '@mui/material/styles/index.js';\nimport React, { useEffect, useRef, type RefObject } from 'react';\n\nimport { SettingsStatusMarker } from './SettingsStatusMarker';\nimport { TOUCH_TARGET } from './SettingsLayout.styles';\nimport { rem } from '../../../tokens/relative';\n\n/**\n * The chip's drawn height, against `TOUCH_TARGET`'s 44 for the tappable one.\n *\n * The strip sits between a section's header and its first field on the width\n * with the least room for either, so the pill is sized to its text rather than\n * to the thumb — and the thumb is served by the hit area instead.\n */\nconst CHIP_HEIGHT = 34;\nimport type { SettingsLayoutProps, SettingsNavItem } from './SettingsLayout.types';\n\nexport interface SettingsSectionChipsProps {\n /** The sibling sections to offer — usually the open item's own group. */\n items: SettingsNavItem[];\n /** Which one is open. */\n activeItemId?: string;\n /** Accessible name of the strip, in the host's language. */\n ariaLabel: string;\n linkComponent?: SettingsLayoutProps['linkComponent'];\n onSelectItem?: (id: string) => void;\n testIdPrefix: string;\n}\n\n/** True when the visitor asked the OS for less movement. Re-read per scroll. */\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * Keep the open section's chip in view, however the visitor got here.\n *\n * Keyed on `activeItemId` in an effect rather than done in a click handler:\n * arriving by the desktop rail, by a card, by a pasted link and by the browser's\n * back button all have to land the same way, and only one of those is a click on\n * a chip. Every re-render otherwise starts the strip at scroll 0, which parks\n * the active chip off the right edge on any list longer than a screen — the\n * visitor is told where they are by an element they cannot see.\n *\n * `itemsKey` rather than `items`: a host almost always rebuilds that array per\n * render (`groups.flatMap(...)`), and depending on it would re-run this on every\n * render and yank the strip back mid-drag.\n *\n * The key joins on NUL — as the ESCAPE `'\\u0000'`, which it must stay. A\n * literal NUL byte works identically at runtime and makes git classify this file\n * as BINARY: `git diff` prints \"Binary file not shown\" and the GitHub review UI\n * shows nothing at all. This file shipped that way once, and the cost was not\n * the byte — it was a whole change nobody could read.\n */\nfunction useCentreActiveChip(\n stripRef: RefObject<HTMLDivElement | null>,\n activeItemId: string | undefined,\n itemsKey: string,\n): void {\n useEffect(() => {\n const strip = stripRef.current;\n if (!strip || !activeItemId) return;\n // Walked rather than selected: an id is host data, and a section id carrying\n // a quote would turn a selector string into a thrown SyntaxError — which\n // here would take the whole strip down to centre one chip.\n const chip = Array.from(strip.children).find(\n (node): node is HTMLElement =>\n node instanceof HTMLElement && node.dataset.chipId === activeItemId,\n );\n if (!chip) return;\n // Feature-checked, not assumed. `Element.scrollTo` is absent in jsdom and in\n // a few embedded webviews, and an unguarded call there THROWS out of an\n // effect — which React escalates to the nearest error boundary. The whole\n // settings area would go down to centre one chip, and the host's own tests\n // could not render the shell at all. Same reasoning as walking the children\n // instead of building a selector: nothing in here is worth a crash.\n if (typeof strip.scrollTo !== 'function') return;\n const target = chip.offsetLeft + chip.offsetWidth / 2 - strip.clientWidth / 2;\n const left = Math.max(0, Math.min(target, strip.scrollWidth - strip.clientWidth));\n strip.scrollTo({ left, behavior: prefersReducedMotion() ? 'auto' : 'smooth' });\n }, [stripRef, activeItemId, itemsKey]);\n}\n\n/** One chip: a link when the host gave it a target, else a button. */\nfunction SectionChip({\n item,\n active,\n theme,\n linkComponent,\n onSelectItem,\n testIdPrefix,\n}: {\n item: SettingsNavItem;\n active: boolean;\n theme: Theme;\n linkComponent?: SettingsLayoutProps['linkComponent'];\n onSelectItem?: (id: string) => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const asLink = item.href !== undefined && linkComponent !== undefined;\n const behaviour = asLink\n ? { component: linkComponent, href: item.href }\n : { component: 'button' as const, type: 'button' as const, onClick: () => onSelectItem?.(item.id) };\n\n return (\n <Box\n {...behaviour}\n data-chip-id={item.id}\n data-testid={`${testIdPrefix}-chip-${item.id}`}\n aria-current={active ? 'page' : undefined}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.75,\n flex: '0 0 auto',\n position: 'relative',\n // The chip LOOKS this tall; it is still tapped at `TOUCH_TARGET`.\n //\n // Shrinking `minHeight` alone would have bought a slimmer strip with a\n // smaller hit area — on the one width where the strip IS the navigation\n // and the input is a thumb. The `::after` below keeps the tappable\n // region at the full target while the pill itself takes less room, so\n // this is a visual change and not an accessibility trade.\n minHeight: CHIP_HEIGHT,\n px: 1.5,\n borderRadius: 999,\n cursor: 'pointer',\n font: 'inherit',\n fontSize: rem(theme, 13),\n fontWeight: active ? 700 : 500,\n textDecoration: 'none',\n whiteSpace: 'nowrap',\n color: active ? 'primary.main' : 'text.secondary',\n bgcolor: active ? alpha(theme.palette.primary.main, 0.12) : 'transparent',\n border: `1px solid ${active ? alpha(theme.palette.primary.main, 0.4) : theme.palette.divider}`,\n // Spans the chip's width only, so neighbours never overlap: the strip\n // is a row, and the extra reach is vertical.\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n insetInlineStart: 0,\n insetInlineEnd: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n height: TOUCH_TARGET,\n },\n }}\n >\n {item.status ? (\n <SettingsStatusMarker\n status={item.status}\n label={item.statusLabel}\n testId={`${testIdPrefix}-chip-status-${item.id}`}\n />\n ) : null}\n {item.label}\n </Box>\n );\n}\n\n/**\n * The narrow-width section strip: horizontally scrollable chips for the sections\n * beside the open one.\n *\n * It clips its own overflow — `overflow-x: auto` on the strip, never on an\n * ancestor. A strip that pushes the page wide makes every OTHER screen at that\n * width scroll sideways too, and the cause is nowhere near the symptom.\n */\nexport function SettingsSectionChips({\n items,\n activeItemId,\n ariaLabel,\n linkComponent,\n onSelectItem,\n testIdPrefix,\n}: SettingsSectionChipsProps): React.JSX.Element {\n const theme = useTheme();\n const stripRef = useRef<HTMLDivElement | null>(null);\n useCentreActiveChip(stripRef, activeItemId, items.map((item) => item.id).join('\\u0000'));\n\n return (\n <Box\n ref={stripRef}\n component=\"nav\"\n aria-label={ariaLabel}\n data-testid={`${testIdPrefix}-chips`}\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.75,\n px: 0.25,\n py: 0.25,\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n }}\n >\n {items.map((item) => (\n <SectionChip\n key={item.id}\n item={item}\n active={item.id === activeItemId}\n theme={theme}\n linkComponent={linkComponent}\n onSelectItem={onSelectItem}\n testIdPrefix={testIdPrefix}\n />\n ))}\n </Box>\n );\n}\n\nSettingsSectionChips.displayName = 'SettingsSectionChips';\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/feedback/Sonner/Sonner.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Portal from '@mui/material/Portal/index.js';\nimport React, { createContext, useCallback, useContext, useRef,useState, useMemo } from 'react';\n\nimport { sxRem } from '../../../tokens/relative';\n\nimport type { SonnerContextType, SonnerItem,SonnerProps } from './Sonner.types';\n\nconst SonnerContext = createContext<SonnerContextType | null>(null);\n\nconst DEFAULT_DURATION_MS = 4000;\n\nconst buildToastItem = (\n toast: Omit<SonnerProps, 'id'>,\n id: string,\n type?: SonnerProps['type'],\n): SonnerItem => ({\n ...toast,\n id,\n type: type || toast.type || 'default',\n createdAt: Date.now(),\n visible: true });\n\n// Persistent toasts and `duration: 0` stay until dismissed explicitly.\nconst scheduleAutoDismiss = (\n toast: Omit<SonnerProps, 'id'>,\n id: string,\n dismiss: (id?: string) => void,\n) => {\n if (toast.persistent || toast.duration === 0) return;\n\n window.setTimeout(() => dismiss(id), toast.duration ?? DEFAULT_DURATION_MS);\n};\n\nconst EXIT_TRANSITION_MS = 300;\n\ntype SonnerPromiseOptions<T> = {\n loading: React.ReactNode;\n success: React.ReactNode | ((data: T) => React.ReactNode);\n error: React.ReactNode | ((error: Error) => React.ReactNode);\n};\n\nconst resolveMessage = <T,>(\n message: React.ReactNode | ((value: T) => React.ReactNode),\n value: T,\n): React.ReactNode => (typeof message === 'function' ? message(value) : message);\n\n// Shows a pinned loading toast for the life of a promise, then swaps it for a\n// success or error one. Takes the shortcuts it needs rather than reaching for\n// context, so it is testable on its own.\nconst trackPromiseWithToasts = async <T,>(\n promiseToResolve: Promise<T>,\n options: SonnerPromiseOptions<T>,\n toasts: {\n loading: (message: React.ReactNode) => string;\n success: (message: React.ReactNode) => string;\n error: (message: React.ReactNode) => string;\n dismiss: (id?: string) => void;\n },\n): Promise<T> => {\n const toastId = toasts.loading(options.loading);\n\n try {\n const data = await promiseToResolve;\n toasts.dismiss(toastId);\n toasts.success(resolveMessage(options.success, data));\n return data;\n } catch (err) {\n toasts.dismiss(toastId);\n toasts.error(resolveMessage(options.error, err instanceof Error ? err : new Error(String(err))));\n throw err;\n }\n};\n\nexport const SonnerProvider: React.FC<{\n children: React.ReactNode;\n /**\n * The dismiss button's accessible name, for every toast this provider\n * raises. REQUIRED and mounted ONCE — the shortcut helpers\n * (`sonner.success(…)`) take a message and nothing else by design, so the\n * word cannot be a per-call argument without changing what they are for.\n */\n dismissLabel: string;\n}> = ({ children, dismissLabel }) => {\n const [toasts, setToasts] = useState<SonnerItem[]>([]);\n const toastCounter = useRef(0);\n\n // Hide first, then drop after the exit transition. Passing no id targets every\n // toast; the two branches only differ in which toasts they match, so that is\n // the only thing that varies here.\n const dismiss = useCallback((id?: string) => {\n const matches = (toast: SonnerItem) => id === undefined || toast.id === id;\n\n setToasts((prev) =>\n prev.map((toast) => (matches(toast) ? { ...toast, visible: false } : toast)),\n );\n\n window.setTimeout(() => {\n setToasts((prev) => prev.filter((toast) => !matches(toast)));\n }, EXIT_TRANSITION_MS);\n }, []);\n\n const addToast = useCallback(\n (toast: Omit<SonnerProps, 'id'>, type?: SonnerProps['type']): string => {\n const id = `sonner-${++toastCounter.current}`;\n setToasts((prev) => [...prev, buildToastItem(toast, id, type)]);\n scheduleAutoDismiss(toast, id, dismiss);\n return id;\n },\n [dismiss],\n );\n\n // The six shortcuts differ only by the type they tag and, for loading, by\n // pinning persistent. Built from one factory rather than six near-identical\n // useCallback blocks.\n const makeShortcut = useCallback(\n (type: SonnerProps['type'], extra?: Partial<SonnerProps>) =>\n (message: React.ReactNode, options?: Partial<SonnerProps>) =>\n addToast({ dismissLabel, ...options, ...extra, title: message }, type),\n [addToast],\n );\n\n const toast = useMemo(() => makeShortcut('default'), [makeShortcut]);\n const success = useMemo(() => makeShortcut('success'), [makeShortcut]);\n const error = useMemo(() => makeShortcut('error'), [makeShortcut]);\n const warning = useMemo(() => makeShortcut('warning'), [makeShortcut]);\n const info = useMemo(() => makeShortcut('info'), [makeShortcut]);\n const loading = useMemo(\n () => makeShortcut('loading', { persistent: true }),\n [makeShortcut],\n );\n\n const promise = useCallback(\n <T,>(promiseToResolve: Promise<T>, options: SonnerPromiseOptions<T>): Promise<T> =>\n trackPromiseWithToasts(promiseToResolve, options, { loading, success, error, dismiss }),\n [loading, success, error, dismiss],\n );\n\n const contextValue: SonnerContextType = {\n toast,\n success,\n error,\n warning,\n info,\n loading,\n dismiss,\n promise };\n\n // Register this context globally for imperative API\n useRegisterGlobalToast(contextValue);\n\n return (\n <SonnerContext.Provider value={contextValue}>\n {children}\n <SonnerToaster toasts={toasts} onDismiss={dismiss} />\n </SonnerContext.Provider>\n );\n};\n\nexport const useSonner = (): SonnerContextType => {\n const context = useContext(SonnerContext);\n if (!context) {\n throw new Error('useSonner must be used within a SonnerProvider');\n }\n return context;\n};\n\n// A caller-supplied icon always wins; otherwise the type picks one.\nimport { SonnerToast } from './SonnerToast';\n\nconst SonnerToaster: React.FC<{\n toasts: SonnerItem[];\n onDismiss: (id: string) => void;\n}> = ({ toasts, onDismiss }) => {\n // Limit visible toasts to prevent overflow\n const MAX_VISIBLE_TOASTS = 5;\n const visibleToasts = toasts.slice(-MAX_VISIBLE_TOASTS);\n const hiddenCount = Math.max(0, toasts.length - MAX_VISIBLE_TOASTS);\n\n return (\n <Portal>\n <Box\n sx={{\n position: 'fixed',\n top: 16,\n right: 16,\n zIndex: 9999,\n display: 'flex',\n flexDirection: 'column',\n pointerEvents: 'none',\n maxHeight: 'calc(100vh - 32px)',\n overflowY: 'auto',\n overflowX: 'hidden' }}\n >\n {hiddenCount > 0 && (\n <Box\n sx={{\n p: 1,\n mb: 0.5,\n textAlign: 'center',\n fontSize: sxRem(12),\n color: 'text.secondary',\n pointerEvents: 'none' }}\n >\n +{hiddenCount} more\n </Box>\n )}\n {visibleToasts.map((toast) => (\n <Box key={toast.id} sx={{ pointerEvents: 'auto' }}>\n <SonnerToast {...toast} onDismiss={onDismiss} />\n </Box>\n ))}\n </Box>\n </Portal>\n );\n};\n\n// Global toast instance for imperative API\nlet globalToastContext: SonnerContextType | null = null;\n\n// Hook to register the global context (used internally by SonnerProvider)\nexport const useRegisterGlobalToast = (context: SonnerContextType) => {\n React.useEffect(() => {\n globalToastContext = context;\n return () => {\n globalToastContext = null;\n };\n }, [context]);\n};\n\n// Create a production-ready toast instance for imperative usage\nconst createToastInstance = (): SonnerContextType => {\n const warnNoProvider = () => {\n // Use a more React-appropriate warning mechanism\n if (typeof window !== 'undefined' && window.console && window.console.warn) {\n window.console.warn('Sonner: No SonnerProvider found. Please wrap your app with SonnerProvider.');\n }\n };\n\n const methods: SonnerContextType = {\n toast: (message: React.ReactNode, options?: Partial<SonnerProps>) => {\n if (!globalToastContext) {\n warnNoProvider();\n return 'no-provider';\n }\n return globalToastContext.toast(message, options);\n },\n success: (message: React.ReactNode, options?: Partial<SonnerProps>) => {\n if (!globalToastContext) {\n warnNoProvider();\n return 'no-provider';\n }\n return globalToastContext.success(message, options);\n },\n error: (message: React.ReactNode, options?: Partial<SonnerProps>) => {\n if (!globalToastContext) {\n warnNoProvider();\n return 'no-provider';\n }\n return globalToastContext.error(message, options);\n },\n warning: (message: React.ReactNode, options?: Partial<SonnerProps>) => {\n if (!globalToastContext) {\n warnNoProvider();\n return 'no-provider';\n }\n return globalToastContext.warning(message, options);\n },\n info: (message: React.ReactNode, options?: Partial<SonnerProps>) => {\n if (!globalToastContext) {\n warnNoProvider();\n return 'no-provider';\n }\n return globalToastContext.info(message, options);\n },\n loading: (message: React.ReactNode, options?: Partial<SonnerProps>) => {\n if (!globalToastContext) {\n warnNoProvider();\n return 'no-provider';\n }\n return globalToastContext.loading(message, options);\n },\n dismiss: (id?: string) => {\n if (!globalToastContext) {\n warnNoProvider();\n return;\n }\n globalToastContext.dismiss(id);\n },\n promise: async <T,>(\n promiseToResolve: Promise<T>,\n options: {\n loading: React.ReactNode;\n success: React.ReactNode | ((data: T) => React.ReactNode);\n error: React.ReactNode | ((error: Error) => React.ReactNode);\n },\n ): Promise<T> => {\n if (!globalToastContext) {\n warnNoProvider();\n throw new Error('No SonnerProvider found');\n }\n return globalToastContext.promise(promiseToResolve, options);\n } };\n\n return methods;\n};\n\n// Export toast instance for imperative API usage\nexport const toast = createToastInstance();\n\n// Export Toaster as alias for SonnerProvider for stories compatibility\nexport const Toaster: React.FC<{\n children?: React.ReactNode;\n position?: string;\n theme?: string;\n expand?: boolean;\n richColors?: boolean;\n closeButton?: boolean;\n dismissLabel: string;\n}> = ({ children, dismissLabel }) => (\n <SonnerProvider dismissLabel={dismissLabel}>{children}</SonnerProvider>\n);\n"],"mappings":"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","names":["toast"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/navigation/AppHeader/AppHeader.tsx"],"sourcesContent":["'use client';\n\nimport Box from '@mui/material/Box/index.js';\nimport React from 'react';\n\nimport { sxRem } from '../../../tokens/relative';\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport type { AppHeaderProps } from './AppHeader.types';\n\n/** Bar height, before the optional `below` row. */\nconst BAR_MIN_HEIGHT = { regular: 64, dense: 52 } as const;\n\n/** The props {@link HEADER_DEFAULTS} guarantees a value for. */\ntype Defaulted =\n | 'position'\n | 'offsetTop'\n | 'maxWidth'\n | 'divider'\n | 'elevateOnScroll'\n | 'dense'\n | 'disableSpacer'\n | 'dataTestId';\n\n/** `AppHeaderProps` as the body sees them: nothing defaulted is still optional. */\ntype ResolvedHeaderProps = AppHeaderProps & Required<Pick<AppHeaderProps, Defaulted>>;\n\nconst HEADER_DEFAULTS: Pick<ResolvedHeaderProps, Defaulted> = {\n position: 'sticky',\n offsetTop: 0,\n maxWidth: 1200,\n divider: true,\n elevateOnScroll: false,\n dense: false,\n disableSpacer: false,\n dataTestId: 'app-header',\n};\n\n/**\n * Watch the document scroll so a lifted bar can cast a shadow only once there\n * is something under it. Inert (and never attaches a listener) when off.\n */\nfunction useScrolled(enabled: boolean): boolean {\n const [scrolled, setScrolled] = React.useState(false);\n React.useEffect(() => {\n if (!enabled) return undefined;\n const onScroll = (): void => setScrolled(window.scrollY > 0);\n onScroll();\n window.addEventListener('scroll', onScroll, { passive: true });\n return () => window.removeEventListener('scroll', onScroll);\n }, [enabled]);\n return enabled && scrolled;\n}\n\n/**\n * The bar's own height, republished whenever it changes.\n *\n * A `fixed` bar is out of flow, so something has to reserve its space — and a\n * constant cannot, because this bar's height is whatever the caller's slots add\n * up to. A search field in `below`, a status line, a wrapped title: each moves\n * it, and a hard-coded spacer would leave the page's first element under the\n * bar or floating below a gap.\n */\nfunction useMeasuredHeight(enabled: boolean): [React.RefObject<HTMLElement | null>, number] {\n const ref = React.useRef<HTMLElement | null>(null);\n const [height, setHeight] = React.useState(0);\n React.useEffect(() => {\n const node = ref.current;\n if (!enabled || !node) return undefined;\n const measure = (): void => setHeight(node.getBoundingClientRect().height);\n measure();\n // Measured once unconditionally, observed only where the API exists. jsdom\n // has no ResizeObserver, so constructing it unguarded takes down every\n // consumer's test that happens to render a fixed bar — a crash in THEIR\n // suite, thrown from a component they only laid out.\n if (typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, [enabled]);\n return [ref, height];\n}\n\n/**\n * The bar's own surface. Lifted out of the component both to keep it inside the\n * complexity bar and because the positioning rules are the fiddly part: a\n * `static` bar must claim neither a stacking context nor an offset, and only a\n * `fixed` one needs pinning to the viewport's edges.\n */\nfunction surfaceSx({\n position,\n offsetTop,\n divider,\n scrolled,\n}: Required<Pick<AppHeaderProps, 'position' | 'offsetTop' | 'divider'>> & {\n scrolled: boolean;\n}): Record<string, unknown> {\n return {\n position,\n ...(position === 'static' ? {} : { top: offsetTop, zIndex: 'appBar' }),\n ...(position === 'fixed' ? { left: 0, right: 0 } : {}),\n backgroundColor: 'background.paper',\n borderBottom: divider ? 1 : 0,\n borderColor: 'divider',\n boxShadow: scrolled ? 2 : 0,\n transition: 'box-shadow 150ms ease',\n };\n}\n\n/** The trailing column: the muted note, and the actions under it. */\nconst HeaderTrailing: React.FC<Pick<AppHeaderProps, 'meta' | 'actions'>> = ({ meta, actions }) => {\n if (!meta && !actions) return null;\n return (\n <Box\n sx={{\n flex: '0 0 auto',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: 0.5,\n }}\n >\n {meta && (\n <Box\n data-testid=\"app-header-meta\"\n sx={{\n fontSize: sxRem(11),\n fontWeight: 700,\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n color: 'text.disabled',\n lineHeight: 1,\n }}\n >\n {meta}\n </Box>\n )}\n {actions && (\n <Box\n component=\"nav\"\n data-testid=\"app-header-actions\"\n sx={{ display: 'flex', alignItems: 'center', gap: 1 }}\n >\n {actions}\n </Box>\n )}\n </Box>\n );\n};\n\n/**\n * The application bar: a row of slots on one surface, plus an optional second\n * row that belongs to it.\n *\n * It knows nothing about routers, sessions, carts or stores — every slot is a\n * `ReactNode` and every behaviour is a callback, which is what lets one bar\n * serve a storefront, a back office and a platform console without any of them\n * leaking into the others. Compose it with {@link AppHeaderIdentity},\n * {@link AppHeaderStatus} and {@link AppHeaderDetails}, or put your own nodes in\n * the slots.\n *\n * The SURFACE always spans the viewport while the CONTENT stops at `maxWidth`\n * and centres, so the same bar reads as a phone header and as a desktop one\n * without a second component or a breakpoint at the call site.\n */\nexport const AppHeader: React.FC<AppHeaderProps> = (props) => {\n // A table of defaults rather than one per destructured prop: each `= default`\n // is a branch, and nine of them put this component over the complexity bar\n // before it rendered anything.\n const {\n leading,\n children,\n actions,\n meta,\n below,\n position,\n offsetTop,\n maxWidth,\n divider,\n elevateOnScroll,\n dense,\n disableSpacer,\n className,\n dataTestId,\n // True by construction — `withDefaults` fills exactly these keys — but not\n // something TS can follow through a `Partial<T>` table.\n } = withDefaults(props, HEADER_DEFAULTS) as ResolvedHeaderProps;\n\n const scrolled = useScrolled(elevateOnScroll);\n const needsSpacer = position === 'fixed' && !disableSpacer;\n const [ref, height] = useMeasuredHeight(needsSpacer);\n\n return (\n <>\n <Box\n ref={ref}\n component=\"header\"\n className={className}\n data-testid={dataTestId}\n sx={surfaceSx({ position, offsetTop, divider, scrolled })}\n >\n <Box sx={{ maxWidth, mx: 'auto', px: { xs: 2, md: 3 } }}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: { xs: 1, md: 2 },\n minHeight: dense ? BAR_MIN_HEIGHT.dense : BAR_MIN_HEIGHT.regular,\n py: 1,\n }}\n >\n {leading}\n {/* The identity takes the slack and is the only part allowed to\n shrink — the actions are targets and the meta note is already\n the smallest thing in the bar. */}\n <Box sx={{ flex: '1 1 auto', minWidth: 0 }}>{children}</Box>\n <HeaderTrailing meta={meta} actions={actions} />\n </Box>\n {below && (\n <Box data-testid={`${dataTestId}-below`} sx={{ pb: 1.5 }}>\n {below}\n </Box>\n )}\n </Box>\n </Box>\n {needsSpacer && <Box aria-hidden data-testid={`${dataTestId}-spacer`} sx={{ height }} />}\n </>\n );\n};\n\nAppHeader.displayName = 'AppHeader';\n\nexport default AppHeader;\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/feedback/Sonner/SonnerToast.tsx"],"sourcesContent":["import SuccessIcon from '@mui/icons-material/CheckCircle';\nimport CloseIcon from '@mui/icons-material/Close';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport InfoIcon from '@mui/icons-material/Info';\nimport WarningIcon from '@mui/icons-material/Warning';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport CircularProgress from '@mui/material/CircularProgress/index.js';\nimport Collapse from '@mui/material/Collapse/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, useTheme } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { shadowInk } from '../../../tokens/ink';\nimport { sxRem } from '../../../tokens/relative';\n\nimport type { SonnerItem } from './Sonner.types';\nimport type { SonnerProps } from './Sonner.types';\n\nconst renderToastIcon = (icon: SonnerProps['icon'], type: SonnerProps['type']) => {\n if (icon) return icon;\n\n switch (type) {\n case 'success':\n return <SuccessIcon sx={{ fontSize: sxRem(20), color: 'success.main' }} />;\n case 'error':\n return <ErrorIcon sx={{ fontSize: sxRem(20), color: 'error.main' }} />;\n case 'warning':\n return <WarningIcon sx={{ fontSize: sxRem(20), color: 'warning.main' }} />;\n case 'info':\n return <InfoIcon sx={{ fontSize: sxRem(20), color: 'info.main' }} />;\n case 'loading':\n return <CircularProgress size={16} />;\n default:\n return null;\n }\n};\n\n// Errors and toasts flagged important interrupt the screen reader; the rest wait\n// for the next pause. Computed once instead of duplicating the same condition\n// across the role and aria-live attributes.\nconst resolveToastAnnouncement = (important: boolean, type: SonnerProps['type']) => {\n const interrupts = important || type === 'error';\n\n return {\n role: interrupts ? 'alert' : 'status',\n live: (interrupts ? 'assertive' : 'polite') as 'assertive' | 'polite',\n };\n};\n\nconst buildToastStyles = (\n theme: Theme,\n variant: SonnerProps['variant'],\n visible: boolean,\n): CSSObject => {\n const baseStyles: CSSObject = {\n borderRadius: theme.spacing(1.5),\n border: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.shadows[4],\n transition: theme.transitions.create(['all', 'transform', 'opacity'], {\n duration: theme.transitions.duration.short,\n }),\n transform: visible ? 'scale(1)' : 'scale(0.95)',\n opacity: visible ? 1 : 0,\n };\n\n switch (variant) {\n case 'glass':\n return {\n ...baseStyles,\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n boxShadow: `0 8px 32px ${shadowInk(theme, 0.1)}`,\n };\n\n case 'minimal':\n return {\n ...baseStyles,\n backgroundColor: theme.palette.background.default,\n border: 'none',\n boxShadow: 'none',\n borderLeft: `4px solid ${theme.palette.primary.main}`,\n borderRadius: 0,\n };\n\n default:\n return baseStyles;\n }\n};\n\n// Title, description and the optional action row. Split out so the toast shell\n// keeps only its own concerns — announcement, styling and dismissal.\nconst ToastContent: React.FC<{\n title?: SonnerProps['title'];\n description?: SonnerProps['description'];\n important: boolean;\n action?: SonnerProps['action'];\n cancel?: SonnerProps['cancel'];\n}> = ({ title, description, important, action, cancel }) => (\n <Box sx={{ flex: 1, minWidth: 0 }}>\n {title && (\n <Typography\n variant=\"body2\"\n sx={{\n fontWeight: important ? 600 : 500,\n color: 'text.primary',\n mb: description ? 0.5 : 0,\n }}\n >\n {title}\n </Typography>\n )}\n\n {description && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', fontSize: sxRem(14) }}>\n {description}\n </Typography>\n )}\n\n {(action || cancel) && (\n <Box sx={{ display: 'flex', gap: 1, mt: 1.5 }}>\n {action && (\n <ToastActionButton action={action} buttonVariant=\"contained\" />\n )}\n {cancel && <ToastActionButton action={cancel} buttonVariant=\"outlined\" />}\n </Box>\n )}\n </Box>\n);\n\nconst ToastActionButton: React.FC<{\n action: NonNullable<SonnerProps['action']>;\n buttonVariant: 'contained' | 'outlined';\n}> = ({ action, buttonVariant }) => (\n <Button\n size=\"small\"\n onClick={action.onClick}\n variant={buttonVariant}\n sx={{ fontSize: sxRem(12), py: 0.5, px: 1.5 }}\n >\n {action.label}\n </Button>\n);\n\nexport const SonnerToast: React.FC<SonnerItem & { onDismiss: (id: string) => void }> = ({\n id,\n title,\n description,\n type = 'default',\n variant = 'default',\n closable = true,\n dismissLabel,\n action,\n cancel,\n icon,\n important = false,\n visible,\n onDismiss,\n}) => {\n const theme = useTheme();\n const announcement = resolveToastAnnouncement(important, type);\n\n const handleDismiss = () => {\n onDismiss(id);\n };\n\n return (\n <Collapse in={visible} timeout={200}>\n <Box\n role={announcement.role}\n aria-live={announcement.live}\n aria-atomic=\"true\"\n sx={{\n ...buildToastStyles(theme, variant, visible),\n p: 2,\n mb: 1,\n minWidth: 356,\n maxWidth: 400,\n display: 'flex',\n alignItems: 'flex-start',\n gap: 1.5,\n }}\n >\n {renderToastIcon(icon, type)}\n\n <ToastContent\n title={title}\n description={description}\n important={important}\n action={action}\n cancel={cancel}\n />\n\n {closable && (\n <IconButton\n size=\"small\"\n onClick={handleDismiss}\n aria-label={dismissLabel}\n sx={{\n ml: 'auto',\n color: 'text.secondary',\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n </Collapse>\n );\n};\n"],"mappings":";;;;;;;;AAAA,OAAO,iBAAiB;AACxB,OAAO,eAAe;AACtB,OAAO,eAAe;AACtB,OAAO,cAAc;AACrB,OAAO,iBAAiB;AACxB,OAAO,SAAS;AAChB,OAAO,YAAY;AACnB,OAAO,sBAAsB;AAC7B,OAAO,cAAc;AACrB,OAAO,gBAAgB;AACvB,OAAO,gBAAgB;AACvB,SAAS,OAAO,gBAAgB;AAenB,cAkGP,YAlGO;AALb,IAAM,kBAAkB,CAAC,MAA2B,SAA8B;AAChF,MAAI,KAAM,QAAO;AAEjB,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,oBAAC,eAAY,IAAI,EAAE,UAAU,MAAM,EAAE,GAAG,OAAO,eAAe,GAAG;AAAA,IAC1E,KAAK;AACH,aAAO,oBAAC,aAAU,IAAI,EAAE,UAAU,MAAM,EAAE,GAAG,OAAO,aAAa,GAAG;AAAA,IACtE,KAAK;AACH,aAAO,oBAAC,eAAY,IAAI,EAAE,UAAU,MAAM,EAAE,GAAG,OAAO,eAAe,GAAG;AAAA,IAC1E,KAAK;AACH,aAAO,oBAAC,YAAS,IAAI,EAAE,UAAU,MAAM,EAAE,GAAG,OAAO,YAAY,GAAG;AAAA,IACpE,KAAK;AACH,aAAO,oBAAC,oBAAiB,MAAM,IAAI;AAAA,IACrC;AACE,aAAO;AAAA,EACX;AACF;AAKA,IAAM,2BAA2B,CAAC,WAAoB,SAA8B;AAClF,QAAM,aAAa,aAAa,SAAS;AAEzC,SAAO;AAAA,IACL,MAAM,aAAa,UAAU;AAAA,IAC7B,MAAO,aAAa,cAAc;AAAA,EACpC;AACF;AAEA,IAAM,mBAAmB,CACvB,OACA,SACA,YACc;AACd,QAAM,aAAwB;AAAA,IAC5B,cAAc,MAAM,QAAQ,GAAG;AAAA,IAC/B,QAAQ,aAAa,MAAM,QAAQ,OAAO;AAAA,IAC1C,iBAAiB,MAAM,QAAQ,WAAW;AAAA,IAC1C,WAAW,MAAM,QAAQ,CAAC;AAAA,IAC1B,YAAY,MAAM,YAAY,OAAO,CAAC,OAAO,aAAa,SAAS,GAAG;AAAA,MACpE,UAAU,MAAM,YAAY,SAAS;AAAA,IACvC,CAAC;AAAA,IACD,WAAW,UAAU,aAAa;AAAA,IAClC,SAAS,UAAU,IAAI;AAAA,EACzB;AAEA,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG;AAAA,QAC1D,gBAAgB;AAAA,QAChB,QAAQ,aAAa,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,QAC3D,WAAW,cAAc,UAAU,OAAO,GAAG,CAAC;AAAA,MAChD;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,iBAAiB,MAAM,QAAQ,WAAW;AAAA,QAC1C,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,YAAY,aAAa,MAAM,QAAQ,QAAQ,IAAI;AAAA,QACnD,cAAc;AAAA,MAChB;AAAA,IAEF;AACE,aAAO;AAAA,EACX;AACF;AAIA,IAAM,eAMD,CAAC,EAAE,OAAO,aAAa,WAAW,QAAQ,OAAO,MACpD,qBAAC,OAAI,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,GAC7B;AAAA,WACC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,IAAI;AAAA,QACF,YAAY,YAAY,MAAM;AAAA,QAC9B,OAAO;AAAA,QACP,IAAI,cAAc,MAAM;AAAA,MAC1B;AAAA,MAEC;AAAA;AAAA,EACH;AAAA,EAGD,eACC,oBAAC,cAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,kBAAkB,UAAU,MAAM,EAAE,EAAE,GAC5E,uBACH;AAAA,GAGA,UAAU,WACV,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,IAAI,IAAI,GACzC;AAAA,cACC,oBAAC,qBAAkB,QAAgB,eAAc,aAAY;AAAA,IAE9D,UAAU,oBAAC,qBAAkB,QAAQ,QAAQ,eAAc,YAAW;AAAA,KACzE;AAAA,GAEJ;AAGF,IAAM,oBAGD,CAAC,EAAE,QAAQ,cAAc,MAC5B;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,SAAS;AAAA,IACT,IAAI,EAAE,UAAU,MAAM,EAAE,GAAG,IAAI,KAAK,IAAI,IAAI;AAAA,IAE3C,iBAAO;AAAA;AACV;AAGK,IAAM,cAA0E,CAAC;AAAA,EACtF;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,eAAe,yBAAyB,WAAW,IAAI;AAE7D,QAAM,gBAAgB,MAAM;AAC1B,cAAU,EAAE;AAAA,EACd;AAEA,SACE,oBAAC,YAAS,IAAI,SAAS,SAAS,KAC9B;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,aAAa;AAAA,MACnB,aAAW,aAAa;AAAA,MACxB,eAAY;AAAA,MACZ,IAAI;AAAA,QACF,GAAG,iBAAiB,OAAO,SAAS,OAAO;AAAA,QAC3C,GAAG;AAAA,QACH,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,MACP;AAAA,MAEC;AAAA,wBAAgB,MAAM,IAAI;AAAA,QAE3B;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QAEC,YACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,cAAY;AAAA,YACZ,IAAI;AAAA,cACF,IAAI;AAAA,cACJ,OAAO;AAAA,cACP,WAAW;AAAA,gBACT,iBAAiB;AAAA,cACnB;AAAA,YACF;AAAA,YAEA,8BAAC,aAAU,UAAS,SAAQ;AAAA;AAAA,QAC9B;AAAA;AAAA;AAAA,EAEJ,GACF;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/ContentToolbar/SavedViewsMenu.tsx"],"sourcesContent":["'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport KebabIcon from '@mui/icons-material/MoreVert';\nimport ViewIcon from '@mui/icons-material/Visibility';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Popover from '@mui/material/Popover/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useState } from 'react';\n\nimport type {\n SavedViewLike,\n SavedViewsLabels,\n SavedViewsMenuProps,\n} from './ContentToolbar.types';\nimport { fieldHeight } from '../../../tokens/field-height';\nimport { fieldRadiusPx } from '../../../tokens/field-radius';\nimport { sxRem } from '../../../tokens/relative';\n\n/** How many non-pinned views show under \"Recentes\". */\nconst RECENT_LIMIT = 5;\n\ninterface RowHandlers<V extends SavedViewLike> {\n apply: (view: V) => void;\n onEdit: (view: V) => void;\n onDelete: (view: V) => void;\n onSetDefault: (view: V) => void;\n onTogglePin: (view: V) => void;\n onToggleShare: (view: V) => void;\n}\n\nfunction DefaultTag({ label, testId }: { label: string; testId: string }): React.JSX.Element {\n return (\n <Box\n component=\"span\"\n data-testid={testId}\n sx={{ px: 0.75, py: 0.125, borderRadius: 1, fontSize: sxRem(11.2), bgcolor: 'primary.main', color: 'primary.contrastText' }}\n >\n {label}\n </Box>\n );\n}\n\ninterface KebabAction {\n id: string;\n label: string;\n danger?: boolean;\n run: () => void;\n}\n\n/** Build the per-view ⋮ actions; owner-only mutations follow \"Apply\". */\nfunction buildActions<V extends SavedViewLike>(\n view: V,\n handlers: RowHandlers<V>,\n labels: SavedViewsLabels,\n): KebabAction[] {\n const actions: KebabAction[] = [{ id: 'apply', label: labels.apply, run: () => handlers.apply(view) }];\n if (!view.isOwner) return actions;\n if (!view.isDefault) {\n actions.push({ id: 'default', label: labels.setDefault, run: () => handlers.onSetDefault(view) });\n }\n actions.push({ id: 'pin', label: view.pinned ? labels.unpin : labels.pin, run: () => handlers.onTogglePin(view) });\n actions.push({ id: 'share', label: view.shared ? labels.unshare : labels.share, run: () => handlers.onToggleShare(view) });\n actions.push({ id: 'edit', label: labels.edit, run: () => handlers.onEdit(view) });\n actions.push({ id: 'delete', label: labels.remove, danger: true, run: () => handlers.onDelete(view) });\n return actions;\n}\n\nfunction ViewKebab<V extends SavedViewLike>({\n view,\n handlers,\n labels,\n testIdPrefix,\n}: {\n view: V;\n handlers: RowHandlers<V>;\n labels: SavedViewsLabels;\n testIdPrefix: string;\n}): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const close = (): void => setAnchorEl(null);\n return (\n <>\n <IconButton\n size=\"small\"\n aria-label={`${labels.apply} ${view.name}`}\n data-testid={`${testIdPrefix}-kebab-${view.id}`}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n sx={{ width: 28, height: 28, color: 'text.secondary' }}\n >\n <KebabIcon sx={{ fontSize: sxRem(16) }} />\n </IconButton>\n <Menu anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={close}>\n {buildActions(view, handlers, labels).map((action) => (\n <MenuItem\n key={action.id}\n data-testid={`${testIdPrefix}-item-${action.id}-${view.id}`}\n onClick={() => {\n action.run();\n close();\n }}\n sx={action.danger ? { color: 'error.main' } : undefined}\n >\n {action.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n\nfunction ViewRow<V extends SavedViewLike>({\n view,\n handlers,\n labels,\n testIdPrefix,\n}: {\n view: V;\n handlers: RowHandlers<V>;\n labels: SavedViewsLabels;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }} data-testid={`${testIdPrefix}-row-${view.id}`}>\n <Box\n onClick={() => handlers.apply(view)}\n sx={{ flex: 1, minWidth: 0, cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 0.75 }}\n data-testid={`${testIdPrefix}-apply-${view.id}`}\n >\n <Typography component=\"span\" sx={{ fontSize: sxRem(14) }}>\n {view.name}\n </Typography>\n {view.isDefault && <DefaultTag label={labels.defaultTag} testId={`${testIdPrefix}-default-${view.id}`} />}\n </Box>\n <ViewKebab view={view} handlers={handlers} labels={labels} testIdPrefix={testIdPrefix} />\n </Stack>\n );\n}\n\nfunction ViewSection<V extends SavedViewLike>({\n title,\n list,\n sectionKey,\n handlers,\n labels,\n testIdPrefix,\n}: {\n title: string;\n list: V[];\n sectionKey: string;\n handlers: RowHandlers<V>;\n labels: SavedViewsLabels;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n if (list.length === 0) return null;\n return (\n <Box data-testid={`${testIdPrefix}-section-${sectionKey}`}>\n <Typography component=\"span\" sx={{ fontSize: sxRem(12), fontWeight: 600, color: 'text.secondary' }}>\n {title}\n </Typography>\n <Stack spacing={0.5} sx={{ mt: 0.5 }}>\n {list.map((view) => (\n <ViewRow key={view.id} view={view} handlers={handlers} labels={labels} testIdPrefix={testIdPrefix} />\n ))}\n </Stack>\n </Box>\n );\n}\n\n/** A borderless footer text button (Save current / Manage all). */\nfunction FooterButton({\n label,\n testId,\n onClick,\n}: {\n label: string;\n testId: string;\n onClick: () => void;\n}): React.JSX.Element {\n return (\n <Button variant=\"text\" size=\"small\" color=\"inherit\" onClick={onClick} data-testid={testId} sx={{ textTransform: 'none' }}>\n {label}\n </Button>\n );\n}\n\n/** The popover contents: the built-in Main vision default, saved-view sections, and footer. */\nfunction PopoverBody<V extends SavedViewLike>({\n views,\n pinned,\n recent,\n activeViewName,\n labels,\n handlers,\n onSelectMain,\n onSaveCurrent,\n onManageAll,\n testIdPrefix,\n}: {\n views: V[];\n pinned: V[];\n recent: V[];\n activeViewName?: string;\n labels: SavedViewsLabels;\n handlers: RowHandlers<V>;\n onSelectMain: () => void;\n onSaveCurrent: () => void;\n onManageAll: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Stack spacing={1.5} sx={{ p: 1.5, width: 300 }} data-testid={`${testIdPrefix}-popover`}>\n {/* Built-in no-filter default, always available above the saved views. */}\n <MenuItem data-testid={`${testIdPrefix}-main`} selected={!activeViewName} onClick={onSelectMain} sx={{ borderRadius: 1, px: 1, gap: 1 }}>\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0, fontSize: sxRem(14) }}>\n {labels.mainView}\n </Box>\n {!activeViewName && <CheckIcon sx={{ fontSize: sxRem(16), color: 'primary.main' }} />}\n </MenuItem>\n {views.length === 0 ? (\n <Typography sx={{ fontSize: sxRem(12), color: 'text.secondary' }}>{labels.empty}</Typography>\n ) : (\n <>\n <ViewSection title={labels.pinned} list={pinned} sectionKey=\"pinned\" handlers={handlers} labels={labels} testIdPrefix={testIdPrefix} />\n <ViewSection title={labels.recent} list={recent} sectionKey=\"recent\" handlers={handlers} labels={labels} testIdPrefix={testIdPrefix} />\n </>\n )}\n <Box sx={{ borderTop: 1, borderColor: 'divider', pt: 1 }}>\n <Stack spacing={0.5} sx={{ alignItems: 'flex-start' }}>\n <FooterButton label={labels.saveCurrent} testId={`${testIdPrefix}-save-current`} onClick={onSaveCurrent} />\n <FooterButton label={labels.manageAll} testId={`${testIdPrefix}-manage-all`} onClick={onManageAll} />\n </Stack>\n </Box>\n </Stack>\n );\n}\n\n/**\n * Stateless saved-views dropdown: a neutral trigger (styled like the sibling\n * toolbar controls) that shows `activeViewName` when a view is applied, else the\n * built-in \"Main vision\" label. The popover lists the Main vision default plus\n * pinned + recent views; a per-view ⋮ exposes owner-only mutations. This\n * component owns NO data — every action is a callback, so a page-level Connector\n * wires it to the backend.\n */\nexport function SavedViewsMenu<V extends SavedViewLike = SavedViewLike>({\n views,\n activeViewName,\n onApply,\n onSelectMain,\n onSaveCurrent,\n onEdit,\n onDelete,\n onSetDefault,\n onTogglePin,\n onToggleShare,\n onManageAll,\n labels: labelOverrides,\n testIdPrefix = 'views',\n}: SavedViewsMenuProps<V>): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n const close = (): void => setAnchorEl(null);\n const runAndClose = (action: () => void) => (): void => {\n action();\n close();\n };\n const labels = labelOverrides;\n const pinned = views.filter((view) => view.pinned);\n const recent = views.filter((view) => !view.pinned).slice(0, RECENT_LIMIT);\n\n const handlers: RowHandlers<V> = {\n apply: (view) => {\n onApply(view);\n close();\n },\n onEdit,\n onDelete,\n onSetDefault,\n onTogglePin,\n onToggleShare,\n };\n\n return (\n <>\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"inherit\"\n onClick={(event) => setAnchorEl(event.currentTarget)}\n data-testid={`${testIdPrefix}-button`}\n aria-haspopup=\"menu\"\n aria-expanded={Boolean(anchorEl)}\n aria-label={activeViewName ?? labels.mainView}\n sx={{ minWidth: 0, height: fieldHeight, px: 1, gap: 0.5, borderRadius: fieldRadiusPx, color: 'text.primary', textTransform: 'none', fontWeight: 600 }}\n >\n {/* Mobile: an eye icon stands in for the view name to keep the toolbar one line. */}\n <ViewIcon sx={{ fontSize: sxRem(18), display: { xs: 'inline-flex', md: 'none' } }} />\n <Box component=\"span\" sx={{ display: { xs: 'none', md: 'inline' } }}>\n {activeViewName ?? labels.mainView}\n </Box>\n <ChevronDownIcon sx={{ fontSize: sxRem(14) }} />\n </Button>\n <Popover\n open={Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <PopoverBody\n views={views}\n pinned={pinned}\n recent={recent}\n activeViewName={activeViewName}\n labels={labels}\n handlers={handlers}\n onSelectMain={runAndClose(onSelectMain)}\n onSaveCurrent={runAndClose(onSaveCurrent)}\n onManageAll={runAndClose(onManageAll)}\n testIdPrefix={testIdPrefix}\n />\n </Popover>\n </>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/typography/Code/Code.tsx"],"sourcesContent":["import Check from '@mui/icons-material/Check';\nimport ContentCopy from '@mui/icons-material/ContentCopy';\nimport Box from '@mui/material/Box/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Tooltip from '@mui/material/Tooltip/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport React, { useState } from 'react';\n\nimport type { CodeProps } from './Code.types';\nimport { modeInk, neutralTones } from '../../../tokens/ink';\nimport { rem } from '../../../tokens/relative';\n\nconst StyledCodeContainer = styled(Box, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'customSize', 'copyable'].includes(prop as string),\n})<{\n customVariant?: string;\n customSize?: string;\n copyable?: boolean;\n component?: React.ElementType;\n}>(({ theme, customVariant = 'inline', customSize = 'md', copyable }) => {\n // Size mapping\n const sizeMap = {\n xs: { fontSize: rem(theme, 12), padding: '2px 4px' },\n sm: { fontSize: rem(theme, 13), padding: '3px 6px' },\n md: { fontSize: rem(theme, 14), padding: '4px 8px' },\n lg: { fontSize: rem(theme, 16), padding: '6px 12px' },\n };\n\n const blockSizeMap = {\n xs: { fontSize: rem(theme, 12), padding: '8px 12px' },\n sm: { fontSize: rem(theme, 13), padding: '12px 16px' },\n md: { fontSize: rem(theme, 14), padding: '16px 20px' },\n lg: { fontSize: rem(theme, 16), padding: '20px 24px' },\n };\n\n const baseStyles = {\n fontFamily: 'Monaco, Menlo, \"Ubuntu Mono\", \"Courier New\", monospace',\n lineHeight: 1.5,\n borderRadius: theme.shape.borderRadius,\n transition: 'all 0.2s ease',\n position: 'relative' as const,\n };\n\n // Variant-specific styles\n const variantStyles = {\n inline: {\n ...baseStyles,\n display: 'inline',\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n color: theme.palette.primary.main,\n border: `1px solid ${alpha(theme.palette.primary.main, 0.12)}`,\n ...sizeMap[customSize as keyof typeof sizeMap],\n },\n block: {\n ...baseStyles,\n display: 'block',\n backgroundColor:\n theme.palette.mode === 'dark'\n ? alpha(neutralTones(theme).inverseSurface, 0.95)\n : alpha(neutralTones(theme).surface, 0.95),\n color:\n theme.palette.mode === 'dark' ? modeInk(theme) : theme.palette.text.primary,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n overflow: 'auto',\n whiteSpace: 'pre' as const,\n ...blockSizeMap[customSize as keyof typeof blockSizeMap],\n ...(copyable && {\n paddingTop: blockSizeMap[customSize as keyof typeof blockSizeMap].padding.split(' ')[0],\n paddingRight: '60px',\n }),\n },\n highlight: {\n ...baseStyles,\n display: 'block',\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.1)} 0%, ${alpha(theme.palette.secondary.main, 0.1)} 100%)`,\n color: theme.palette.text.primary,\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n borderLeft: `4px solid ${theme.palette.primary.main}`,\n overflow: 'auto',\n whiteSpace: 'pre' as const,\n ...blockSizeMap[customSize as keyof typeof blockSizeMap],\n ...(copyable && {\n paddingTop: blockSizeMap[customSize as keyof typeof blockSizeMap].padding.split(' ')[0],\n paddingRight: '60px',\n }),\n },\n };\n\n return variantStyles[customVariant as keyof typeof variantStyles] || variantStyles.inline;\n});\n\nconst StyledCode = styled('code')({\n margin: 0,\n padding: 0,\n backgroundColor: 'transparent',\n border: 'none',\n fontFamily: 'inherit',\n fontSize: 'inherit',\n lineHeight: 'inherit',\n color: 'inherit',\n});\n\nconst CopyButton = styled(IconButton)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(1),\n right: theme.spacing(1),\n width: 32,\n height: 32,\n backgroundColor:\n theme.palette.mode === 'dark'\n ? alpha(theme.palette.background.paper, 0.8)\n : theme.palette.background.paper,\n backdropFilter: theme.palette.mode === 'dark' ? 'blur(8px)' : 'none',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.palette.mode === 'light' ? theme.shadows[1] : 'none',\n '&:hover': {\n backgroundColor:\n theme.palette.mode === 'dark'\n ? alpha(theme.palette.background.paper, 0.9)\n : neutralTones(theme).surface,\n transform: 'scale(1.05)',\n },\n '& .MuiSvgIcon-root': {\n fontSize: rem(theme, 16),\n },\n}));\n\nconst LanguageLabel = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(1),\n left: theme.spacing(2),\n fontSize: rem(theme, 12),\n fontWeight: 500,\n color: alpha(theme.palette.text.primary, 0.6),\n backgroundColor:\n theme.palette.mode === 'dark'\n ? alpha(theme.palette.background.paper, 0.8)\n : theme.palette.background.paper,\n padding: '2px 8px',\n borderRadius: theme.shape.borderRadius / 2,\n backdropFilter: theme.palette.mode === 'dark' ? 'blur(8px)' : 'none',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.palette.mode === 'light' ? theme.shadows[1] : 'none',\n}));\n\n// Renders each source line beside a gutter number. Keys combine the line number\n// with a slice of the content and its length, so editing one line in place does\n// not reshuffle the keys of the lines around it.\nconst renderNumberedLines = (source: string) =>\n source.split('\\n').map((line, index) => {\n const stableKey = `line-${index + 1}-${line.slice(0, 10).replace(/\\s+/g, '')}-${line.length}`;\n\n return (\n <div key={stableKey} style={{ display: 'flex' }}>\n <span\n style={{\n display: 'inline-block',\n minWidth: '3em',\n opacity: 0.5,\n userSelect: 'none',\n marginRight: '1em',\n textAlign: 'right',\n }}\n >\n {index + 1}\n </span>\n <span>{line}</span>\n </div>\n );\n });\n\n// Only block-ish variants get a language label or a copy affordance.\nconst resolveCodeFlags = (\n variant: CodeProps['variant'],\n copyable: boolean,\n language: CodeProps['language'],\n) => {\n const isBlock = variant === 'block' || variant === 'highlight';\n return {\n isBlock,\n showCopy: copyable && isBlock,\n showLanguage: Boolean(language) && isBlock,\n };\n};\n\n// Owns its own \"just copied\" flash. Keeping it here rather than inline in Code\n// means the copied/not-copied branches do not count against the main render, and\n// the flash re-renders only the button. Non-string children are still a no-op on\n// click, exactly as before.\nconst CodeCopyButton: React.FC<{ source: React.ReactNode }> = ({ source }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n if (typeof source !== 'string') return;\n try {\n await navigator.clipboard.writeText(source);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2000);\n } catch {\n // Silently fail if clipboard access is denied\n }\n };\n\n return (\n <Tooltip title={copied ? 'Copied!' : 'Copy code'}>\n <CopyButton onClick={handleCopy} size=\"small\" color={copied ? 'success' : 'default'}>\n {copied ? <Check /> : <ContentCopy />}\n </CopyButton>\n </Tooltip>\n );\n};\n\nexport const Code = React.forwardRef<HTMLElement, CodeProps>(\n (\n {\n variant = 'inline',\n language,\n copyable = false,\n lineNumbers = false,\n size = 'md',\n children,\n ...props\n },\n ref,\n ) => {\n const { isBlock, showCopy, showLanguage } = resolveCodeFlags(variant, copyable, language);\n\n // Process children for line numbers if needed\n const processedChildren = React.useMemo(() => {\n if (!lineNumbers || !isBlock || typeof children !== 'string') {\n return children;\n }\n\n return renderNumberedLines(children);\n }, [children, lineNumbers, isBlock]);\n\n return (\n <StyledCodeContainer\n ref={ref}\n component={variant === 'inline' ? 'span' : 'div'}\n customVariant={variant}\n customSize={size}\n copyable={showCopy}\n {...props}\n >\n {showLanguage && <LanguageLabel>{language}</LanguageLabel>}\n\n <StyledCode>{processedChildren}</StyledCode>\n\n {showCopy && <CodeCopyButton source={children} />}\n </StyledCodeContainer>\n );\n },\n);\n\nCode.displayName = 'Code';"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/navigation/AppHeader/AppHeader.details.tsx"],"sourcesContent":["'use client';\n\nimport Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport useMediaQuery from '@mui/material/useMediaQuery/index.js';\nimport React from 'react';\n\nimport { accentFor } from '../../../tokens/scales';\nimport { Sheet } from '../../data-display/Sheet/Sheet';\nimport { Button } from '../../form/Button/Button';\nimport { Dialog } from '../../feedback/Dialog/Dialog';\n\nimport type {\n AppHeaderDetailRow,\n AppHeaderDetailsAction,\n AppHeaderDetailsProps,\n} from './AppHeader.types';\n\n/** How wide the dialog presentation grows before it stops. */\nconst DIALOG_WIDTH = 460;\n\n/**\n * Where the smallest phones stop. The theme's scale starts at `xs`/`sm`, so\n * there is no `xxs` breakpoint to ask for — this is that boundary, named once\n * rather than inlined at the place it decides something.\n */\nconst XXS_MAX_WIDTH = 360;\n\n/**\n * The sheet grows to its content and stops at the viewport; it does not take a\n * fixed slab of height.\n *\n * `Sheet`'s vertical presets are absolute (`md` is 400px), which on a phone is\n * shorter than six detail rows plus a button — so the panel scrolled INSIDE a\n * screen that had room to spare, putting the address and the way out below the\n * fold of a sheet using two thirds of the display. `height: auto` sizes it to\n * what is in it, and the cap keeps a long panel on-screen: 100dvh on the\n * smallest phones where every pixel counts, 90dvh above that so the panel still\n * reads as a sheet over a page rather than as a new screen.\n *\n * `dvh` and not `vh` — mobile browser chrome makes `vh` overshoot, which would\n * reintroduce exactly the scroll this removes.\n */\nfunction sheetHeight(xxs: boolean): { height: string; maxHeight: string } {\n return { height: 'auto', maxHeight: xxs ? '100dvh' : '90dvh' };\n}\n\n/** Which surface this viewport calls for. Lifted out to keep the component lean. */\nfunction usesSheet(presentation: AppHeaderDetailsProps['presentation'], compact: boolean): boolean {\n if (presentation === 'sheet') return true;\n if (presentation === 'dialog') return false;\n return compact;\n}\n\n/** One label/value line. The value may wrap to two lines; the label may not. */\nconst DetailRow: React.FC<{ row: AppHeaderDetailRow; last: boolean; dataTestId: string }> = ({\n row,\n last,\n dataTestId,\n}) => {\n const theme = useTheme();\n return (\n <Box\n data-testid={`${dataTestId}-row`}\n data-row={row.id ?? row.label}\n sx={{\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 2,\n py: 1.5,\n borderBottom: last ? 'none' : `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"body1\" color=\"text.secondary\" component=\"span\" sx={{ flex: '0 0 auto' }}>\n {row.label}\n </Typography>\n <Typography\n variant=\"body1\"\n component=\"span\"\n sx={{\n minWidth: 0,\n textAlign: 'right',\n fontWeight: row.tone ? 700 : 500,\n color: row.tone ? accentFor(theme, row.tone).main : 'text.primary',\n // Newlines in a value are meaningful — an address is two lines.\n whiteSpace: 'pre-line',\n }}\n >\n {row.value}\n </Typography>\n </Box>\n );\n};\n\n/** The rows plus whatever the caller put under them. */\nconst DetailsBody: React.FC<\n Pick<AppHeaderDetailsProps, 'rows' | 'children'> & { dataTestId: string }\n> = ({ rows, children, dataTestId }) => (\n <Box data-testid={`${dataTestId}-body`}>\n {(rows ?? []).map((row, index) => (\n <DetailRow\n key={row.id ?? row.label}\n row={row}\n last={index === (rows?.length ?? 0) - 1 && !children}\n dataTestId={dataTestId}\n />\n ))}\n {children}\n </Box>\n);\n\n/**\n * The single full-width call to action, or nothing.\n *\n * `padded` is for the dialog, which has no footer slot of its own — and the\n * padding lives here rather than at the call site so an action-less panel does\n * not end in a strip of empty space.\n */\nconst DetailsAction: React.FC<{\n action?: AppHeaderDetailsAction;\n dataTestId: string;\n padded?: boolean;\n}> = ({ action, dataTestId, padded = false }) =>\n action ? (\n <Box sx={padded ? { pt: 2 } : undefined}>\n <Button\n variant=\"solid\"\n color={action.color ?? 'primary'}\n size=\"lg\"\n fullWidth\n disabled={action.disabled}\n onClick={action.onClick}\n dataTestId={action.dataTestId ?? `${dataTestId}-action`}\n >\n {action.label}\n </Button>\n </Box>\n ) : null;\n\n/**\n * The panel behind the header's disclosure — the hours, the address, the way\n * out — in the shape the viewport calls for.\n *\n * ONE component with two presentations, because they are one thing to the user\n * and one thing to the caller: a bottom sheet within reach of a thumb, a centred\n * dialog under a pointer. `auto` picks by viewport, so nobody writes that branch\n * at a call site and nobody ships a phone-shaped sheet stretched across a\n * desktop. Force either one with `presentation` when the surrounding layout\n * already decides (a preview frame, a story, a kiosk).\n */\nexport const AppHeaderDetails: React.FC<AppHeaderDetailsProps> = ({\n open,\n onClose,\n title,\n subtitle,\n rows,\n children,\n action,\n presentation = 'auto',\n breakpoint = 'sm',\n className,\n dataTestId = 'app-header-details',\n}) => {\n const theme = useTheme();\n const asSheet = usesSheet(presentation, useMediaQuery(theme.breakpoints.down(breakpoint)));\n const xxs = useMediaQuery(`(max-width:${XXS_MAX_WIDTH - 0.05}px)`);\n\n // Split once, not per branch: a STRING subtitle is the panel's own\n // `description` (both surfaces style it as part of their header), anything\n // richer is a node we render ourselves above the rows.\n const description = typeof subtitle === 'string' ? subtitle : undefined;\n const richSubtitle = description === undefined ? subtitle : null;\n\n const body = (\n <DetailsBody rows={rows} dataTestId={dataTestId}>\n {children}\n </DetailsBody>\n );\n const footer = <DetailsAction action={action} dataTestId={dataTestId} />;\n\n if (asSheet) {\n // No `showHandle`. The grab bar promises a drag this panel does not answer:\n // its height is its content's, so there is no second position to drag it\n // to, and the handle sat above a ✕ that already closes it. Swipe-to-dismiss\n // is `Sheet`'s default and still works — it just stops being advertised by\n // a control that looked resizable and was not.\n return (\n <Sheet\n open={open}\n onClose={onClose}\n onOpenChange={(next) => !next && onClose()}\n position=\"bottom\"\n size=\"md\"\n style={sheetHeight(xxs)}\n className={className}\n title={title}\n description={description}\n showCloseButton\n rounded\n footer={footer}\n dataTestId={dataTestId}\n >\n {richSubtitle}\n {body}\n </Sheet>\n );\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={title}\n description={description}\n showCloseButton\n fullWidth\n className={className}\n dataTestId={dataTestId}\n PaperProps={{ sx: { maxWidth: DIALOG_WIDTH, borderRadius: 3 } }}\n >\n {richSubtitle}\n {body}\n <DetailsAction action={action} dataTestId={dataTestId} padded />\n </Dialog>\n );\n};\n\nAppHeaderDetails.displayName = 'AppHeaderDetails';\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/Box/Box.tsx"],"sourcesContent":["import MuiBox from '@mui/material/Box/index.js';\nimport type { SxProps, Theme } from '@mui/material/styles/index.js';\nimport * as React from 'react';\n\nimport { resolveBoxLayout, splitBoxProps, type BoxLayout } from './box-layout';\nimport type { BoxProps } from './Box.types';\nimport { resolveTestId } from '../../../platform/test-id';\nimport { useUiTheme } from '../../../provider/use-ui-theme';\n\n/**\n * `sx` is not CSS: it reads a bare number on `padding`, `margin` or `gap` as\n * SPACING UNITS, on `borderRadius` as a multiple of `shape.borderRadius`, and a\n * `width` of `1` or less as a fraction. The resolver's numbers are already px,\n * so every one of them is written as a px string — otherwise a `p={2}` box\n * renders 128px of padding on the web and 16dp on native, which is the one\n * thing this component exists to rule out.\n */\nconst PX_KEYS = new Set<keyof BoxLayout>([\n 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft',\n 'marginTop', 'marginRight', 'marginBottom', 'marginLeft',\n 'gap', 'borderRadius', 'borderWidth', 'width', 'height',\n]);\n\nexport function layoutToSx(layout: BoxLayout): Record<string, string | number> {\n return Object.fromEntries(\n Object.entries(layout).map(([key, value]) => [\n key,\n typeof value === 'number' && PX_KEYS.has(key as keyof BoxLayout) ? `${value}px` : value,\n ]),\n );\n}\n\n/**\n * The web `Box`: MUI's, with the neutral layout props resolved into `sx` ahead\n * of whatever `sx` the caller adds — so the caller's escape hatch still wins.\n */\nexport const Box = React.forwardRef<HTMLDivElement, BoxProps>(\n ({ children, sx, ...props }, ref) => {\n const theme = useUiTheme();\n const { layout, rest } = splitBoxProps(props);\n const resolved = layoutToSx(resolveBoxLayout(layout, theme)) as SxProps<Theme>;\n const testId = resolveTestId(layout);\n const merged: SxProps<Theme> = [\n resolved,\n ...(Array.isArray(sx) ? sx : sx === undefined ? [] : [sx]),\n ] as SxProps<Theme>;\n\n return (\n <MuiBox ref={ref} sx={merged} data-testid={testId} {...rest}>\n {children}\n </MuiBox>\n );\n },\n);\n\nBox.displayName = 'Box';\n"],"mappings":";;;;;;;;;;;;AAAA,OAAO,YAAY;AAEnB,YAAY,WAAW;AA8CjB;AA/BN,IAAM,UAAU,oBAAI,IAAqB;AAAA,EACvC;AAAA,EAAc;AAAA,EAAgB;AAAA,EAAiB;AAAA,EAC/C;AAAA,EAAa;AAAA,EAAe;AAAA,EAAgB;AAAA,EAC5C;AAAA,EAAO;AAAA,EAAgB;AAAA,EAAe;AAAA,EAAS;AACjD,CAAC;AAEM,SAAS,WAAW,QAAoD;AAC7E,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,MAC3C;AAAA,MACA,OAAO,UAAU,YAAY,QAAQ,IAAI,GAAsB,IAAI,GAAG,KAAK,OAAO;AAAA,IACpF,CAAC;AAAA,EACH;AACF;AAMO,IAAM,MAAY;AAAA,EACvB,CAAC,EAAE,UAAU,IAAI,GAAG,MAAM,GAAG,QAAQ;AACnC,UAAM,QAAQ,WAAW;AACzB,UAAM,EAAE,QAAQ,KAAK,IAAI,cAAc,KAAK;AAC5C,UAAM,WAAW,WAAW,iBAAiB,QAAQ,KAAK,CAAC;AAC3D,UAAM,SAAS,cAAc,MAAM;AACnC,UAAM,SAAyB;AAAA,MAC7B;AAAA,MACA,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,OAAO,SAAY,CAAC,IAAI,CAAC,EAAE;AAAA,IAC1D;AAEA,WACE,oBAAC,UAAO,KAAU,IAAI,QAAQ,eAAa,QAAS,GAAG,MACpD,UACH;AAAA,EAEJ;AACF;AAEA,IAAI,cAAc;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/navigation/NavigationMenu/NavigationMenu.shell.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport List from '@mui/material/List/index.js';\nimport ListItemButton from '@mui/material/ListItemButton/index.js';\nimport { alpha, keyframes, styled } from '@mui/material/styles/index.js';\nimport type { CSSProperties, PropsWithChildren, ReactNode } from 'react';\nimport React from 'react';\n\nimport { slideIn } from './NavigationMenu.styles';\nimport { shadowInk } from '../../../tokens/ink';\n\nconst megaMenuSlide = keyframes`\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\n// These styled() components stay module-local: their inferred types cannot be\n// named across a module boundary here (TS2742). The plain components exported\n// below are what the layouts import.\nconst NavigationContainer = styled(Box, {\n shouldForwardProp: (prop) => !['variant', 'collapsed', 'minimal'].includes(prop as string),\n})<{ variant?: string; collapsed?: boolean; minimal?: boolean }>(({ theme, variant, collapsed, minimal }) => ({\n display: 'flex',\n position: 'relative',\n animation: `${slideIn} 0.4s ease-out`,\n ...(variant === 'horizontal' && {\n flexDirection: 'row',\n alignItems: 'center',\n width: '100%',\n ...(!minimal && {\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.95)} 0%, ${alpha(theme.palette.background.paper, 0.98)} 100%)`,\n backdropFilter: 'blur(10px)',\n borderRadius: theme.spacing(2),\n boxShadow: `0 8px 32px ${shadowInk(theme, 0.08)}`,\n }),\n }),\n ...(variant === 'vertical' && {\n flexDirection: 'column',\n width: collapsed ? 80 : 280,\n transition: 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)',\n height: '100%',\n ...(!minimal && {\n background: `linear-gradient(180deg, ${alpha(theme.palette.background.paper, 0.98)} 0%, ${alpha(theme.palette.background.paper, 0.95)} 100%)`,\n backdropFilter: 'blur(12px)',\n borderRadius: theme.spacing(2),\n boxShadow: `0 12px 40px ${shadowInk(theme, 0.1)}`,\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '200px',\n background: `radial-gradient(ellipse at top, ${alpha(theme.palette.primary.main, 0.05)} 0%, transparent 70%)`,\n pointerEvents: 'none',\n },\n }),\n }),\n ...(variant === 'mega' && {\n flexDirection: 'column',\n width: '100%',\n ...(!minimal && {\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.98)} 0%, ${alpha(theme.palette.background.default, 0.95)} 100%)`,\n backdropFilter: 'blur(15px)',\n borderRadius: theme.spacing(3),\n overflow: 'hidden',\n boxShadow: `0 20px 60px ${shadowInk(theme, 0.12)}`,\n }),\n }),\n}));\n\nconst StyledList = styled(List, {\n shouldForwardProp: (prop) => !['variant', 'size'].includes(prop as string),\n})<{ variant?: string; size?: string }>(({ theme, variant }) => ({\n padding: 0,\n width: '100%',\n ...(variant === 'horizontal' && {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n }),\n ...(variant === 'mega' && {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))',\n gap: theme.spacing(2),\n padding: theme.spacing(2),\n }),\n}));\n\nconst LogoContainer = styled(Box)(({ theme }) => ({\n padding: theme.spacing(2.5),\n marginBottom: theme.spacing(2),\n position: 'relative',\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.08)} 0%, ${alpha(theme.palette.primary.dark, 0.04)} 100%)`,\n borderBottom: `2px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n overflow: 'hidden',\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: '-50%',\n right: '-50%',\n width: '200%',\n height: '200%',\n background: `radial-gradient(circle, ${alpha(theme.palette.primary.light, 0.1)} 0%, transparent 70%)`,\n animation: `${slideIn} 1s ease-out`,\n },\n\n '& > *': {\n position: 'relative',\n zIndex: 1,\n },\n}));\n\nconst CollapseButton = styled(ListItemButton)(({ theme }) => ({\n borderRadius: theme.spacing(1.5),\n margin: theme.spacing(1),\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.08)} 0%, ${alpha(theme.palette.primary.dark, 0.04)} 100%)`,\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.12),\n transform: 'scale(1.05)',\n boxShadow: `0 6px 20px ${alpha(theme.palette.primary.main, 0.2)}`,\n\n '& .MuiListItemIcon-root': {\n transform: 'rotate(180deg)',\n transition: 'transform 0.3s ease',\n },\n },\n\n '&:active': {\n transform: 'scale(0.98)',\n },\n}));\n\nconst MegaMenuSection = styled(Box)(({ theme }) => ({\n padding: theme.spacing(3),\n borderRadius: theme.spacing(2),\n background: `linear-gradient(145deg, ${theme.palette.background.paper} 0%, ${alpha(theme.palette.background.default, 0.9)} 100%)`,\n boxShadow: `0 10px 30px ${shadowInk(theme, 0.08)}`,\n border: `1px solid ${alpha(theme.palette.divider, 0.08)}`,\n position: 'relative',\n overflow: 'hidden',\n animation: `${megaMenuSlide} 0.5s ease-out`,\n animationFillMode: 'both',\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '3px',\n background: `linear-gradient(90deg, ${theme.palette.primary.main} 0%, ${theme.palette.primary.light} 50%, ${theme.palette.primary.main} 100%)`,\n backgroundSize: '200% 100%',\n animation: 'shimmer 3s ease-in-out infinite',\n },\n\n '@keyframes shimmer': {\n '0%': {\n backgroundPosition: '200% 0',\n },\n '100%': {\n backgroundPosition: '-200% 0',\n },\n },\n\n '&:hover': {\n transform: 'translateY(-4px)',\n boxShadow: `0 15px 40px ${shadowInk(theme, 0.12)}`,\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n },\n\n '&:nth-of-type(1)': { animationDelay: '0.1s' },\n '&:nth-of-type(2)': { animationDelay: '0.2s' },\n '&:nth-of-type(3)': { animationDelay: '0.3s' },\n '&:nth-of-type(4)': { animationDelay: '0.4s' },\n}));\n\nexport interface NavigationShellProps extends PropsWithChildren {\n variant?: string;\n collapsed?: boolean;\n minimal?: boolean;\n className?: string;\n style?: CSSProperties;\n}\n\nexport const NavigationShell = React.forwardRef<HTMLDivElement, NavigationShellProps>(\n ({ children, ...props }, ref) => (\n <NavigationContainer ref={ref} {...props}>\n {children}\n </NavigationContainer>\n ),\n);\n\nNavigationShell.displayName = 'NavigationShell';\n\nexport const LogoBar: React.FC<PropsWithChildren> = ({ children }) => (\n <LogoContainer>{children}</LogoContainer>\n);\n\nexport const MenuList: React.FC<PropsWithChildren<{ variant?: string; size?: string }>> = ({\n children,\n ...props\n}) => <StyledList {...props}>{children}</StyledList>;\n\nexport const CollapseToggle: React.FC<PropsWithChildren<{ onClick: () => void }>> = ({\n children,\n onClick,\n}) => <CollapseButton onClick={onClick}>{children}</CollapseButton>;\n\nexport const MegaSection: React.FC<{ children: ReactNode }> = ({ children }) => (\n <MegaMenuSection>{children}</MegaMenuSection>\n);\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/TableFilter/TableFilter.tsx"],"sourcesContent":["'use client';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport SearchIcon from '@mui/icons-material/Search';\nimport Box from '@mui/material/Box/index.js';\nimport Checkbox from '@mui/material/Checkbox/index.js';\nimport Divider from '@mui/material/Divider/index.js';\nimport FormControlLabel from '@mui/material/FormControlLabel/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport InputAdornment from '@mui/material/InputAdornment/index.js';\nimport Link from '@mui/material/Link/index.js';\nimport TextField from '@mui/material/TextField/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useRef, useState } from 'react';\n\nimport { TableFilterContext, useTableFilterContext } from './TableFilterContext';\nimport type {\n TableFilterCheckboxFieldProps,\n TableFilterKeywordProps,\n TableFilterLayoutProps,\n TableFilterMainProps,\n TableFilterPanelProps,\n TableFilterProps,\n TableFilterRangeFieldProps,\n TableFilterSectionProps,\n} from './TableFilter.types';\nimport { fieldTextFieldStyles } from '../../../tokens/field-height';\nimport { sxRem } from '../../../tokens/relative';\n\nconst PANEL_WIDTH = 280;\n\n/**\n * Compound filter-panel system, MUI port of the reference `TableFilter`. Provides\n * open/close state; `Panel` slides in from the right beside `Main` (no overlap).\n *\n * @example\n * ```tsx\n * <TableFilter open={open} onOpenChange={setOpen} hasActiveFilters={n > 0}>\n * <TableFilter.Layout>\n * <TableFilter.Main>{table}</TableFilter.Main>\n * <TableFilter.Panel onClearAll={clearAll}>\n * <TableFilter.Keyword value={q} onChange={setQ} />\n * <TableFilter.Section title=\"Attributes\">\n * <TableFilter.CheckboxField label=\"Category\" options={cats} selected={sel} onToggle={toggle} />\n * <TableFilter.RangeField label=\"Price\" unit=\"R$\" value={price} onChange={setPrice} />\n * </TableFilter.Section>\n * </TableFilter.Panel>\n * </TableFilter.Layout>\n * </TableFilter>\n * ```\n */\nexport function TableFilter({\n children,\n open,\n onOpenChange,\n hasActiveFilters = false,\n copy,\n}: TableFilterProps): React.JSX.Element {\n return (\n <TableFilterContext.Provider value={{ open, onOpenChange, hasActiveFilters, copy }}>\n {children}\n </TableFilterContext.Provider>\n );\n}\nTableFilter.displayName = 'TableFilter';\n\nconst TableFilterLayout = ({ children, className }: TableFilterLayoutProps): React.JSX.Element => {\n const { open } = useTableFilterContext();\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n minHeight: 0,\n minWidth: 0,\n flex: 1,\n alignItems: 'stretch',\n overflow: 'hidden',\n gap: open ? 2 : 0,\n }}\n >\n {children}\n </Box>\n );\n};\nTableFilterLayout.displayName = 'TableFilter.Layout';\n\nconst TableFilterMain = ({ children, className }: TableFilterMainProps): React.JSX.Element => (\n <Box className={className} sx={{ minWidth: 0, flex: 1, overflowY: 'auto', overflowX: 'hidden' }}>\n {children}\n </Box>\n);\nTableFilterMain.displayName = 'TableFilter.Main';\n\nconst TableFilterPanel = ({\n children,\n onClearAll,\n ariaLabel = 'Filters',\n clearTestId,\n}: TableFilterPanelProps): React.JSX.Element => {\n const { open, copy } = useTableFilterContext();\n return (\n <Box\n component=\"aside\"\n aria-label={ariaLabel}\n aria-hidden={!open}\n sx={{\n display: 'flex',\n minHeight: 0,\n flexShrink: 0,\n flexDirection: 'column',\n alignSelf: 'stretch',\n overflow: 'hidden',\n bgcolor: 'background.paper',\n width: open ? PANEL_WIDTH : 0,\n borderLeft: open ? 1 : 0,\n borderColor: 'divider',\n transition: 'width 300ms ease-in-out',\n '@media (prefers-reduced-motion: reduce)': { transition: 'none' },\n }}\n >\n <Box\n sx={{\n display: 'flex',\n minHeight: 0,\n flex: 1,\n flexDirection: 'column',\n overflowY: 'auto',\n overflowX: 'hidden',\n visibility: open ? 'visible' : 'hidden',\n opacity: open ? 1 : 0,\n pointerEvents: open ? 'auto' : 'none',\n transition: 'opacity 200ms ease-out',\n }}\n >\n <Box sx={{ boxSizing: 'border-box', display: 'flex', width: '100%', minWidth: 0, flexDirection: 'column', gap: 2.5, p: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Link\n component=\"button\"\n type=\"button\"\n underline=\"hover\"\n data-testid={clearTestId}\n onClick={onClearAll}\n sx={{ fontSize: sxRem(12), color: 'text.secondary' }}\n >\n {copy.clearAllFilters}\n </Link>\n </Box>\n {children}\n </Box>\n </Box>\n </Box>\n );\n};\nTableFilterPanel.displayName = 'TableFilter.Panel';\n\nconst TableFilterKeyword = ({\n value,\n onChange,\n placeholder = 'Press Enter to filter',\n label = 'Filter by keyword',\n testId,\n}: TableFilterKeywordProps): React.JSX.Element => {\n const { copy } = useTableFilterContext();\n const [draft, setDraft] = useState(value);\n const prevValue = useRef(value);\n if (prevValue.current !== value) {\n prevValue.current = value;\n if (draft !== value) setDraft(value);\n }\n\n const commit = (): void => {\n if (draft !== value) onChange(draft);\n };\n const clearKeyword = (): void => {\n setDraft('');\n if (value !== '') onChange('');\n };\n\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography component=\"label\" sx={{ fontSize: sxRem(12), fontWeight: 500, color: 'text.secondary' }}>\n {label}\n </Typography>\n <TextField\n size=\"small\"\n sx={fieldTextFieldStyles}\n name=\"keyword\"\n placeholder={placeholder}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={commit}\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return;\n event.preventDefault();\n commit();\n }}\n inputProps={{ 'aria-label': label, 'data-testid': testId }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon sx={{ fontSize: sxRem(16), color: 'text.secondary' }} />\n </InputAdornment>\n ),\n endAdornment:\n draft !== '' ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n aria-label={copy.clearKeyword}\n data-testid={testId ? `${testId}-clear` : undefined}\n onMouseDown={(event) => event.preventDefault()}\n onClick={clearKeyword}\n >\n <CloseIcon sx={{ fontSize: sxRem(16) }} />\n </IconButton>\n </InputAdornment>\n ) : null,\n }}\n />\n </Box>\n );\n};\nTableFilterKeyword.displayName = 'TableFilter.Keyword';\n\nconst TableFilterSection = ({ title, children }: TableFilterSectionProps): React.JSX.Element => (\n <Box>\n <Divider sx={{ mb: 2.5 }} />\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5 }}>\n <Typography component=\"h2\" sx={{ fontSize: sxRem(14), fontWeight: 600, color: 'text.primary' }}>\n {title}\n </Typography>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>{children}</Box>\n </Box>\n </Box>\n);\nTableFilterSection.displayName = 'TableFilter.Section';\n\nfunction TableFilterCheckboxField<TValue extends string = string>({\n label,\n options,\n selected,\n onToggle,\n testId,\n}: TableFilterCheckboxFieldProps<TValue>): React.JSX.Element {\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }} data-testid={testId}>\n <Typography sx={{ fontSize: sxRem(12), fontWeight: 500, color: 'text.secondary' }}>{label}</Typography>\n <Box sx={{ display: 'flex', flexDirection: 'column' }}>\n {options.map((option) => {\n const checked = selected.has(option.value);\n return (\n <FormControlLabel\n key={option.value}\n control={\n <Checkbox\n size=\"small\"\n checked={checked}\n onChange={(event) => onToggle(option.value, event.target.checked)}\n data-testid={testId ? `${testId}-${option.value}` : undefined}\n sx={{ py: 0.25 }}\n />\n }\n label={\n <Box component=\"span\" sx={{ fontSize: sxRem(14) }}>\n {option.label}\n {option.count != null && (\n <Box component=\"span\" sx={{ color: 'text.secondary' }}>\n {' '}\n ({option.count})\n </Box>\n )}\n </Box>\n }\n sx={{ ml: -0.5, mr: 0 }}\n />\n );\n })}\n </Box>\n </Box>\n );\n}\nTableFilterCheckboxField.displayName = 'TableFilter.CheckboxField';\n\nfunction parseBound(text: string): number | undefined {\n if (text.trim() === '') return undefined;\n const parsed = Number(text);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\n/** One numeric bound input (min or max) for {@link TableFilterRangeField}. */\nfunction RangeBound({\n bound,\n error,\n placeholder,\n step,\n ariaLabel,\n testId,\n onChange,\n}: {\n bound: number | undefined;\n error: boolean;\n placeholder: string;\n step?: number;\n ariaLabel: string;\n testId?: string;\n onChange: (next: number | undefined) => void;\n}): React.JSX.Element {\n return (\n <TextField\n size=\"small\"\n sx={fieldTextFieldStyles}\n type=\"number\"\n error={error}\n placeholder={placeholder}\n value={bound != null ? String(bound) : ''}\n onChange={(event) => onChange(parseBound(event.target.value))}\n inputProps={{ step, 'aria-label': ariaLabel, 'data-testid': testId }}\n />\n );\n}\n\n/** Inverted range: both ends set and max < min (surfaced to the user as an error). */\nconst isRangeInverted = (value: { min?: number; max?: number }): boolean =>\n value.min != null && value.max != null && value.max < value.min;\n\nconst TableFilterRangeField = ({\n label,\n value,\n onChange,\n unit,\n step,\n minPlaceholder,\n maxPlaceholder,\n invalidLabel,\n testId,\n}: TableFilterRangeFieldProps): React.JSX.Element => {\n const { copy } = useTableFilterContext();\n const invalid = isRangeInverted(value);\n // A field may override any of the three; unset, they come from the root's\n // table. Neither path reaches an English literal in this package.\n const minText = minPlaceholder ?? copy.rangeMin;\n const maxText = maxPlaceholder ?? copy.rangeMax;\n const invalidText = invalidLabel ?? copy.invalidRange;\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }} data-testid={testId}>\n <Typography sx={{ fontSize: sxRem(12), fontWeight: 500, color: 'text.secondary' }}>\n {label}\n {unit ? ` (${unit})` : ''}\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <RangeBound\n bound={value.min}\n error={invalid}\n placeholder={minText}\n step={step}\n ariaLabel={`${label} ${minText}`}\n testId={testId ? `${testId}-min` : undefined}\n onChange={(min) => onChange({ ...value, min })}\n />\n <Typography component=\"span\" sx={{ color: 'text.secondary' }}>\n –\n </Typography>\n <RangeBound\n bound={value.max}\n error={invalid}\n placeholder={maxText}\n step={step}\n ariaLabel={`${label} ${maxText}`}\n testId={testId ? `${testId}-max` : undefined}\n onChange={(max) => onChange({ ...value, max })}\n />\n </Box>\n {invalid && (\n <Typography\n role=\"alert\"\n data-testid={testId ? `${testId}-error` : undefined}\n sx={{ fontSize: sxRem(11.2), color: 'error.main' }}\n >\n {invalidText}\n </Typography>\n )}\n </Box>\n );\n};\nTableFilterRangeField.displayName = 'TableFilter.RangeField';\n\nTableFilter.Layout = TableFilterLayout;\nTableFilter.Main = TableFilterMain;\nTableFilter.Panel = TableFilterPanel;\nTableFilter.Keyword = TableFilterKeyword;\nTableFilter.Section = TableFilterSection;\nTableFilter.CheckboxField = TableFilterCheckboxField;\nTableFilter.RangeField = TableFilterRangeField;\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/feedback/Modal/Modal.styles.ts"],"sourcesContent":["import { alpha, keyframes } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport { scrim, shadowInk } from '../../../tokens/ink';\n\nimport type { ModalProps } from './Modal.types';\n\ntype Variant = NonNullable<ModalProps['variant']>;\ntype Size = NonNullable<ModalProps['size']>;\ntype Radius = NonNullable<ModalProps['borderRadius']>;\n\nconst pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 20px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\nconst RADII: Record<Radius, (theme: Theme) => number | string> = {\n none: () => 0,\n sm: (theme) => theme.spacing(0.5),\n md: (theme) => theme.spacing(1),\n lg: (theme) => theme.spacing(2),\n xl: (theme) => theme.spacing(3),\n};\n\n/** Every preset is capped at 90vw so the panel never overflows a small screen. */\nconst WIDTHS: Record<Size, number> = { xs: 320, sm: 480, md: 640, lg: 800, xl: 960 };\n\n/**\n * Where the panel sits. Top and bottom are the same layout anchored to opposite\n * edges; centre is the only one that offsets on both axes.\n */\nconst PLACEMENTS: Record<string, CSSObject> = {\n top: { top: '10%', left: '50%', transform: 'translateX(-50%)', maxHeight: '80vh' },\n bottom: { bottom: '10%', left: '50%', transform: 'translateX(-50%)', maxHeight: '80vh' },\n center: {\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n maxHeight: '90vh',\n },\n};\n\ninterface ModalStyleFlags {\n variant: Variant;\n size: Size;\n borderRadius: Radius;\n glass: boolean;\n gradient: boolean;\n glow: boolean;\n pulse: boolean;\n}\n\n/** The ring that expands out of the panel while `pulse` is set. */\nconst pulseRing = (theme: Theme): CSSObject => ({\n content: '\"\"',\n position: 'absolute' as const,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.3,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none' as const,\n zIndex: -1,\n});\n\n/** The surface: its fill, its blur and the shadow that lifts it off the backdrop. */\nconst surface = (theme: Theme, flags: ModalStyleFlags): CSSObject => {\n const { variant, glass, gradient, glow } = flags;\n // The glass variant is the glass flag by another name, so either turns it on.\n const isGlass = glass || variant === 'glass';\n\n const boxShadow = glow\n ? `0 0 40px ${alpha(theme.palette.primary.main, 0.3)}`\n : isGlass\n ? `0 8px 32px ${shadowInk(theme, 0.1)}`\n : theme.shadows[8];\n\n return {\n backgroundColor: isGlass\n ? alpha(theme.palette.background.paper, 0.1)\n : theme.palette.background.paper,\n backdropFilter: isGlass ? 'blur(20px)' : gradient ? 'blur(10px)' : 'none',\n border: isGlass ? `1px solid ${alpha(theme.palette.primary.main, 0.2)}` : 'none',\n boxShadow,\n ...(gradient && {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.1)}, ${alpha(theme.palette.secondary.main, 0.1)})`,\n }),\n };\n};\n\nexport const panelSx = (theme: Theme, flags: ModalStyleFlags): CSSObject => {\n const { variant, size, borderRadius, pulse } = flags;\n\n return {\n // A pulsing panel positions its own ring, so it becomes the containing block.\n position: pulse ? ('relative' as const) : ('absolute' as const),\n width: WIDTHS[size] ?? WIDTHS.md,\n maxWidth: '90vw',\n borderRadius: (RADII[borderRadius] ?? RADII.lg)(theme),\n outline: 0,\n overflowY: 'auto',\n transition: theme.transitions.create(\n ['box-shadow', 'background-color', 'backdrop-filter', 'transform'],\n { duration: theme.transitions.duration.standard },\n ),\n ...(PLACEMENTS[variant] ?? PLACEMENTS.center),\n ...surface(theme, flags),\n ...(pulse && { '&::after': pulseRing(theme) }),\n };\n};\n\nexport const backdropSx = (theme: Theme, isGlass: boolean): CSSObject => ({\n backgroundColor: scrim(theme, isGlass ? 0.2 : 0.5),\n backdropFilter: isGlass ? 'blur(8px)' : 'none',\n});\n"],"mappings":"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","names":[]}
|