@12-apps/ui 6.89.2 → 6.91.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/components-catalog.md +2 -2
- package/dist/_internal/components/data-display/Alert/Alert.js +3 -3
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +4 -4
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
- package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +4 -3
- package/dist/_internal/components/data-display/Carousel/Carousel.js +5 -4
- package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +3 -2
- package/dist/_internal/components/data-display/Chart/Chart.js +5 -5
- package/dist/_internal/components/data-display/Chart/SpecChart.js +8 -8
- package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +4 -4
- package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
- package/dist/_internal/components/data-display/Chip/Chip.js +3 -3
- package/dist/_internal/components/data-display/Chip/Chip.styles.js +2 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +56 -31
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +64 -39
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +6 -6
- package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +7 -7
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +5 -5
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +9 -9
- package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +5 -3
- package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +31 -6
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +53 -28
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +36 -11
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +32 -7
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +33 -8
- package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-preset-chips.js +10 -3
- package/dist/_internal/components/data-display/DataViews/data-views-range-bounds.js +47 -0
- package/dist/_internal/components/data-display/DataViews/data-views-range-calendar.js +36 -0
- package/dist/_internal/components/data-display/DataViews/data-views-range-calendar.js.map +1 -0
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +32 -6
- package/dist/_internal/components/data-display/DataViews/data-views-range-summary.js +12 -0
- package/dist/_internal/components/data-display/DataViews/data-views-range-summary.js.map +1 -0
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-still-anchor.js +9 -0
- package/dist/_internal/components/data-display/DataViews/data-views-still-anchor.js.map +1 -0
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +2 -2
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +4 -4
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
- package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +13 -12
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +12 -11
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -1
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js.map +1 -1
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +15 -15
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +7 -7
- package/dist/_internal/components/data-display/Lightbox/LightboxControls.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/LightboxThumbnails.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapControlBar.js +4 -3
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +6 -5
- package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +5 -4
- package/dist/_internal/components/data-display/MapPreview/MapPreview.helpers.js +3 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +11 -10
- package/dist/_internal/components/data-display/RegionMap/RegionMap.hooks.js +2 -1
- package/dist/_internal/components/data-display/RegionMap/RegionMap.js +4 -3
- package/dist/_internal/components/data-display/RegionMap/RegionMap.view.js +19 -0
- package/dist/_internal/components/data-display/RegionMap/RegionMap.view.js.map +1 -0
- package/dist/_internal/components/data-display/RegionMap/RegionMapDrawing.js +1 -1
- package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
- package/dist/_internal/components/data-display/index.js +67 -61
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +4 -4
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.js +6 -6
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.overview.js +5 -5
- package/dist/_internal/components/feedback/SequenceResolver/SequenceResolver.parts.js +4 -4
- package/dist/_internal/components/feedback/index.js +7 -7
- package/dist/_internal/components/form/Calendar/Calendar.js +5 -5
- package/dist/_internal/components/form/Calendar/CalendarDay.js +1 -1
- package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
- package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
- package/dist/_internal/components/form/Calendar/CalendarSelectorsMonth.js +4 -4
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +3 -3
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +10 -10
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +2 -2
- package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +3 -3
- package/dist/_internal/components/form/index.js +24 -24
- package/dist/_internal/components/index.js +102 -96
- package/dist/_internal/components/layout/SettingCard/SettingCard.js +8 -8
- package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +7 -7
- package/dist/_internal/components/layout/SettingCard/SettingGrid.js +5 -5
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js +9 -9
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +8 -8
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js +9 -9
- package/dist/_internal/components/layout/index.js +12 -12
- package/dist/_internal/en-US.data-display.js +2 -1
- package/dist/_internal/pt-BR.data-display.js +2 -1
- package/dist/_internal/user-avatar/user-avatar.js +4 -4
- package/dist/charts.js +11 -11
- package/dist/{chunk-FJ3UZ4RC.js → chunk-2FKWKLSC.js} +5 -3
- package/dist/chunk-2FKWKLSC.js.map +1 -0
- package/dist/{chunk-K2VDRODL.js → chunk-3IDL7NK7.js} +2 -2
- package/dist/{chunk-6ATXOJVQ.js → chunk-3JZ3KEQQ.js} +4 -4
- package/dist/{chunk-XHIBFBNP.js → chunk-3ZRK3BRN.js} +4 -2
- package/dist/chunk-3ZRK3BRN.js.map +1 -0
- package/dist/{chunk-EOIRU62W.js → chunk-42D7KBDH.js} +2 -2
- package/dist/{chunk-LXIPBHNJ.js → chunk-42TOCPXB.js} +5 -5
- package/dist/{chunk-WAO7UQRS.js → chunk-4KWDNGMA.js} +3 -3
- package/dist/{chunk-X5OGIT2F.js → chunk-4L54KUZV.js} +22 -4
- package/dist/chunk-4L54KUZV.js.map +1 -0
- package/dist/{chunk-JIEVKHOH.js → chunk-4QR7LM5F.js} +2 -2
- package/dist/{chunk-WJMSND5Q.js → chunk-5E2CRRD4.js} +5 -5
- package/dist/{chunk-ZDAAHCIS.js → chunk-5HADIIWN.js} +3 -3
- package/dist/{chunk-BP3ZKIPE.js → chunk-64UNVW6D.js} +4 -4
- package/dist/{chunk-TRYR424I.js → chunk-6LOWZCH7.js} +15 -1
- package/dist/chunk-6LOWZCH7.js.map +1 -0
- package/dist/{chunk-6WHIJPEF.js → chunk-6PU5P7QT.js} +2 -2
- package/dist/{chunk-7F6D73NL.js → chunk-76DX2IMH.js} +2 -2
- package/dist/chunk-7CUZTWKW.js +52 -0
- package/dist/chunk-7CUZTWKW.js.map +1 -0
- package/dist/{chunk-5RSK5M6M.js → chunk-7NP2JHGM.js} +63 -126
- package/dist/chunk-7NP2JHGM.js.map +1 -0
- package/dist/{chunk-YNZUYZ2O.js → chunk-A3DDEKLV.js} +2 -2
- package/dist/{chunk-FEKWKWGK.js → chunk-ARGVUTTL.js} +15 -1
- package/dist/chunk-ARGVUTTL.js.map +1 -0
- package/dist/{chunk-BMTIBQQC.js → chunk-BBBHPK2Q.js} +6 -6
- package/dist/{chunk-DYHOBKPU.js → chunk-BLZDSCIZ.js} +6 -6
- package/dist/{chunk-EUR2ORTN.js → chunk-CSJ7WNXU.js} +2 -2
- package/dist/{chunk-OWRQOYUE.js → chunk-DA3D5X5Z.js} +5 -5
- package/dist/{chunk-LV6AD6XC.js → chunk-DBI6AMNY.js} +4 -4
- package/dist/{chunk-3YFDGFEK.js → chunk-DVX4HDNP.js} +2 -2
- package/dist/chunk-DY2I6LMX.js +1 -0
- package/dist/chunk-DY2I6LMX.js.map +1 -0
- package/dist/{chunk-QKOJ4637.js → chunk-E6K2UZGR.js} +3 -3
- package/dist/{chunk-7XSCEHGA.js → chunk-EOQ6EKTS.js} +7 -7
- package/dist/chunk-FORAVDJF.js +164 -0
- package/dist/chunk-FORAVDJF.js.map +1 -0
- package/dist/chunk-FWAY2SAI.js +72 -0
- package/dist/chunk-FWAY2SAI.js.map +1 -0
- package/dist/{chunk-Q2ERGAQO.js → chunk-FYAW5GBF.js} +33 -6
- package/dist/chunk-FYAW5GBF.js.map +1 -0
- package/dist/{chunk-GMRQPNG3.js → chunk-G2NVBCF7.js} +20 -25
- package/dist/chunk-G2NVBCF7.js.map +1 -0
- package/dist/{chunk-Z5WUSI47.js → chunk-G3JFESKD.js} +6 -6
- package/dist/{chunk-3EIRRLCQ.js → chunk-HC6OZ7QK.js} +2 -2
- package/dist/{chunk-SKIAWOUC.js → chunk-HOPRZEBM.js} +3 -3
- package/dist/{chunk-OBA75Y5O.js → chunk-HS662RLW.js} +61 -33
- package/dist/chunk-HS662RLW.js.map +1 -0
- package/dist/{chunk-O63ZROSY.js → chunk-IWSTMVCA.js} +7 -7
- package/dist/chunk-J2AVWIMM.js +60 -0
- package/dist/chunk-J2AVWIMM.js.map +1 -0
- package/dist/{chunk-7QKIL5YF.js → chunk-J2GDA64N.js} +4 -4
- package/dist/{chunk-TZC6KIK2.js → chunk-JG733RMP.js} +5 -5
- package/dist/{chunk-CW5Z67NA.js → chunk-JH2XLVWM.js} +2 -2
- package/dist/{chunk-TYXFFNPM.js → chunk-JKZPGCN7.js} +11 -11
- package/dist/{chunk-QRRWLLXW.js → chunk-JN2IANXD.js} +3 -3
- package/dist/{chunk-HQCZT6TO.js → chunk-JVOEVTCZ.js} +5 -5
- package/dist/{chunk-GBB23QLL.js → chunk-KJKD6Y6V.js} +3 -3
- package/dist/{chunk-XLU5WFSY.js → chunk-L3PDY7CJ.js} +2 -2
- package/dist/{chunk-S6D7NOV7.js → chunk-L6JAALMX.js} +3 -3
- package/dist/{chunk-72HOUWAW.js → chunk-L6YTVXGN.js} +5 -3
- package/dist/{chunk-72HOUWAW.js.map → chunk-L6YTVXGN.js.map} +1 -1
- package/dist/chunk-LZNUBQ5I.js +181 -0
- package/dist/chunk-LZNUBQ5I.js.map +1 -0
- package/dist/{chunk-BECKKDYG.js → chunk-M2M4IDFU.js} +2 -2
- package/dist/{chunk-AMLHEKSV.js → chunk-M3XJVD5G.js} +5 -5
- package/dist/{chunk-CSGBHYW6.js → chunk-M5Y42AZ4.js} +2 -2
- package/dist/chunk-MICX23P4.js +122 -0
- package/dist/chunk-MICX23P4.js.map +1 -0
- package/dist/{chunk-5CP5Z3YU.js → chunk-MPWA55CF.js} +4 -4
- package/dist/{chunk-CJUK32UH.js → chunk-MYTV353T.js} +5 -5
- package/dist/{chunk-BO6MT2S2.js → chunk-MZAYIG2I.js} +7 -6
- package/dist/chunk-MZAYIG2I.js.map +1 -0
- package/dist/{chunk-AKE6KVQG.js → chunk-NGXL4R54.js} +5 -1
- package/dist/chunk-NGXL4R54.js.map +1 -0
- package/dist/{chunk-BEHT4IHH.js → chunk-NKEFH3RS.js} +6 -6
- package/dist/{chunk-NI67M453.js → chunk-PGANINQD.js} +5 -5
- package/dist/{chunk-RCTHCXS6.js → chunk-PJNIJIE6.js} +2 -2
- package/dist/{chunk-E2UOEI7N.js → chunk-Q3SILZTQ.js} +2 -2
- package/dist/{chunk-SB2SEGR6.js → chunk-QHIWV55K.js} +3 -3
- package/dist/{chunk-DHAXUVMR.js → chunk-QN7FVZQD.js} +4 -4
- package/dist/{chunk-5S5K73I6.js → chunk-QSOCOXVL.js} +3 -3
- package/dist/{chunk-NQCTANF3.js → chunk-QVDEGBME.js} +7 -7
- package/dist/{chunk-BQBEN44R.js → chunk-RDCIST7P.js} +2 -2
- package/dist/{chunk-HUXAIQC5.js → chunk-RZ3P4X2I.js} +2 -2
- package/dist/{chunk-QLJU7UUI.js → chunk-T7OIVPCO.js} +38 -3
- package/dist/chunk-T7OIVPCO.js.map +1 -0
- package/dist/{chunk-U2ILXZDG.js → chunk-TB5CRHTF.js} +2 -2
- package/dist/{chunk-X2GWR75Q.js → chunk-TSEBMVYY.js} +3 -3
- package/dist/{chunk-OKRITX4S.js → chunk-U2AEM3K4.js} +7 -7
- package/dist/{chunk-EXVCVXFX.js → chunk-U2QXQ7D4.js} +6 -6
- package/dist/{chunk-K6FCSB6T.js → chunk-U2SAW6DH.js} +2 -2
- package/dist/{chunk-DAHSKQBV.js → chunk-UMOHHWXY.js} +2 -2
- package/dist/{chunk-YDIC6LSP.js → chunk-VCQFDQM3.js} +27 -7
- package/dist/chunk-VCQFDQM3.js.map +1 -0
- package/dist/{chunk-P772HCHI.js → chunk-W676GY42.js} +4 -4
- package/dist/{chunk-BAQ3ITZV.js → chunk-WCF56ZCD.js} +2 -2
- package/dist/{chunk-6D5AMANO.js → chunk-WH3LUOCQ.js} +2 -2
- package/dist/{chunk-T2G4LDU5.js → chunk-WLLUARTC.js} +2 -2
- package/dist/{chunk-5BVAUUWL.js → chunk-X37NTEVS.js} +2 -2
- package/dist/{chunk-5KK3I42O.js → chunk-XILMDEGZ.js} +13 -10
- package/dist/chunk-XILMDEGZ.js.map +1 -0
- package/dist/{chunk-MW7P2C2C.js → chunk-YGQM6GFQ.js} +2 -2
- package/dist/{chunk-WW3F7DCX.js → chunk-Z2WZDVGG.js} +2 -2
- package/dist/{chunk-WNNA6YYE.js → chunk-Z7T4EFEC.js} +7 -4
- package/dist/chunk-Z7T4EFEC.js.map +1 -0
- package/dist/{chunk-LOLYBFYY.js → chunk-ZCNR4DN5.js} +5 -5
- package/dist/{chunk-COKPPU42.js → chunk-ZIHSCBMN.js} +12 -12
- package/dist/data-display/Alert.js +3 -3
- package/dist/data-display/AsyncStateContainer.js +3 -3
- package/dist/data-display/Avatar.js +3 -3
- package/dist/data-display/CardKit.js +15 -15
- package/dist/data-display/Carousel.js +5 -4
- package/dist/data-display/Chart.js +11 -11
- package/dist/data-display/Chip.js +3 -3
- package/dist/data-display/DataGrid.js +2 -2
- package/dist/data-display/DataViews.js +75 -50
- package/dist/data-display/DayRuler.js +4 -4
- package/dist/data-display/EmptyState.js +2 -2
- package/dist/data-display/FleetMap.js +15 -15
- package/dist/data-display/InteractiveTooltip.js +2 -2
- package/dist/data-display/Lightbox.js +7 -7
- package/dist/data-display/MapPreview.js +11 -10
- package/dist/data-display/RegionMap.js +11 -5
- package/dist/data-display/SectionOnboarding.js +3 -3
- package/dist/en-US.js +1 -1
- package/dist/feedback/NotificationStatusNotice.js +4 -4
- package/dist/feedback/SequenceResolver.js +6 -6
- package/dist/form/Calendar.js +5 -5
- package/dist/form/DateRangePicker.js +10 -10
- package/dist/layout/SettingCard.js +12 -12
- package/dist/locales.js +5 -5
- package/dist/pt-BR.js +1 -1
- package/dist/types/components/data-display/DataViews/data-views-bar-controls.d.ts +15 -1
- package/dist/types/components/data-display/DataViews/data-views-bar-controls.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +35 -0
- package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts +7 -1
- package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-more-filters.d.ts +5 -3
- package/dist/types/components/data-display/DataViews/data-views-more-filters.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-number-input.d.ts +10 -2
- package/dist/types/components/data-display/DataViews/data-views-number-input.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-preset-chips.d.ts +10 -0
- package/dist/types/components/data-display/DataViews/data-views-preset-chips.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-range-bounds.d.ts +35 -0
- package/dist/types/components/data-display/DataViews/data-views-range-bounds.d.ts.map +1 -0
- package/dist/types/components/data-display/DataViews/data-views-range-calendar.d.ts +35 -0
- package/dist/types/components/data-display/DataViews/data-views-range-calendar.d.ts.map +1 -0
- package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts +2 -11
- package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-range-summary.d.ts +21 -0
- package/dist/types/components/data-display/DataViews/data-views-range-summary.d.ts.map +1 -0
- package/dist/types/components/data-display/DataViews/data-views-still-anchor.d.ts +45 -0
- package/dist/types/components/data-display/DataViews/data-views-still-anchor.d.ts.map +1 -0
- package/dist/types/components/data-display/LazyImage/LazyImage.hooks.d.ts +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.d.ts +4 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.hooks.d.ts +4 -2
- package/dist/types/components/data-display/RegionMap/RegionMap.hooks.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts +40 -0
- package/dist/types/components/data-display/RegionMap/RegionMap.types.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/RegionMap.view.d.ts +36 -0
- package/dist/types/components/data-display/RegionMap/RegionMap.view.d.ts.map +1 -0
- package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts +4 -1
- package/dist/types/components/data-display/RegionMap/RegionMapDrawing.d.ts.map +1 -1
- package/dist/types/components/data-display/RegionMap/index.d.ts +3 -2
- package/dist/types/components/data-display/RegionMap/index.d.ts.map +1 -1
- package/dist/types/components/form/Calendar/Calendar.d.ts.map +1 -1
- package/dist/types/components/form/Calendar/CalendarDay.d.ts +2 -0
- package/dist/types/components/form/Calendar/CalendarDay.d.ts.map +1 -1
- package/dist/types/components/form/Calendar/CalendarDayCell.d.ts +2 -0
- package/dist/types/components/form/Calendar/CalendarDayCell.d.ts.map +1 -1
- package/dist/types/components/form/Calendar/CalendarMonth.d.ts +5 -0
- package/dist/types/components/form/Calendar/CalendarMonth.d.ts.map +1 -1
- package/dist/types/en-US.data-display.d.ts.map +1 -1
- package/dist/types/pt-BR.data-display.d.ts.map +1 -1
- package/dist/user-avatar.js +4 -4
- package/package.json +1 -1
- package/src/components/data-display/DataViews/RESPONSIVE-BEHAVIOUR.md +59 -0
- package/src/components/data-display/DataViews/data-views-bar-controls.tsx +56 -1
- package/src/components/data-display/DataViews/data-views-copy.ts +36 -0
- package/src/components/data-display/DataViews/data-views-day-input.tsx +9 -1
- package/src/components/data-display/DataViews/data-views-inline-bar.tsx +5 -3
- package/src/components/data-display/DataViews/data-views-more-fields.tsx +1 -0
- package/src/components/data-display/DataViews/data-views-more-filters.tsx +82 -29
- package/src/components/data-display/DataViews/data-views-number-input.tsx +19 -9
- package/src/components/data-display/DataViews/data-views-preset-chips.tsx +165 -16
- package/src/components/data-display/DataViews/data-views-range-bounds.tsx +223 -0
- package/src/components/data-display/DataViews/data-views-range-calendar.tsx +185 -0
- package/src/components/data-display/DataViews/data-views-range-pill.tsx +71 -154
- package/src/components/data-display/DataViews/data-views-range-summary.tsx +66 -0
- package/src/components/data-display/DataViews/data-views-still-anchor.ts +93 -0
- package/src/components/data-display/RegionMap/RegionMap.hooks.ts +24 -33
- package/src/components/data-display/RegionMap/RegionMap.md +27 -0
- package/src/components/data-display/RegionMap/RegionMap.tsx +7 -1
- package/src/components/data-display/RegionMap/RegionMap.types.ts +41 -0
- package/src/components/data-display/RegionMap/RegionMap.view.ts +105 -0
- package/src/components/data-display/RegionMap/RegionMapDrawing.tsx +11 -0
- package/src/components/data-display/RegionMap/index.ts +5 -1
- package/src/components/data-display/RegionMap/tests.md +10 -2
- package/src/components/form/Calendar/Calendar.md +17 -2
- package/src/components/form/Calendar/Calendar.tsx +56 -3
- package/src/components/form/Calendar/CalendarDay.tsx +33 -3
- package/src/components/form/Calendar/CalendarDayCell.tsx +4 -0
- package/src/components/form/Calendar/CalendarMonth.tsx +27 -5
- package/src/en-US.data-display.ts +12 -0
- package/src/pt-BR.data-display.ts +12 -0
- package/dist/chunk-5KK3I42O.js.map +0 -1
- package/dist/chunk-5RSK5M6M.js.map +0 -1
- package/dist/chunk-7D7CJRL7.js +0 -78
- package/dist/chunk-7D7CJRL7.js.map +0 -1
- package/dist/chunk-ACFKPE2T.js +0 -1
- package/dist/chunk-AKE6KVQG.js.map +0 -1
- package/dist/chunk-BO6MT2S2.js.map +0 -1
- package/dist/chunk-FEKWKWGK.js.map +0 -1
- package/dist/chunk-FJ3UZ4RC.js.map +0 -1
- package/dist/chunk-GMRQPNG3.js.map +0 -1
- package/dist/chunk-OBA75Y5O.js.map +0 -1
- package/dist/chunk-Q2ERGAQO.js.map +0 -1
- package/dist/chunk-QLJU7UUI.js.map +0 -1
- package/dist/chunk-TRYR424I.js.map +0 -1
- package/dist/chunk-WNNA6YYE.js.map +0 -1
- package/dist/chunk-X5OGIT2F.js.map +0 -1
- package/dist/chunk-XHIBFBNP.js.map +0 -1
- package/dist/chunk-YDIC6LSP.js.map +0 -1
- /package/dist/{chunk-ACFKPE2T.js.map → _internal/components/data-display/DataViews/data-views-range-bounds.js.map} +0 -0
- /package/dist/{chunk-K2VDRODL.js.map → chunk-3IDL7NK7.js.map} +0 -0
- /package/dist/{chunk-6ATXOJVQ.js.map → chunk-3JZ3KEQQ.js.map} +0 -0
- /package/dist/{chunk-EOIRU62W.js.map → chunk-42D7KBDH.js.map} +0 -0
- /package/dist/{chunk-LXIPBHNJ.js.map → chunk-42TOCPXB.js.map} +0 -0
- /package/dist/{chunk-WAO7UQRS.js.map → chunk-4KWDNGMA.js.map} +0 -0
- /package/dist/{chunk-JIEVKHOH.js.map → chunk-4QR7LM5F.js.map} +0 -0
- /package/dist/{chunk-WJMSND5Q.js.map → chunk-5E2CRRD4.js.map} +0 -0
- /package/dist/{chunk-ZDAAHCIS.js.map → chunk-5HADIIWN.js.map} +0 -0
- /package/dist/{chunk-BP3ZKIPE.js.map → chunk-64UNVW6D.js.map} +0 -0
- /package/dist/{chunk-6WHIJPEF.js.map → chunk-6PU5P7QT.js.map} +0 -0
- /package/dist/{chunk-7F6D73NL.js.map → chunk-76DX2IMH.js.map} +0 -0
- /package/dist/{chunk-YNZUYZ2O.js.map → chunk-A3DDEKLV.js.map} +0 -0
- /package/dist/{chunk-BMTIBQQC.js.map → chunk-BBBHPK2Q.js.map} +0 -0
- /package/dist/{chunk-DYHOBKPU.js.map → chunk-BLZDSCIZ.js.map} +0 -0
- /package/dist/{chunk-EUR2ORTN.js.map → chunk-CSJ7WNXU.js.map} +0 -0
- /package/dist/{chunk-OWRQOYUE.js.map → chunk-DA3D5X5Z.js.map} +0 -0
- /package/dist/{chunk-LV6AD6XC.js.map → chunk-DBI6AMNY.js.map} +0 -0
- /package/dist/{chunk-3YFDGFEK.js.map → chunk-DVX4HDNP.js.map} +0 -0
- /package/dist/{chunk-QKOJ4637.js.map → chunk-E6K2UZGR.js.map} +0 -0
- /package/dist/{chunk-7XSCEHGA.js.map → chunk-EOQ6EKTS.js.map} +0 -0
- /package/dist/{chunk-Z5WUSI47.js.map → chunk-G3JFESKD.js.map} +0 -0
- /package/dist/{chunk-3EIRRLCQ.js.map → chunk-HC6OZ7QK.js.map} +0 -0
- /package/dist/{chunk-SKIAWOUC.js.map → chunk-HOPRZEBM.js.map} +0 -0
- /package/dist/{chunk-O63ZROSY.js.map → chunk-IWSTMVCA.js.map} +0 -0
- /package/dist/{chunk-7QKIL5YF.js.map → chunk-J2GDA64N.js.map} +0 -0
- /package/dist/{chunk-TZC6KIK2.js.map → chunk-JG733RMP.js.map} +0 -0
- /package/dist/{chunk-CW5Z67NA.js.map → chunk-JH2XLVWM.js.map} +0 -0
- /package/dist/{chunk-TYXFFNPM.js.map → chunk-JKZPGCN7.js.map} +0 -0
- /package/dist/{chunk-QRRWLLXW.js.map → chunk-JN2IANXD.js.map} +0 -0
- /package/dist/{chunk-HQCZT6TO.js.map → chunk-JVOEVTCZ.js.map} +0 -0
- /package/dist/{chunk-GBB23QLL.js.map → chunk-KJKD6Y6V.js.map} +0 -0
- /package/dist/{chunk-XLU5WFSY.js.map → chunk-L3PDY7CJ.js.map} +0 -0
- /package/dist/{chunk-S6D7NOV7.js.map → chunk-L6JAALMX.js.map} +0 -0
- /package/dist/{chunk-BECKKDYG.js.map → chunk-M2M4IDFU.js.map} +0 -0
- /package/dist/{chunk-AMLHEKSV.js.map → chunk-M3XJVD5G.js.map} +0 -0
- /package/dist/{chunk-CSGBHYW6.js.map → chunk-M5Y42AZ4.js.map} +0 -0
- /package/dist/{chunk-5CP5Z3YU.js.map → chunk-MPWA55CF.js.map} +0 -0
- /package/dist/{chunk-CJUK32UH.js.map → chunk-MYTV353T.js.map} +0 -0
- /package/dist/{chunk-BEHT4IHH.js.map → chunk-NKEFH3RS.js.map} +0 -0
- /package/dist/{chunk-NI67M453.js.map → chunk-PGANINQD.js.map} +0 -0
- /package/dist/{chunk-RCTHCXS6.js.map → chunk-PJNIJIE6.js.map} +0 -0
- /package/dist/{chunk-E2UOEI7N.js.map → chunk-Q3SILZTQ.js.map} +0 -0
- /package/dist/{chunk-SB2SEGR6.js.map → chunk-QHIWV55K.js.map} +0 -0
- /package/dist/{chunk-DHAXUVMR.js.map → chunk-QN7FVZQD.js.map} +0 -0
- /package/dist/{chunk-5S5K73I6.js.map → chunk-QSOCOXVL.js.map} +0 -0
- /package/dist/{chunk-NQCTANF3.js.map → chunk-QVDEGBME.js.map} +0 -0
- /package/dist/{chunk-BQBEN44R.js.map → chunk-RDCIST7P.js.map} +0 -0
- /package/dist/{chunk-HUXAIQC5.js.map → chunk-RZ3P4X2I.js.map} +0 -0
- /package/dist/{chunk-U2ILXZDG.js.map → chunk-TB5CRHTF.js.map} +0 -0
- /package/dist/{chunk-X2GWR75Q.js.map → chunk-TSEBMVYY.js.map} +0 -0
- /package/dist/{chunk-OKRITX4S.js.map → chunk-U2AEM3K4.js.map} +0 -0
- /package/dist/{chunk-EXVCVXFX.js.map → chunk-U2QXQ7D4.js.map} +0 -0
- /package/dist/{chunk-K6FCSB6T.js.map → chunk-U2SAW6DH.js.map} +0 -0
- /package/dist/{chunk-DAHSKQBV.js.map → chunk-UMOHHWXY.js.map} +0 -0
- /package/dist/{chunk-P772HCHI.js.map → chunk-W676GY42.js.map} +0 -0
- /package/dist/{chunk-BAQ3ITZV.js.map → chunk-WCF56ZCD.js.map} +0 -0
- /package/dist/{chunk-6D5AMANO.js.map → chunk-WH3LUOCQ.js.map} +0 -0
- /package/dist/{chunk-T2G4LDU5.js.map → chunk-WLLUARTC.js.map} +0 -0
- /package/dist/{chunk-5BVAUUWL.js.map → chunk-X37NTEVS.js.map} +0 -0
- /package/dist/{chunk-MW7P2C2C.js.map → chunk-YGQM6GFQ.js.map} +0 -0
- /package/dist/{chunk-WW3F7DCX.js.map → chunk-Z2WZDVGG.js.map} +0 -0
- /package/dist/{chunk-LOLYBFYY.js.map → chunk-ZCNR4DN5.js.map} +0 -0
- /package/dist/{chunk-COKPPU42.js.map → chunk-ZIHSCBMN.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
RAIL_GAP_PX
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-BBBHPK2Q.js";
|
|
4
4
|
import {
|
|
5
5
|
COMPACT_BREAK,
|
|
6
6
|
META_BREAK
|
|
@@ -257,4 +257,4 @@ export {
|
|
|
257
257
|
ListCardActions,
|
|
258
258
|
ListCardTail
|
|
259
259
|
};
|
|
260
|
-
//# sourceMappingURL=chunk-
|
|
260
|
+
//# sourceMappingURL=chunk-CSJ7WNXU.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FleetBody
|
|
3
|
+
} from "./chunk-WCF56ZCD.js";
|
|
1
4
|
import {
|
|
2
5
|
useFleetMap
|
|
3
6
|
} from "./chunk-ZCPSND5Y.js";
|
|
4
|
-
import {
|
|
5
|
-
FleetBody
|
|
6
|
-
} from "./chunk-BAQ3ITZV.js";
|
|
7
7
|
import {
|
|
8
8
|
FLEET_DEFAULT_LAGGING_AFTER_SECONDS,
|
|
9
9
|
FLEET_DEFAULT_STALE_AFTER_SECONDS,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "./chunk-PUFA7FQ7.js";
|
|
15
15
|
import {
|
|
16
16
|
EmptyState
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-42TOCPXB.js";
|
|
18
18
|
import {
|
|
19
19
|
rem
|
|
20
20
|
} from "./chunk-YKCAJ2TN.js";
|
|
@@ -117,4 +117,4 @@ export {
|
|
|
117
117
|
FleetMap,
|
|
118
118
|
FleetMap_default
|
|
119
119
|
};
|
|
120
|
-
//# sourceMappingURL=chunk-
|
|
120
|
+
//# sourceMappingURL=chunk-DA3D5X5Z.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DataViewsDisplayPanel
|
|
3
|
-
} from "./chunk-6HXNFNOB.js";
|
|
4
1
|
import {
|
|
5
2
|
DataViewsExportMenu
|
|
6
3
|
} from "./chunk-4NG3LTRX.js";
|
|
4
|
+
import {
|
|
5
|
+
DataViewsDisplayPanel
|
|
6
|
+
} from "./chunk-6HXNFNOB.js";
|
|
7
7
|
import {
|
|
8
8
|
STICKY_BAR_ATTR
|
|
9
9
|
} from "./chunk-4IE66GY2.js";
|
|
@@ -143,4 +143,4 @@ function GridToolbar(props) {
|
|
|
143
143
|
export {
|
|
144
144
|
GridToolbar
|
|
145
145
|
};
|
|
146
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-DBI6AMNY.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useCardActions
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-PJNIJIE6.js";
|
|
4
4
|
import {
|
|
5
5
|
ConfirmActionDialog
|
|
6
6
|
} from "./chunk-7W5X3KQ2.js";
|
|
@@ -50,4 +50,4 @@ function useRemoveConfirm({
|
|
|
50
50
|
export {
|
|
51
51
|
useRemoveConfirm
|
|
52
52
|
};
|
|
53
|
-
//# sourceMappingURL=chunk-
|
|
53
|
+
//# sourceMappingURL=chunk-DVX4HDNP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-DY2I6LMX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
rowGutters
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UMOHHWXY.js";
|
|
4
4
|
import {
|
|
5
5
|
cellRailsTemplate
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BBBHPK2Q.js";
|
|
7
7
|
import {
|
|
8
8
|
cellTracks,
|
|
9
9
|
compactCellTracks,
|
|
@@ -55,4 +55,4 @@ export {
|
|
|
55
55
|
useRowLayout,
|
|
56
56
|
StandaloneContainer
|
|
57
57
|
};
|
|
58
|
-
//# sourceMappingURL=chunk-
|
|
58
|
+
//# sourceMappingURL=chunk-E6K2UZGR.js.map
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
pulseAnimation,
|
|
3
|
-
rotateAnimation,
|
|
4
|
-
scaleInAnimation,
|
|
5
|
-
shimmerAnimation
|
|
6
|
-
} from "./chunk-MTEQEPNY.js";
|
|
7
1
|
import {
|
|
8
2
|
ACTIVE_SCALE,
|
|
9
3
|
AVATAR_SIZES,
|
|
@@ -23,6 +17,12 @@ import {
|
|
|
23
17
|
SPINNER,
|
|
24
18
|
STATUS_DOT
|
|
25
19
|
} from "./chunk-6ZZGK5DT.js";
|
|
20
|
+
import {
|
|
21
|
+
pulseAnimation,
|
|
22
|
+
rotateAnimation,
|
|
23
|
+
scaleInAnimation,
|
|
24
|
+
shimmerAnimation
|
|
25
|
+
} from "./chunk-MTEQEPNY.js";
|
|
26
26
|
import {
|
|
27
27
|
absoluteInk,
|
|
28
28
|
controlNeutral,
|
|
@@ -277,4 +277,4 @@ function AvatarView(props) {
|
|
|
277
277
|
export {
|
|
278
278
|
AvatarView
|
|
279
279
|
};
|
|
280
|
-
//# sourceMappingURL=chunk-
|
|
280
|
+
//# sourceMappingURL=chunk-EOQ6EKTS.js.map
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RangePresets
|
|
3
|
+
} from "./chunk-LZNUBQ5I.js";
|
|
4
|
+
import {
|
|
5
|
+
NumberBoundInput
|
|
6
|
+
} from "./chunk-2FKWKLSC.js";
|
|
7
|
+
import {
|
|
8
|
+
useOutsideResetKey
|
|
9
|
+
} from "./chunk-YOPMXGHY.js";
|
|
10
|
+
import {
|
|
11
|
+
presetsFor
|
|
12
|
+
} from "./chunk-CBOB5AV6.js";
|
|
13
|
+
import {
|
|
14
|
+
DayRangeCalendar
|
|
15
|
+
} from "./chunk-MICX23P4.js";
|
|
16
|
+
import {
|
|
17
|
+
isRangeInverted
|
|
18
|
+
} from "./chunk-GCZJH4XL.js";
|
|
19
|
+
import {
|
|
20
|
+
useDataViewsCopy
|
|
21
|
+
} from "./chunk-KHG57NAE.js";
|
|
22
|
+
import {
|
|
23
|
+
DayBoundInput
|
|
24
|
+
} from "./chunk-L6YTVXGN.js";
|
|
25
|
+
import {
|
|
26
|
+
sxRem
|
|
27
|
+
} from "./chunk-YKCAJ2TN.js";
|
|
28
|
+
|
|
29
|
+
// src/components/data-display/DataViews/data-views-range-bounds.tsx
|
|
30
|
+
import Box from "@mui/material/Box/index.js";
|
|
31
|
+
import Typography from "@mui/material/Typography/index.js";
|
|
32
|
+
import { useState } from "react";
|
|
33
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
34
|
+
function BoundField({
|
|
35
|
+
field,
|
|
36
|
+
label,
|
|
37
|
+
value,
|
|
38
|
+
onChange,
|
|
39
|
+
testId,
|
|
40
|
+
fill
|
|
41
|
+
}) {
|
|
42
|
+
const copy = useDataViewsCopy();
|
|
43
|
+
if (field.kind === "day") {
|
|
44
|
+
return /* @__PURE__ */ jsx(
|
|
45
|
+
DayBoundInput,
|
|
46
|
+
{
|
|
47
|
+
fill: true,
|
|
48
|
+
mask: copy.filters.dayMask,
|
|
49
|
+
invalidMessage: copy.filters.dayInvalid,
|
|
50
|
+
label,
|
|
51
|
+
value: value == null ? void 0 : String(value),
|
|
52
|
+
onChange,
|
|
53
|
+
testId
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return /* @__PURE__ */ jsx(
|
|
58
|
+
NumberBoundInput,
|
|
59
|
+
{
|
|
60
|
+
fill,
|
|
61
|
+
label,
|
|
62
|
+
value,
|
|
63
|
+
unit: field.unit,
|
|
64
|
+
onChange,
|
|
65
|
+
testId
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
function BoundCell({ grow, children }) {
|
|
70
|
+
if (!grow) return /* @__PURE__ */ jsx(Fragment, { children });
|
|
71
|
+
return /* @__PURE__ */ jsx(Box, { sx: { flex: "1 1 0", minWidth: 0 }, children });
|
|
72
|
+
}
|
|
73
|
+
function RangeNote({
|
|
74
|
+
day,
|
|
75
|
+
inverted,
|
|
76
|
+
testId
|
|
77
|
+
}) {
|
|
78
|
+
const copy = useDataViewsCopy();
|
|
79
|
+
if (inverted) {
|
|
80
|
+
return /* @__PURE__ */ jsx(
|
|
81
|
+
Typography,
|
|
82
|
+
{
|
|
83
|
+
component: "p",
|
|
84
|
+
"data-testid": `${testId}-inverted`,
|
|
85
|
+
sx: { mt: 0.75, fontSize: sxRem(12), color: "error.main" },
|
|
86
|
+
children: copy.filters.rangeInvalid
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
if (!day) return null;
|
|
91
|
+
return /* @__PURE__ */ jsx(
|
|
92
|
+
Typography,
|
|
93
|
+
{
|
|
94
|
+
component: "p",
|
|
95
|
+
"data-testid": `${testId}-inclusive`,
|
|
96
|
+
sx: { mt: { xs: 0.25, sm: 0.75 }, fontSize: sxRem(12), color: "text.secondary" },
|
|
97
|
+
children: copy.filters.rangeInclusiveNote
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
function RangeBounds({
|
|
102
|
+
field,
|
|
103
|
+
value,
|
|
104
|
+
onChange,
|
|
105
|
+
testId,
|
|
106
|
+
calendarMonths = 1,
|
|
107
|
+
showCalendar = true,
|
|
108
|
+
fillRow = false
|
|
109
|
+
}) {
|
|
110
|
+
const copy = useDataViewsCopy();
|
|
111
|
+
const { key, emitted } = useOutsideResetKey(value);
|
|
112
|
+
const [typed, setTyped] = useState(0);
|
|
113
|
+
const typedChange = (range) => {
|
|
114
|
+
setTyped((n) => n + 1);
|
|
115
|
+
onChange(emitted(range));
|
|
116
|
+
};
|
|
117
|
+
const day = field.kind === "day";
|
|
118
|
+
return /* @__PURE__ */ jsxs(Box, { "data-testid": `${testId}-panel`, children: [
|
|
119
|
+
/* @__PURE__ */ jsx(Box, { sx: { "&:not(:empty)": { mb: { xs: 1, sm: 1.5 } } }, children: /* @__PURE__ */ jsx(RangePresets, { presets: presetsFor(field, copy), value, onChange, testId }) }),
|
|
120
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "flex-start", gap: 1.5 }, children: [
|
|
121
|
+
/* @__PURE__ */ jsx(BoundCell, { grow: day || fillRow, children: /* @__PURE__ */ jsx(
|
|
122
|
+
BoundField,
|
|
123
|
+
{
|
|
124
|
+
field,
|
|
125
|
+
label: copy.filters.rangeStart,
|
|
126
|
+
value: value.min,
|
|
127
|
+
onChange: (min) => typedChange({ ...value, min }),
|
|
128
|
+
testId: `${testId}-min`,
|
|
129
|
+
fill: fillRow
|
|
130
|
+
},
|
|
131
|
+
`min-${key}`
|
|
132
|
+
) }),
|
|
133
|
+
/* @__PURE__ */ jsx(BoundCell, { grow: day || fillRow, children: /* @__PURE__ */ jsx(
|
|
134
|
+
BoundField,
|
|
135
|
+
{
|
|
136
|
+
field,
|
|
137
|
+
label: copy.filters.rangeEnd,
|
|
138
|
+
value: value.max,
|
|
139
|
+
onChange: (max) => typedChange({ ...value, max }),
|
|
140
|
+
testId: `${testId}-max`,
|
|
141
|
+
fill: fillRow
|
|
142
|
+
},
|
|
143
|
+
`max-${key}`
|
|
144
|
+
) })
|
|
145
|
+
] }),
|
|
146
|
+
/* @__PURE__ */ jsx(RangeNote, { day, inverted: isRangeInverted(value), testId }),
|
|
147
|
+
day && showCalendar && /* @__PURE__ */ jsx(
|
|
148
|
+
DayRangeCalendar,
|
|
149
|
+
{
|
|
150
|
+
fieldLabel: field.label,
|
|
151
|
+
value,
|
|
152
|
+
onChange: (range) => onChange(emitted(range)),
|
|
153
|
+
months: calendarMonths,
|
|
154
|
+
viewKey: `${key}-${typed}`,
|
|
155
|
+
testId
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
] });
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export {
|
|
162
|
+
RangeBounds
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=chunk-FORAVDJF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-range-bounds.tsx"],"sourcesContent":["'use client';\n\n/**\n * The `De`/`Até` pair of a range filter, its preset chips, the line under it\n * and — for a day range — the calendar under that (FUT-4144). Shared by the\n * pill's popover, the slide-in panel and the \"Mais\" sheet, so the three cannot\n * drift on what a bound accepts or how it clears.\n */\nimport Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useState } from 'react';\n\nimport { useDataViewsCopy } from './data-views-copy-context';\nimport { DayBoundInput } from './data-views-day-input';\nimport { NumberBoundInput } from './data-views-number-input';\nimport { RangePresets } from './data-views-preset-chips';\nimport { DayRangeCalendar } from './data-views-range-calendar';\nimport { presetsFor } from './data-views-range-presets';\nimport { useOutsideResetKey } from './data-views-range-reset';\nimport { isRangeInverted } from './data-views-range-values';\nimport type { RangeFieldConfig, RangeValue } from './data-views-types';\nimport { sxRem } from '../../../tokens/relative';\n\n/**\n * One end of the range. A day keeps its `AAAA-MM-DD` string verbatim (the form\n * both the field and the backend speak) and is typed through the masked\n * `dd/mm/aaaa` field rather than a native date input — see\n * {@link DayBoundInput} for why. A number parses, and an unparseable/blank\n * entry CLEARS the bound rather than writing `NaN`.\n */\nfunction BoundField<T extends Record<string, unknown>>({\n field,\n label,\n value,\n onChange,\n testId,\n fill,\n}: {\n field: RangeFieldConfig<T>;\n label: string;\n value: number | string | undefined;\n onChange: (bound: number | string | undefined) => void;\n testId: string;\n /** A number box takes its cell's width; a day box always does. */\n fill: boolean;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n if (field.kind === 'day') {\n return (\n <DayBoundInput\n fill\n mask={copy.filters.dayMask}\n invalidMessage={copy.filters.dayInvalid}\n label={label}\n value={value == null ? undefined : String(value)}\n onChange={onChange}\n testId={testId}\n />\n );\n }\n return (\n <NumberBoundInput\n fill={fill}\n label={label}\n value={value}\n unit={field.unit}\n onChange={onChange}\n testId={testId}\n />\n );\n}\n\n\n/** One box of the pair: an equal share of the row for a day, as it was for a number. */\nfunction BoundCell({ grow, children }: { grow: boolean; children: React.ReactNode }): React.JSX.Element {\n if (!grow) return <>{children}</>;\n return <Box sx={{ flex: '1 1 0', minWidth: 0 }}>{children}</Box>;\n}\n\n/**\n * The line under the pair: why an inverted window matches nothing, or — for a\n * day range — that BOTH days are in the result. Saying so is FUT-668's other\n * half: the bounds compare as ISO strings precisely so `até` keeps its whole\n * day, and nothing on screen would otherwise tell the merchant that.\n */\nfunction RangeNote({\n day,\n inverted,\n testId,\n}: {\n day: boolean;\n inverted: boolean;\n testId: string;\n}): React.JSX.Element | null {\n const copy = useDataViewsCopy();\n if (inverted) {\n return (\n <Typography\n component=\"p\"\n data-testid={`${testId}-inverted`}\n sx={{ mt: 0.75, fontSize: sxRem(12), color: 'error.main' }}\n >\n {copy.filters.rangeInvalid}\n </Typography>\n );\n }\n if (!day) return null;\n return (\n <Typography\n component=\"p\"\n data-testid={`${testId}-inclusive`}\n // `text.secondary`, not `disabled`: the note is read, and disabled grey\n // at 12px is 2.68:1 (FUT-4144 UI review).\n sx={{ mt: { xs: 0.25, sm: 0.75 }, fontSize: sxRem(12), color: 'text.secondary' }}\n >\n {copy.filters.rangeInclusiveNote}\n </Typography>\n );\n}\n\n/** Props of {@link RangeBounds}. */\ninterface RangeBoundsProps<T extends Record<string, unknown>> {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testId: string;\n /**\n * Months the day calendar shows side by side (FUT-4144). Two where the\n * popover has the room; one, with the month/year selectors, on a phone and\n * in the panels.\n */\n calendarMonths?: 1 | 2;\n /**\n * Whether the day calendar is mounted. A host that keeps the pair mounted\n * while hidden (the slide-in panel) passes its open state, so a closed panel\n * holds no calendar of its own.\n */\n showCalendar?: boolean;\n /**\n * A NUMBER pair splits the row equally too, as a day pair always does. Set\n * by the panels, whose width is the row's; the pill's popover sizes itself to\n * its content and keeps the boxes' own width.\n */\n fillRow?: boolean;\n}\n\n/**\n * The `De`/`Até` pair for a range — shared by the pill's popover and the\n * slide-in panel's day fields, so the two surfaces cannot drift on what a bound\n * accepts or how it clears.\n */\nexport function RangeBounds<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testId,\n calendarMonths = 1,\n showCalendar = true,\n fillRow = false,\n}: RangeBoundsProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { key, emitted } = useOutsideResetKey(value);\n // Moves the calendar to a TYPED day. A typed write is the fields' own, so\n // the outside key above does not see it; a tap on the calendar moves\n // neither, which is what keeps it still under the finger.\n const [typed, setTyped] = useState(0);\n const typedChange = (range: RangeValue) => {\n setTyped((n) => n + 1);\n onChange(emitted(range));\n };\n const day = field.kind === 'day';\n return (\n <Box data-testid={`${testId}-panel`}>\n {/* Above the inputs, not below: the presets are the answer for most\n merchants, and the two date pickers are the escape hatch. */}\n <Box sx={{ '&:not(:empty)': { mb: { xs: 1, sm: 1.5 } } }}>\n <RangePresets presets={presetsFor(field, copy)} value={value} onChange={onChange} testId={testId} />\n </Box>\n {/* Top-aligned: a day that does not exist grows ITS field by a message\n line, and centring would push the other box half a line down. The two\n boxes are one height, so with no message this is the same row. */}\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5 }}>\n {/* A day pair shares the row equally, so it spans the calendar under\n it; a number pair keeps its own widths. */}\n <BoundCell grow={day || fillRow}>\n <BoundField\n key={`min-${key}`}\n field={field}\n label={copy.filters.rangeStart}\n value={value.min}\n onChange={(min) => typedChange({ ...value, min })}\n testId={`${testId}-min`}\n fill={fillRow}\n />\n </BoundCell>\n <BoundCell grow={day || fillRow}>\n <BoundField\n key={`max-${key}`}\n field={field}\n label={copy.filters.rangeEnd}\n value={value.max}\n onChange={(max) => typedChange({ ...value, max })}\n testId={`${testId}-max`}\n fill={fillRow}\n />\n </BoundCell>\n </Box>\n <RangeNote day={day} inverted={isRangeInverted(value)} testId={testId} />\n {/* Under the boxes and the note, with no button to reach it: the typed\n path stays as short as it was, and a period is two taps (FUT-4144). */}\n {day && showCalendar && (\n <DayRangeCalendar\n fieldLabel={field.label}\n value={value}\n onChange={(range) => onChange(emitted(range))}\n months={calendarMonths}\n viewKey={`${key}-${typed}`}\n testId={testId}\n />\n )}\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extent,
|
|
3
|
+
planeBounds,
|
|
4
|
+
projectRings,
|
|
5
|
+
projectionAt,
|
|
6
|
+
viewBoxFor
|
|
7
|
+
} from "./chunk-COOSJKZL.js";
|
|
8
|
+
|
|
9
|
+
// src/components/data-display/RegionMap/RegionMap.view.ts
|
|
10
|
+
function unionBox(boxes) {
|
|
11
|
+
const real = boxes.filter((box) => box !== null);
|
|
12
|
+
const xs = extent(real.flatMap((b) => [b.minX, b.minX + b.spanX]));
|
|
13
|
+
const ys = extent(real.flatMap((b) => [b.minY, b.minY + b.spanY]));
|
|
14
|
+
if (xs === null || ys === null) return null;
|
|
15
|
+
return { minX: xs.min, minY: ys.min, spanX: xs.max - xs.min, spanY: ys.max - ys.min };
|
|
16
|
+
}
|
|
17
|
+
function boundsOfRings(rings) {
|
|
18
|
+
const points = rings.flat();
|
|
19
|
+
const lats = extent(points.map(([latitude]) => latitude));
|
|
20
|
+
const lngs = extent(points.map(([, longitude]) => longitude));
|
|
21
|
+
if (lats === null || lngs === null) return null;
|
|
22
|
+
return { south: lats.min, west: lngs.min, north: lats.max, east: lngs.max };
|
|
23
|
+
}
|
|
24
|
+
function reachBox(reach, projection) {
|
|
25
|
+
if ("radiusMetres" in reach) {
|
|
26
|
+
const r = reach.radiusMetres;
|
|
27
|
+
return Number.isFinite(r) && r > 0 ? { minX: -r, minY: -r, spanX: r * 2, spanY: r * 2 } : null;
|
|
28
|
+
}
|
|
29
|
+
const { south, west, north, east } = reach.bounds;
|
|
30
|
+
const a = projection.project([north, west]);
|
|
31
|
+
const b = projection.project([south, east]);
|
|
32
|
+
return unionBox([{ minX: a.x, minY: a.y, spanX: 0, spanY: 0 }, { minX: b.x, minY: b.y, spanX: 0, spanY: 0 }]);
|
|
33
|
+
}
|
|
34
|
+
function farthestEdge(box) {
|
|
35
|
+
return Math.max(Math.abs(box.minX), Math.abs(box.minX + box.spanX), Math.abs(box.minY), Math.abs(box.minY + box.spanY));
|
|
36
|
+
}
|
|
37
|
+
function viewWithin(outermostMetres, reach, areaBoxes) {
|
|
38
|
+
if (outermostMetres !== null) {
|
|
39
|
+
return viewBoxFor(Math.max(outermostMetres, reach === null ? 0 : farthestEdge(reach)), null);
|
|
40
|
+
}
|
|
41
|
+
return viewBoxFor(null, unionBox([...areaBoxes(), reach]));
|
|
42
|
+
}
|
|
43
|
+
function centreOf(regions) {
|
|
44
|
+
const bounds = boundsOfRings(regions.flatMap((r) => r.rings));
|
|
45
|
+
if (bounds === null) return null;
|
|
46
|
+
return { latitude: (bounds.south + bounds.north) / 2, longitude: (bounds.west + bounds.east) / 2 };
|
|
47
|
+
}
|
|
48
|
+
function regionMapView({
|
|
49
|
+
regions,
|
|
50
|
+
center,
|
|
51
|
+
circles = [],
|
|
52
|
+
reach
|
|
53
|
+
}) {
|
|
54
|
+
const origin = center ?? centreOf(regions);
|
|
55
|
+
if (origin === null) return null;
|
|
56
|
+
const projection = projectionAt(origin);
|
|
57
|
+
return viewWithin(
|
|
58
|
+
extent(circles.map((c) => c.radiusMetres))?.max ?? null,
|
|
59
|
+
reach === void 0 ? null : reachBox(reach, projection),
|
|
60
|
+
() => regions.map((r) => planeBounds(projectRings(r.rings, projection)))
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export {
|
|
65
|
+
unionBox,
|
|
66
|
+
boundsOfRings,
|
|
67
|
+
reachBox,
|
|
68
|
+
viewWithin,
|
|
69
|
+
centreOf,
|
|
70
|
+
regionMapView
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=chunk-FWAY2SAI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/RegionMap/RegionMap.view.ts"],"sourcesContent":["import {\n extent,\n planeBounds,\n projectionAt,\n projectRings,\n viewBoxFor,\n type PlaneBox,\n type Projection,\n} from './RegionMap.helpers';\nimport type {\n RegionMapBounds,\n RegionMapCircle,\n RegionMapReach,\n RegionMapRegion,\n RegionMapRing,\n} from './RegionMap.types';\n\n// What `RegionMap` shows: its view, given the circles, the areas and a host's\n// `reach` — pure, so a host laying HTML over the drawing computes the same one.\n\n/** The smallest box holding every given box, or null with none. */\nexport function unionBox(boxes: readonly (PlaneBox | null)[]): PlaneBox | null {\n const real = boxes.filter((box): box is PlaneBox => box !== null);\n const xs = extent(real.flatMap((b) => [b.minX, b.minX + b.spanX]));\n const ys = extent(real.flatMap((b) => [b.minY, b.minY + b.spanY]));\n if (xs === null || ys === null) return null;\n return { minX: xs.min, minY: ys.min, spanX: xs.max - xs.min, spanY: ys.max - ys.min };\n}\n\n/** The latitude/longitude box around some outlines — a `reach` no radius describes. */\nexport function boundsOfRings(rings: readonly RegionMapRing[]): RegionMapBounds | null {\n const points = rings.flat();\n const lats = extent(points.map(([latitude]) => latitude));\n const lngs = extent(points.map(([, longitude]) => longitude));\n if (lats === null || lngs === null) return null;\n return { south: lats.min, west: lngs.min, north: lats.max, east: lngs.max };\n}\n\n/** A `reach` as a box in projected metres (a radius is a square around the centre). */\nexport function reachBox(reach: RegionMapReach, projection: Projection): PlaneBox | null {\n if ('radiusMetres' in reach) {\n const r = reach.radiusMetres;\n return Number.isFinite(r) && r > 0 ? { minX: -r, minY: -r, spanX: r * 2, spanY: r * 2 } : null;\n }\n const { south, west, north, east } = reach.bounds;\n const a = projection.project([north, west]);\n const b = projection.project([south, east]);\n return unionBox([{ minX: a.x, minY: a.y, spanX: 0, spanY: 0 }, { minX: b.x, minY: b.y, spanX: 0, spanY: 0 }]);\n}\n\n/** How far the box reaches from the centre along either axis — the half-side of a centred square holding it. */\nfunction farthestEdge(box: PlaneBox): number {\n return Math.max(Math.abs(box.minX), Math.abs(box.minX + box.spanX), Math.abs(box.minY), Math.abs(box.minY + box.spanY));\n}\n\n/**\n * The view, given what it must fit: the outermost circle and the `reach` with\n * the margin on top, still centred on the centre; else every area and the\n * reach together. Without a reach it is exactly `viewBoxFor`'s.\n */\nexport function viewWithin(\n outermostMetres: number | null,\n reach: PlaneBox | null,\n areaBoxes: () => readonly (PlaneBox | null)[],\n): PlaneBox | null {\n if (outermostMetres !== null) {\n return viewBoxFor(Math.max(outermostMetres, reach === null ? 0 : farthestEdge(reach)), null);\n }\n return viewBoxFor(null, unionBox([...areaBoxes(), reach]));\n}\n\n/** The middle of every area, for a map with no centre of its own. */\nexport function centreOf(regions: readonly RegionMapRegion[]): { latitude: number; longitude: number } | null {\n const bounds = boundsOfRings(regions.flatMap((r) => r.rings));\n if (bounds === null) return null;\n return { latitude: (bounds.south + bounds.north) / 2, longitude: (bounds.west + bounds.east) / 2 };\n}\n\n/**\n * The square `RegionMap` shows for these props, in projected metres around\n * `center` (or the areas' middle) — for a host that lays its own HTML over the\n * drawing at the same scale: a point `p` sits at\n * `(p.x - view.minX) / view.spanX` across. With circles the view is centred,\n * so its half-side is `view.spanX / 2`.\n */\nexport function regionMapView({\n regions,\n center,\n circles = [],\n reach,\n}: {\n regions: readonly RegionMapRegion[];\n center: { latitude: number; longitude: number } | null;\n circles?: readonly RegionMapCircle[];\n reach?: RegionMapReach;\n}): PlaneBox | null {\n const origin = center ?? centreOf(regions);\n if (origin === null) return null;\n const projection = projectionAt(origin);\n return viewWithin(\n extent(circles.map((c) => c.radiusMetres))?.max ?? null,\n reach === undefined ? null : reachBox(reach, projection),\n () => regions.map((r) => planeBounds(projectRings(r.rings, projection))),\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -4,15 +4,18 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
useCalendar
|
|
6
6
|
} from "./chunk-TPMT3J32.js";
|
|
7
|
+
import {
|
|
8
|
+
navigateFocus
|
|
9
|
+
} from "./chunk-LZOCNAUA.js";
|
|
7
10
|
import {
|
|
8
11
|
resolveCalendarProps
|
|
9
12
|
} from "./chunk-I4K5JMS4.js";
|
|
10
13
|
import {
|
|
11
14
|
CalendarSelectorsMonth
|
|
12
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-X37NTEVS.js";
|
|
13
16
|
import {
|
|
14
17
|
CalendarMonth
|
|
15
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-VCQFDQM3.js";
|
|
16
19
|
import {
|
|
17
20
|
resolveLabels
|
|
18
21
|
} from "./chunk-LL2BWQPM.js";
|
|
@@ -27,7 +30,7 @@ import {
|
|
|
27
30
|
// src/components/form/Calendar/Calendar.tsx
|
|
28
31
|
import Box from "@mui/material/Box/index.js";
|
|
29
32
|
import Paper from "@mui/material/Paper/index.js";
|
|
30
|
-
import React, { useCallback, useRef } from "react";
|
|
33
|
+
import React, { useCallback, useEffect, useRef } from "react";
|
|
31
34
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
32
35
|
var containerSx = (monthsToShow) => ({
|
|
33
36
|
p: 3,
|
|
@@ -43,6 +46,7 @@ var containerSx = (monthsToShow) => ({
|
|
|
43
46
|
});
|
|
44
47
|
var buildDayContext = (props, calendar) => ({
|
|
45
48
|
selectionMode: props.selectionMode,
|
|
49
|
+
locale: props.locale,
|
|
46
50
|
value: props.value,
|
|
47
51
|
range: props.range,
|
|
48
52
|
showOutsideDays: props.showOutsideDays,
|
|
@@ -68,6 +72,23 @@ var useRootRef = (forwarded) => {
|
|
|
68
72
|
);
|
|
69
73
|
return { rootRef, setRoot };
|
|
70
74
|
};
|
|
75
|
+
var OWN_MONTH_STOP = '[role="gridcell"][tabindex="0"][data-in-month="true"]';
|
|
76
|
+
var ANY_STOP = '[role="gridcell"][tabindex="0"]';
|
|
77
|
+
var useFollowDayFocus = (rootRef, focusedDate, firstDayOfWeek) => {
|
|
78
|
+
const movedFrom = useRef(null);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
const from = movedFrom.current;
|
|
81
|
+
movedFrom.current = null;
|
|
82
|
+
if (from === null || from === focusedDate.getTime()) return;
|
|
83
|
+
const root = rootRef.current;
|
|
84
|
+
(root?.querySelector(OWN_MONTH_STOP) ?? root?.querySelector(ANY_STOP))?.focus();
|
|
85
|
+
}, [rootRef, focusedDate]);
|
|
86
|
+
return (event) => {
|
|
87
|
+
const onDay = event.target.getAttribute("role") === "gridcell";
|
|
88
|
+
const moves = navigateFocus(event.key, focusedDate, { firstDayOfWeek, shiftKey: event.shiftKey }) !== null;
|
|
89
|
+
movedFrom.current = onDay && moves ? focusedDate.getTime() : null;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
71
92
|
var Calendar = React.forwardRef((componentProps, ref) => {
|
|
72
93
|
const props = resolveCalendarProps(componentProps);
|
|
73
94
|
const { monthsToShow, locale, renderHeader, renderFooter, className, ariaLabel } = props;
|
|
@@ -76,6 +97,8 @@ var Calendar = React.forwardRef((componentProps, ref) => {
|
|
|
76
97
|
const bounds = { minDate: props.minDate, maxDate: props.maxDate };
|
|
77
98
|
const picker = useCalendarPicker({ rootRef, bounds, ...calendar });
|
|
78
99
|
const dayContext = buildDayContext(props, calendar);
|
|
100
|
+
const noteKeyTarget = useFollowDayFocus(rootRef, calendar.focusedDate, props.firstDayOfWeek);
|
|
101
|
+
const labels = resolveLabels(EN_US_UI_LABELS.calendar, props.labels);
|
|
79
102
|
const firstMonth = calendar.monthMatrices[0];
|
|
80
103
|
return /* @__PURE__ */ jsxs(
|
|
81
104
|
Paper,
|
|
@@ -85,7 +108,10 @@ var Calendar = React.forwardRef((componentProps, ref) => {
|
|
|
85
108
|
role: "application",
|
|
86
109
|
"aria-label": ariaLabel,
|
|
87
110
|
tabIndex: 0,
|
|
88
|
-
onKeyDown: picker.view === "days" ?
|
|
111
|
+
onKeyDown: picker.view === "days" ? (event) => {
|
|
112
|
+
noteKeyTarget(event);
|
|
113
|
+
calendar.handleKeyDown(event);
|
|
114
|
+
} : void 0,
|
|
89
115
|
"data-testid": "calendar-container",
|
|
90
116
|
sx: containerSx(monthsToShow),
|
|
91
117
|
children: [
|
|
@@ -97,7 +123,7 @@ var Calendar = React.forwardRef((componentProps, ref) => {
|
|
|
97
123
|
weekdayNames: calendar.weekdayNames,
|
|
98
124
|
dayContext,
|
|
99
125
|
bounds,
|
|
100
|
-
labels
|
|
126
|
+
labels,
|
|
101
127
|
picker,
|
|
102
128
|
onPreviousMonth: () => {
|
|
103
129
|
picker.showDays();
|
|
@@ -117,6 +143,7 @@ var Calendar = React.forwardRef((componentProps, ref) => {
|
|
|
117
143
|
locale,
|
|
118
144
|
weekdayNames: calendar.weekdayNames,
|
|
119
145
|
renderHeader,
|
|
146
|
+
labels: props.labels ? labels : void 0,
|
|
120
147
|
onPreviousMonth: calendar.goToPreviousMonth,
|
|
121
148
|
onNextMonth: calendar.goToNextMonth,
|
|
122
149
|
dayContext
|
|
@@ -135,4 +162,4 @@ export {
|
|
|
135
162
|
Calendar,
|
|
136
163
|
Calendar_default
|
|
137
164
|
};
|
|
138
|
-
//# sourceMappingURL=chunk-
|
|
165
|
+
//# sourceMappingURL=chunk-FYAW5GBF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/form/Calendar/Calendar.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport Paper from '@mui/material/Paper/index.js';\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { EN_US_UI_LABELS } from '../../../en-US.labels';\nimport { rem, sxRem } from '../../../tokens/relative';\nimport { resolveLabels } from '../../../utils/resolve-labels';\n\nimport { resolveCalendarProps } from './Calendar.helpers';\nimport { useCalendar } from './Calendar.hooks';\nimport { navigateFocus } from './Calendar.keyboard';\nimport { useCalendarPicker } from './Calendar.picker';\nimport type { CalendarProps, ResolvedCalendarProps } from './Calendar.types';\nimport type { DayCellContext } from './CalendarDayCell';\nimport { CalendarMonth } from './CalendarMonth';\nimport { CalendarSelectorsMonth } from './CalendarSelectorsMonth';\n\nconst containerSx = (monthsToShow: number): SxProps<Theme> => ({\n p: 3,\n display: 'flex',\n flexDirection: monthsToShow > 1 ? 'row' : 'column',\n gap: 3,\n outline: 'none',\n '&:focus-within': {\n outline: (theme: Theme) => `${rem(theme, 2)} solid`,\n outlineColor: 'primary.main',\n outlineOffset: sxRem(2),\n },\n});\n\ntype CalendarState = ReturnType<typeof useCalendar>;\n\nconst buildDayContext = (props: ResolvedCalendarProps, calendar: CalendarState): DayCellContext => ({\n selectionMode: props.selectionMode,\n locale: props.locale,\n value: props.value,\n range: props.range,\n showOutsideDays: props.showOutsideDays,\n renderDay: props.renderDay,\n dayClassName: props.dayClassName,\n hoveredDate: calendar.hoveredDate,\n focusedDate: calendar.focusedDate,\n today: calendar.today,\n isDisabled: calendar.isDisabled,\n onSelect: calendar.handleDateClick,\n onHover: calendar.handleDateMouseEnter,\n onHoverEnd: calendar.handleDateMouseLeave,\n});\n\n// The container is the forwarded ref's AND the picker's: focus falls back to it.\nconst useRootRef = (forwarded: React.ForwardedRef<HTMLDivElement>) => {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const setRoot = useCallback(\n (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof forwarded === 'function') forwarded(node);\n else if (forwarded) forwarded.current = node;\n },\n [forwarded],\n );\n return { rootRef, setRoot };\n};\n\n/** The tab stop as a day of its OWN month — side by side, an outside copy of it comes first in the DOM. */\nconst OWN_MONTH_STOP = '[role=\"gridcell\"][tabindex=\"0\"][data-in-month=\"true\"]';\nconst ANY_STOP = '[role=\"gridcell\"][tabindex=\"0\"]';\n\n/**\n * Keeps the keyboard's place visible when it is on a DAY.\n *\n * The arrows move the grid's one tab stop (`focusedDate`), and that is enough\n * while the container holds focus. But a reader who tabbed onto a day, or\n * clicked one, has focus on that day's button: the tab stop moved and focus\n * stayed behind on a cell that is no longer it, so the ring sat on the old day\n * and a month change unmounted it under the reader.\n *\n * So a NAVIGATION key pressed on a day notes where the tab stop was, and once\n * it has moved, focus follows it to the day in its own month. Any other key —\n * Enter, Tab, Escape — clears the note: Enter re-sets the same day and must\n * leave focus alone, and a stale note would pull focus into the grid on the\n * next mouse pick.\n */\nconst useFollowDayFocus = (\n rootRef: React.RefObject<HTMLDivElement | null>,\n focusedDate: Date,\n firstDayOfWeek: number,\n) => {\n const movedFrom = useRef<number | null>(null);\n useEffect(() => {\n const from = movedFrom.current;\n movedFrom.current = null;\n if (from === null || from === focusedDate.getTime()) return;\n const root = rootRef.current;\n (root?.querySelector<HTMLElement>(OWN_MONTH_STOP) ?? root?.querySelector<HTMLElement>(ANY_STOP))?.focus();\n }, [rootRef, focusedDate]);\n return (event: React.KeyboardEvent) => {\n const onDay = (event.target as HTMLElement).getAttribute('role') === 'gridcell';\n const moves = navigateFocus(event.key, focusedDate, { firstDayOfWeek, shiftKey: event.shiftKey }) !== null;\n movedFrom.current = onDay && moves ? focusedDate.getTime() : null;\n };\n};\n\nexport const Calendar = React.forwardRef<HTMLDivElement, CalendarProps>((componentProps, ref) => {\n const props = resolveCalendarProps(componentProps);\n const { monthsToShow, locale, renderHeader, renderFooter, className, ariaLabel } = props;\n\n const calendar = useCalendar(props);\n const { rootRef, setRoot } = useRootRef(ref);\n const bounds = { minDate: props.minDate, maxDate: props.maxDate };\n const picker = useCalendarPicker({ rootRef, bounds, ...calendar });\n const dayContext = buildDayContext(props, calendar);\n const noteKeyTarget = useFollowDayFocus(rootRef, calendar.focusedDate, props.firstDayOfWeek);\n const labels = resolveLabels(EN_US_UI_LABELS.calendar, props.labels);\n // The selectors caption always resolves to one month (see the helpers).\n const firstMonth = calendar.monthMatrices[0];\n\n return (\n <Paper\n ref={setRoot}\n className={className}\n role=\"application\"\n aria-label={ariaLabel}\n tabIndex={0}\n // The day keys belong to the days: with a month or year grid open there\n // is no focused day on screen to move.\n onKeyDown={\n picker.view === 'days'\n ? (event) => {\n noteKeyTarget(event);\n calendar.handleKeyDown(event);\n }\n : undefined\n }\n data-testid=\"calendar-container\"\n sx={containerSx(monthsToShow)}\n >\n <Box ref={calendar.gridRef} sx={{ display: 'flex', gap: 3, flexWrap: 'wrap' }}>\n {props.captionLayout === 'selectors' && firstMonth ? (\n <CalendarSelectorsMonth\n matrix={firstMonth}\n locale={locale}\n weekdayNames={calendar.weekdayNames}\n dayContext={dayContext}\n bounds={bounds}\n labels={labels}\n picker={picker}\n onPreviousMonth={() => {\n picker.showDays();\n calendar.goToPreviousMonth();\n }}\n onNextMonth={() => {\n picker.showDays();\n calendar.goToNextMonth();\n }}\n />\n ) : (\n calendar.monthMatrices.map((matrix, index) => (\n <CalendarMonth\n key={`month-${matrix.year}-${matrix.month}`}\n matrix={matrix}\n monthIndex={index}\n monthsToShow={monthsToShow}\n locale={locale}\n weekdayNames={calendar.weekdayNames}\n renderHeader={renderHeader}\n // Only a host that passed `labels` gets named arrows: without\n // them the arrows caption stays exactly as it always was.\n labels={props.labels ? labels : undefined}\n onPreviousMonth={calendar.goToPreviousMonth}\n onNextMonth={calendar.goToNextMonth}\n dayContext={dayContext}\n />\n ))\n )}\n </Box>\n\n {renderFooter && (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>{renderFooter}</Box>\n )}\n </Paper>\n );\n});\n\nCalendar.displayName = 'Calendar';\n\nexport default Calendar;\n"],"mappings":"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","names":[]}
|
|
@@ -1,22 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
centreOf,
|
|
3
|
+
reachBox,
|
|
4
|
+
viewWithin
|
|
5
|
+
} from "./chunk-FWAY2SAI.js";
|
|
1
6
|
import {
|
|
2
7
|
drawOrder,
|
|
3
8
|
extent,
|
|
4
9
|
geometryCache,
|
|
5
10
|
hitRegion,
|
|
6
|
-
projectionAt
|
|
7
|
-
viewBoxFor
|
|
11
|
+
projectionAt
|
|
8
12
|
} from "./chunk-COOSJKZL.js";
|
|
9
13
|
|
|
10
14
|
// src/components/data-display/RegionMap/RegionMap.hooks.ts
|
|
11
15
|
import React from "react";
|
|
12
16
|
var TOLERANCE_SHARE = 1 / 45;
|
|
13
|
-
function centreOf(regions) {
|
|
14
|
-
const points = regions.flatMap((r) => r.rings.flat());
|
|
15
|
-
const lats = extent(points.map(([lat]) => lat));
|
|
16
|
-
const lngs = extent(points.map(([, lng]) => lng));
|
|
17
|
-
if (lats === null || lngs === null) return null;
|
|
18
|
-
return { latitude: (lats.min + lats.max) / 2, longitude: (lngs.min + lngs.max) / 2 };
|
|
19
|
-
}
|
|
20
17
|
function svgPoint(event) {
|
|
21
18
|
const svg = event.currentTarget;
|
|
22
19
|
const matrix = typeof svg.getScreenCTM === "function" ? svg.getScreenCTM() : null;
|
|
@@ -24,14 +21,6 @@ function svgPoint(event) {
|
|
|
24
21
|
const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());
|
|
25
22
|
return { x: point.x, y: point.y };
|
|
26
23
|
}
|
|
27
|
-
function viewOf(outermostMetres, drawable) {
|
|
28
|
-
if (outermostMetres !== null) return viewBoxFor(outermostMetres, null);
|
|
29
|
-
const boxes = drawable().filter((box) => box !== null);
|
|
30
|
-
const xs = extent(boxes.flatMap((b) => [b.minX, b.minX + b.spanX]));
|
|
31
|
-
const ys = extent(boxes.flatMap((b) => [b.minY, b.minY + b.spanY]));
|
|
32
|
-
if (xs === null || ys === null) return null;
|
|
33
|
-
return viewBoxFor(null, { minX: xs.min, minY: ys.min, spanX: xs.max - xs.min, spanY: ys.max - ys.min });
|
|
34
|
-
}
|
|
35
24
|
function tappedRegion(event, pointer, drawn, view) {
|
|
36
25
|
const targetId = event.target.getAttribute("data-region-id");
|
|
37
26
|
if (pointer === "mouse" && targetId) return targetId;
|
|
@@ -46,21 +35,27 @@ function tappedRegion(event, pointer, drawn, view) {
|
|
|
46
35
|
function useGeometry(origin) {
|
|
47
36
|
const lat = origin?.latitude ?? null;
|
|
48
37
|
const lng = origin?.longitude ?? null;
|
|
49
|
-
return React.useMemo(
|
|
50
|
-
(
|
|
51
|
-
|
|
52
|
-
|
|
38
|
+
return React.useMemo(() => {
|
|
39
|
+
if (lat === null || lng === null) return { projection: null, geometryOf: null };
|
|
40
|
+
const projection = projectionAt({ latitude: lat, longitude: lng });
|
|
41
|
+
return { projection, geometryOf: geometryCache(projection) };
|
|
42
|
+
}, [lat, lng]);
|
|
53
43
|
}
|
|
54
44
|
function useRegionMap({
|
|
55
45
|
regions,
|
|
56
46
|
center,
|
|
57
47
|
circles = [],
|
|
48
|
+
reach,
|
|
58
49
|
onToggle
|
|
59
50
|
}) {
|
|
60
|
-
const geometryOf = useGeometry(center ?? centreOf(regions));
|
|
51
|
+
const { projection, geometryOf } = useGeometry(center ?? centreOf(regions));
|
|
61
52
|
const radii = circles.map((c) => c.radiusMetres);
|
|
62
53
|
const outermostMetres = extent(radii)?.max ?? null;
|
|
63
|
-
const view = geometryOf === null ? null :
|
|
54
|
+
const view = projection === null || geometryOf === null ? null : viewWithin(
|
|
55
|
+
outermostMetres,
|
|
56
|
+
reach === void 0 ? null : reachBox(reach, projection),
|
|
57
|
+
() => regions.map((r) => geometryOf(r.rings).bounds)
|
|
58
|
+
);
|
|
64
59
|
const drawn = geometryOf && view ? drawOrder(regions, geometryOf, view) : [];
|
|
65
60
|
const pointerType = React.useRef("mouse");
|
|
66
61
|
const onPointerDown = (event) => {
|
|
@@ -71,10 +66,10 @@ function useRegionMap({
|
|
|
71
66
|
const hit = tappedRegion(event, pointerType.current, drawn, view);
|
|
72
67
|
if (hit) onToggle(hit);
|
|
73
68
|
};
|
|
74
|
-
return { view, drawn, radii, outermostMetres, onPointerDown, onClick };
|
|
69
|
+
return { view, projection, drawn, radii, outermostMetres, onPointerDown, onClick };
|
|
75
70
|
}
|
|
76
71
|
|
|
77
72
|
export {
|
|
78
73
|
useRegionMap
|
|
79
74
|
};
|
|
80
|
-
//# sourceMappingURL=chunk-
|
|
75
|
+
//# sourceMappingURL=chunk-G2NVBCF7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/data-display/RegionMap/RegionMap.hooks.ts"],"sourcesContent":["import React from 'react';\n\nimport {\n drawOrder,\n extent,\n geometryCache,\n hitRegion,\n projectionAt,\n type DrawnRegion,\n type PlaneBox,\n type Projection,\n} from './RegionMap.helpers';\nimport type { RegionMapProps } from './RegionMap.types';\nimport { centreOf, reachBox, viewWithin } from './RegionMap.view';\n\n/** What the drawing needs, derived from the props. */\nexport interface RegionMapModel {\n /** The square shown, or null when there is nothing to centre on. */\n view: PlaneBox | null;\n /** The projection drawn with, or null when there is nothing to centre on. */\n projection: Projection | null;\n drawn: DrawnRegion[];\n /** Radii drawn, in metres; empty without circles. */\n radii: number[];\n outermostMetres: number | null;\n /** The tap handlers for the drawing's `<svg>`. */\n onPointerDown: (event: React.PointerEvent<SVGSVGElement>) => void;\n onClick: (event: React.MouseEvent<SVGSVGElement>) => void;\n}\n\n/** A tap reaches an area this close: a share of the view (~8 px on a phone). */\nconst TOLERANCE_SHARE = 1 / 45;\n\n/** The click, in the drawing's own coordinates — or null where it cannot be read. */\nfunction svgPoint(event: React.MouseEvent<SVGSVGElement>): { x: number; y: number } | null {\n const svg = event.currentTarget;\n const matrix = typeof svg.getScreenCTM === 'function' ? svg.getScreenCTM() : null;\n if (!matrix || typeof DOMPoint === 'undefined') return null;\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\n}\n\n/** Which area a click or tap means — see `useRegionMap`. */\nfunction tappedRegion(\n event: React.MouseEvent<SVGSVGElement>,\n pointer: string,\n drawn: readonly DrawnRegion[],\n view: PlaneBox,\n): string | null {\n const targetId = (event.target as Element).getAttribute('data-region-id');\n if (pointer === 'mouse' && targetId) return targetId;\n const point = svgPoint(event);\n if (point === null) return targetId;\n return hitRegion(\n drawn.map((d) => ({ id: d.id, geometry: d.geometry })),\n point,\n view.spanX * TOLERANCE_SHARE,\n );\n}\n\n/** The projection and geometry cache for a centre, or nulls without one. */\nfunction useGeometry(origin: { latitude: number; longitude: number } | null): {\n projection: Projection | null;\n geometryOf: ReturnType<typeof geometryCache> | null;\n} {\n const lat = origin?.latitude ?? null;\n const lng = origin?.longitude ?? null;\n return React.useMemo(() => {\n if (lat === null || lng === null) return { projection: null, geometryOf: null };\n const projection = projectionAt({ latitude: lat, longitude: lng });\n return { projection, geometryOf: geometryCache(projection) };\n }, [lat, lng]);\n}\n\n/**\n * The projection, the view, the areas in draw order and the tap handlers.\n *\n * Geometry is projected once per `rings` identity and centre\n * (`geometryCache`), so a toggle — which changes `excluded`, not `rings` —\n * re-projects nothing.\n *\n * A MOUSE click on a path is that path's area: a pointer is precise. Any\n * other tap — a finger, a pen — goes to `hitRegion`: the smallest area within\n * a few pixels, so a sliver beside a big area is reachable from the map.\n */\nexport function useRegionMap({\n regions,\n center,\n circles = [],\n reach,\n onToggle,\n}: Pick<RegionMapProps, 'regions' | 'center' | 'circles' | 'reach' | 'onToggle'>): RegionMapModel {\n const { projection, geometryOf } = useGeometry(center ?? centreOf(regions));\n const radii = circles.map((c) => c.radiusMetres);\n const outermostMetres = extent(radii)?.max ?? null;\n const view =\n projection === null || geometryOf === null\n ? null\n : viewWithin(outermostMetres, reach === undefined ? null : reachBox(reach, projection), () =>\n regions.map((r) => geometryOf(r.rings).bounds),\n );\n const drawn = geometryOf && view ? drawOrder(regions, geometryOf, view) : [];\n const pointerType = React.useRef<string>('mouse');\n\n const onPointerDown = (event: React.PointerEvent<SVGSVGElement>): void => {\n pointerType.current = event.pointerType || 'mouse';\n };\n\n const onClick = (event: React.MouseEvent<SVGSVGElement>): void => {\n if (!onToggle || view === null) return;\n const hit = tappedRegion(event, pointerType.current, drawn, view);\n if (hit) onToggle(hit);\n };\n\n return { view, projection, drawn, radii, outermostMetres, onPointerDown, onClick };\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,WAAW;AA+BlB,IAAM,kBAAkB,IAAI;AAG5B,SAAS,SAAS,OAAyE;AACzF,QAAM,MAAM,MAAM;AAClB,QAAM,SAAS,OAAO,IAAI,iBAAiB,aAAa,IAAI,aAAa,IAAI;AAC7E,MAAI,CAAC,UAAU,OAAO,aAAa,YAAa,QAAO;AACvD,QAAM,QAAQ,IAAI,SAAS,MAAM,SAAS,MAAM,OAAO,EAAE,gBAAgB,OAAO,QAAQ,CAAC;AACzF,SAAO,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE;AAClC;AAGA,SAAS,aACP,OACA,SACA,OACA,MACe;AACf,QAAM,WAAY,MAAM,OAAmB,aAAa,gBAAgB;AACxE,MAAI,YAAY,WAAW,SAAU,QAAO;AAC5C,QAAM,QAAQ,SAAS,KAAK;AAC5B,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO;AAAA,IACL,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,SAAS,EAAE;AAAA,IACrD;AAAA,IACA,KAAK,QAAQ;AAAA,EACf;AACF;AAGA,SAAS,YAAY,QAGnB;AACA,QAAM,MAAM,QAAQ,YAAY;AAChC,QAAM,MAAM,QAAQ,aAAa;AACjC,SAAO,MAAM,QAAQ,MAAM;AACzB,QAAI,QAAQ,QAAQ,QAAQ,KAAM,QAAO,EAAE,YAAY,MAAM,YAAY,KAAK;AAC9E,UAAM,aAAa,aAAa,EAAE,UAAU,KAAK,WAAW,IAAI,CAAC;AACjE,WAAO,EAAE,YAAY,YAAY,cAAc,UAAU,EAAE;AAAA,EAC7D,GAAG,CAAC,KAAK,GAAG,CAAC;AACf;AAaO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AACF,GAAkG;AAChG,QAAM,EAAE,YAAY,WAAW,IAAI,YAAY,UAAU,SAAS,OAAO,CAAC;AAC1E,QAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,YAAY;AAC/C,QAAM,kBAAkB,OAAO,KAAK,GAAG,OAAO;AAC9C,QAAM,OACJ,eAAe,QAAQ,eAAe,OAClC,OACA;AAAA,IAAW;AAAA,IAAiB,UAAU,SAAY,OAAO,SAAS,OAAO,UAAU;AAAA,IAAG,MACpF,QAAQ,IAAI,CAAC,MAAM,WAAW,EAAE,KAAK,EAAE,MAAM;AAAA,EAC/C;AACN,QAAM,QAAQ,cAAc,OAAO,UAAU,SAAS,YAAY,IAAI,IAAI,CAAC;AAC3E,QAAM,cAAc,MAAM,OAAe,OAAO;AAEhD,QAAM,gBAAgB,CAAC,UAAmD;AACxE,gBAAY,UAAU,MAAM,eAAe;AAAA,EAC7C;AAEA,QAAM,UAAU,CAAC,UAAiD;AAChE,QAAI,CAAC,YAAY,SAAS,KAAM;AAChC,UAAM,MAAM,aAAa,OAAO,YAAY,SAAS,OAAO,IAAI;AAChE,QAAI,IAAK,UAAS,GAAG;AAAA,EACvB;AAEA,SAAO,EAAE,MAAM,YAAY,OAAO,OAAO,iBAAiB,eAAe,QAAQ;AACnF;","names":[]}
|