@12-apps/ui 6.73.0 → 6.74.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/NATIVE.md +1 -1
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +6 -6
- package/dist/_internal/components/data-display/Avatar/Avatar.js +4 -4
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +5 -5
- package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
- package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
- package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -2
- package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +38 -38
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +59 -57
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +3 -3
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +7 -7
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +7 -5
- package/dist/_internal/components/data-display/DataViews/base-card.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +2 -2
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +7 -7
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +9 -9
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +12 -12
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +33 -33
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +16 -16
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +13 -13
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +14 -14
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +14 -12
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +4 -4
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +4 -4
- package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +10 -10
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +6 -6
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +14 -14
- package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +3 -3
- package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
- package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +6 -6
- package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +5 -5
- package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
- package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.js +4 -4
- package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
- package/dist/_internal/components/data-display/Table/Table.js +2 -2
- package/dist/_internal/components/data-display/index.js +56 -56
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +2 -2
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +3 -3
- package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +2 -2
- package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
- package/dist/_internal/components/feedback/index.js +11 -11
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +4 -4
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +8 -8
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +2 -2
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +1 -1
- package/dist/_internal/components/form/Calendar/Calendar.hooks.js +2 -2
- package/dist/_internal/components/form/Calendar/Calendar.js +6 -6
- 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/CategorySelect/CategoryPanel.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +7 -7
- package/dist/_internal/components/form/CepField/CepField.js +5 -4
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -2
- package/dist/_internal/components/form/Command/Command.js +2 -2
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +9 -9
- package/dist/_internal/components/form/Input/Input.factory.js +23 -0
- package/dist/_internal/components/form/Input/Input.factory.js.map +1 -0
- package/dist/_internal/components/form/Input/Input.js +4 -2
- package/dist/_internal/components/form/Input/outlined/text-field-slim-outlined.js +10 -0
- package/dist/_internal/components/form/Input/outlined/text-field-slim-outlined.js.map +1 -0
- package/dist/_internal/components/form/Input/text-field-slim.factory.js +10 -0
- package/dist/_internal/components/form/Input/text-field-slim.factory.js.map +1 -0
- package/dist/_internal/components/form/Input/text-field-slim.js +2 -1
- package/dist/_internal/components/form/NumberField/NumberField.js +5 -3
- package/dist/_internal/components/form/PickerSheet/PickerSheet.js +2 -2
- package/dist/_internal/components/form/index.js +44 -40
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +8 -8
- package/dist/_internal/components/form/total-form/Fields/CepField.js +6 -5
- package/dist/_internal/components/form/total-form/Fields/TextField.js +5 -3
- package/dist/_internal/components/form/total-form/Fields/index.js +21 -17
- package/dist/_internal/components/index.js +164 -160
- package/dist/_internal/components/layout/Card/Card.js +2 -2
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +3 -3
- package/dist/_internal/components/layout/SettingCard/SettingCard.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingCard.summary.js +3 -3
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js +5 -5
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +4 -4
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js +5 -5
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +5 -5
- package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +2 -2
- package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
- package/dist/_internal/components/layout/index.js +17 -17
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +7 -7
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +3 -3
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +5 -5
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +3 -3
- package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +6 -4
- package/dist/_internal/components/navigation/SectionNav/SectionNav.js +3 -3
- package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +9 -3
- package/dist/_internal/components/navigation/index.js +39 -39
- package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
- package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
- package/dist/_internal/components/utility/index.js +8 -8
- package/dist/_internal/pt-BR.data-display.js +2 -2
- package/dist/_internal/social-login-button/social-login-button.js +3 -3
- package/dist/_internal/user-avatar/user-avatar.js +7 -7
- package/dist/charts.js +11 -11
- package/dist/{chunk-NQP72RTD.js → chunk-27F2VXS4.js} +2 -2
- package/dist/{chunk-GMJBWOIU.js → chunk-2ILXXBMG.js} +5 -5
- package/dist/{chunk-LVATGJZO.js → chunk-2K2Q7VGV.js} +2 -2
- package/dist/{chunk-ISW5K72V.js → chunk-2ZRZTGWP.js} +5 -5
- package/dist/{chunk-BM3MKZL2.js → chunk-3BDMYTH6.js} +2 -2
- package/dist/{chunk-Q7BGMLCX.js → chunk-3FDSXSEP.js} +3 -3
- package/dist/{chunk-5WJFCQFN.js → chunk-3O2OJW4O.js} +4 -4
- package/dist/{chunk-L4FWEI2P.js → chunk-3V3Z4EML.js} +5 -5
- package/dist/{chunk-CE74DKHT.js → chunk-44PBCQ7E.js} +7 -7
- package/dist/{chunk-U5YOOHR6.js → chunk-4QGPRORO.js} +2 -2
- package/dist/{chunk-W2RXXF7K.js → chunk-4XBAEKQQ.js} +4 -4
- package/dist/{chunk-LYVTJLCF.js → chunk-56JF5PZK.js} +4 -4
- package/dist/{chunk-QBY3TWV3.js → chunk-5HFB4WFE.js} +3 -3
- package/dist/{chunk-3DPPDGOF.js → chunk-62SXUU5U.js} +5 -5
- package/dist/{chunk-QADTI63U.js → chunk-6ATXOJVQ.js} +4 -4
- package/dist/chunk-6GYUR63Q.js +14 -0
- package/dist/chunk-6GYUR63Q.js.map +1 -0
- package/dist/{chunk-F3AYISXT.js → chunk-6PU3JYVY.js} +4 -4
- package/dist/{chunk-WVIJFS5Y.js → chunk-725H45MT.js} +7 -7
- package/dist/{chunk-XP522FFM.js → chunk-7JKDB5J5.js} +5 -5
- package/dist/{chunk-V45JGJ3W.js → chunk-7K23NEZO.js} +8 -8
- package/dist/{chunk-EOQ6EKTS.js → chunk-7XSCEHGA.js} +7 -7
- package/dist/{chunk-7VUXSNVZ.js → chunk-A4B27HYU.js} +2 -2
- package/dist/{chunk-ADSA76T7.js → chunk-AG3DY5TH.js} +2 -2
- package/dist/{chunk-G5ORAVSP.js → chunk-AJ5LXKLQ.js} +8 -8
- package/dist/{chunk-HI7JPDD6.js → chunk-AMLHEKSV.js} +5 -5
- package/dist/{chunk-XZILNBAU.js → chunk-ARVLS57B.js} +6 -6
- package/dist/{chunk-ZEH6MGP5.js → chunk-BEHM2VLH.js} +9 -9
- package/dist/{chunk-EBMWYRXW.js → chunk-BEYLI32I.js} +2 -2
- package/dist/{chunk-YKKHNYEW.js → chunk-BF3SGOWT.js} +3 -3
- package/dist/{chunk-MA6SUE7F.js → chunk-BGGVYKVZ.js} +4 -4
- package/dist/{chunk-YNIOCELQ.js → chunk-BJONUBQL.js} +3 -3
- package/dist/{chunk-E5GYHN4X.js → chunk-CAX3NFFE.js} +3 -3
- package/dist/{chunk-LIN4A2BW.js → chunk-CSD6SWBZ.js} +5 -5
- package/dist/{chunk-QK63RXLG.js → chunk-CYH5QQUP.js} +8 -8
- package/dist/{chunk-CJGSQL77.js → chunk-CZV6NVCA.js} +4 -4
- package/dist/{chunk-755VS7NA.js → chunk-DOWVAC4U.js} +3 -3
- package/dist/{chunk-PIP7XII2.js → chunk-E54XIRY2.js} +5 -5
- package/dist/{chunk-SL6454K7.js → chunk-EEB66IVH.js} +26 -32
- package/dist/chunk-EEB66IVH.js.map +1 -0
- package/dist/{chunk-NJMAFII4.js → chunk-F5IXDEWJ.js} +2 -2
- package/dist/{chunk-U57NFQYE.js → chunk-FIOBPQL2.js} +4 -4
- package/dist/{chunk-6VUVSYP4.js → chunk-FR2RJXHS.js} +2 -2
- package/dist/{chunk-FWPQUYND.js → chunk-FS55MQ4Q.js} +2 -2
- package/dist/{chunk-UXVB423Q.js → chunk-FVL6U72V.js} +6 -6
- package/dist/{chunk-2ZHF5VE4.js → chunk-FXECKKPW.js} +32 -29
- package/dist/chunk-FXECKKPW.js.map +1 -0
- package/dist/{chunk-LWZ2K225.js → chunk-FXZUVZON.js} +6 -6
- package/dist/{chunk-RGR6YKK5.js → chunk-GBKIGUNP.js} +2 -2
- package/dist/{chunk-YBAK2WN5.js → chunk-HBHBRRSW.js} +7 -7
- package/dist/{chunk-HNFZLXZI.js → chunk-HBP2OU4Q.js} +5 -5
- package/dist/{chunk-V6OC2PSQ.js → chunk-HCLAVPGG.js} +2 -2
- package/dist/{chunk-4MKVGSHX.js → chunk-HN3PZTUK.js} +5 -5
- package/dist/{chunk-ZOUWHGV3.js → chunk-HOJL2GKW.js} +7 -7
- package/dist/{chunk-JVOEVTCZ.js → chunk-HQCZT6TO.js} +5 -5
- package/dist/{chunk-PCM4VEPO.js → chunk-HSIUVFXE.js} +7 -7
- package/dist/{chunk-L5R2FB4T.js → chunk-HVGQH54G.js} +2 -2
- package/dist/{chunk-7SPFK73H.js → chunk-IHLOP4LG.js} +7 -7
- package/dist/{chunk-RQF4NXDC.js → chunk-IWJTLCTF.js} +2 -2
- package/dist/{chunk-IICBAAL7.js → chunk-IZ7JTG3Z.js} +4 -4
- package/dist/{chunk-2QB4WIU5.js → chunk-J5QNJERV.js} +10 -10
- package/dist/{chunk-6OLERKNC.js → chunk-JA3WJPXH.js} +2 -2
- package/dist/{chunk-5ZOJLYD2.js → chunk-JE6RZ5L6.js} +4 -4
- package/dist/{chunk-GICG3XJK.js → chunk-JGLPSBZE.js} +4 -4
- package/dist/{chunk-J2RUDZVJ.js → chunk-KARMRTTM.js} +7 -7
- package/dist/{chunk-RIAZPGHT.js → chunk-KKVM723A.js} +4 -4
- package/dist/{chunk-3DFWHF6O.js → chunk-KLEKSTZI.js} +6 -6
- package/dist/{chunk-6QOJEZDH.js → chunk-KZ5I5WCH.js} +4 -4
- package/dist/{chunk-CDYQKIBL.js → chunk-LABIUXDM.js} +2 -2
- package/dist/chunk-LZRVUOMU.js +12 -0
- package/dist/chunk-LZRVUOMU.js.map +1 -0
- package/dist/{chunk-ZAPP32GD.js → chunk-M7HYNXCU.js} +2 -2
- package/dist/{chunk-QVEQOUQY.js → chunk-MA6ENJDP.js} +3 -3
- package/dist/{chunk-D34PZJH3.js → chunk-MBMZNSBP.js} +2 -2
- package/dist/{chunk-EQK3K65G.js → chunk-MK7KZY2Y.js} +2 -2
- package/dist/chunk-MK7KZY2Y.js.map +1 -0
- package/dist/{chunk-Z2J4MRTF.js → chunk-MKNW4FRR.js} +4 -4
- package/dist/{chunk-RCZ4KL2H.js → chunk-NIENIKZ5.js} +2 -2
- package/dist/{chunk-6QRN4JK7.js → chunk-NKBCUR4V.js} +2 -2
- package/dist/{chunk-2B3NX5HJ.js → chunk-NPSARV2I.js} +6 -6
- package/dist/{chunk-YPAH2NWN.js → chunk-NQ6P7O7C.js} +2 -2
- package/dist/{chunk-EWVJJ32N.js → chunk-OKYYHBGS.js} +6 -6
- package/dist/{chunk-WQ32YFM5.js → chunk-P7VAMJFJ.js} +5 -5
- package/dist/{chunk-KYPHR4TT.js → chunk-QWSYHENP.js} +2 -2
- package/dist/chunk-RHVJ3L4U.js +14 -0
- package/dist/chunk-RHVJ3L4U.js.map +1 -0
- package/dist/{chunk-SE5WHKCB.js → chunk-RPKUZDRY.js} +6 -6
- package/dist/{chunk-V6SRBQMN.js → chunk-S4JXSC4D.js} +5 -5
- package/dist/{chunk-TIM4PXWN.js → chunk-SB2SEGR6.js} +3 -3
- package/dist/{chunk-7PTE6HBW.js → chunk-SUXT6QAY.js} +2 -2
- package/dist/{chunk-DAT4XWYX.js → chunk-TRYYYWV3.js} +14 -14
- package/dist/{chunk-65NYUQXD.js → chunk-TSID4257.js} +9 -9
- package/dist/{chunk-KPEKD5SG.js → chunk-UKUGSU3Y.js} +11 -3
- package/dist/{chunk-KPEKD5SG.js.map → chunk-UKUGSU3Y.js.map} +1 -1
- package/dist/{chunk-23LPXHR2.js → chunk-URSYEHPU.js} +11 -5
- package/dist/chunk-URSYEHPU.js.map +1 -0
- package/dist/{chunk-DWFUT45A.js → chunk-VEBNL5MG.js} +3 -3
- package/dist/{chunk-LVXGCXKB.js → chunk-VMTOLAZ5.js} +7 -7
- package/dist/{chunk-BRBQNPM2.js → chunk-VQSBZPKO.js} +3 -3
- package/dist/{chunk-ZEVFMQAQ.js → chunk-VWVA74JY.js} +2 -2
- package/dist/{chunk-RX2XP7V5.js → chunk-WHUJAGPV.js} +4 -4
- package/dist/{chunk-YULI2EBC.js → chunk-XICRCPEQ.js} +4 -4
- package/dist/{chunk-Q4WTVAJ5.js → chunk-XLCVMRSO.js} +2 -2
- package/dist/{chunk-ZIHSCBMN.js → chunk-Z5V5E3JW.js} +10 -10
- package/dist/{chunk-7KAZ3B5B.js → chunk-Z5W4QPEC.js} +4 -4
- package/dist/{chunk-G3JFESKD.js → chunk-Z5WUSI47.js} +6 -6
- package/dist/chunk-ZLMKGVB2.js +21 -0
- package/dist/chunk-ZLMKGVB2.js.map +1 -0
- package/dist/{chunk-JPYNGWV4.js → chunk-ZOLUUX4B.js} +2 -2
- package/dist/{chunk-4W6AQFMO.js → chunk-ZVWQ5TF4.js} +3 -3
- package/dist/data-display/AsyncStateContainer.js +6 -6
- package/dist/data-display/Avatar.js +4 -4
- package/dist/data-display/CardKit.js +13 -13
- package/dist/data-display/Carousel.js +2 -2
- package/dist/data-display/Chart.js +11 -11
- package/dist/data-display/DataGrid.js +2 -2
- package/dist/data-display/DataViews.js +72 -70
- package/dist/data-display/EmptyState.js +2 -2
- package/dist/data-display/FleetMap.js +14 -14
- package/dist/data-display/HoverCard.js +2 -2
- package/dist/data-display/InteractiveTooltip.js +2 -2
- package/dist/data-display/LazyImage.js +3 -3
- package/dist/data-display/Lightbox.js +6 -6
- package/dist/data-display/LoadingState.js +3 -3
- package/dist/data-display/MapPreview.js +5 -5
- package/dist/data-display/Progress.js +2 -2
- package/dist/data-display/SectionOnboarding.js +3 -3
- package/dist/data-display/Sheet.js +4 -4
- package/dist/data-display/StatCard.js +3 -3
- package/dist/data-display/Table.js +2 -2
- package/dist/feedback/ConfirmAction.js +7 -7
- package/dist/feedback/Dialog.js +2 -2
- package/dist/feedback/TutorialOverlay.js +2 -2
- package/dist/form/AddressAutocomplete.js +8 -8
- package/dist/form/Autocomplete.js +1 -1
- package/dist/form/Calendar.js +6 -6
- package/dist/form/CategorySelect.js +7 -7
- package/dist/form/CepField.js +5 -4
- package/dist/form/CodeEditor.js +2 -2
- package/dist/form/Command.js +2 -2
- package/dist/form/DateRangePicker.js +9 -9
- package/dist/form/Input/outlined.js +27 -0
- package/dist/form/Input/outlined.js.map +1 -0
- package/dist/form/Input.js +4 -2
- package/dist/form/NumberField.js +5 -3
- package/dist/form/PickerSheet.js +2 -2
- package/dist/form/total-form.js +21 -17
- package/dist/layout/Card.js +2 -2
- package/dist/layout/ContentToolbar.js +3 -3
- package/dist/layout/ScrollArea.js +3 -3
- package/dist/layout/SettingCard.js +7 -7
- package/dist/layout/SettingsLayout.js +5 -5
- package/dist/layout/Skeleton.js +2 -2
- package/dist/locales.js +6 -6
- package/dist/navigation/AppHeader.js +9 -9
- package/dist/navigation/NavigationMenu.js +5 -5
- package/dist/navigation/SectionNav.js +3 -3
- package/dist/pt-BR.js +6 -6
- package/dist/social-login-button.js +3 -3
- package/dist/types/components/form/CepField/CepField.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.d.ts +9 -3
- package/dist/types/components/form/Input/Input.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.factory.d.ts +13 -0
- package/dist/types/components/form/Input/Input.factory.d.ts.map +1 -0
- package/dist/types/components/form/Input/outlined/index.d.ts +24 -0
- package/dist/types/components/form/Input/outlined/index.d.ts.map +1 -0
- package/dist/types/components/form/Input/outlined/text-field-slim-outlined.d.ts +10 -0
- package/dist/types/components/form/Input/outlined/text-field-slim-outlined.d.ts.map +1 -0
- package/dist/types/components/form/Input/text-field-slim.d.ts +8 -40
- package/dist/types/components/form/Input/text-field-slim.d.ts.map +1 -1
- package/dist/types/components/form/Input/text-field-slim.factory.d.ts +61 -0
- package/dist/types/components/form/Input/text-field-slim.factory.d.ts.map +1 -0
- package/dist/types/components/navigation/SectionNav/SectionNav.bar.d.ts +2 -0
- package/dist/types/components/navigation/SectionNav/SectionNav.bar.d.ts.map +1 -1
- package/dist/types/components/navigation/SectionNav/SectionNav.primary.d.ts +9 -0
- package/dist/types/components/navigation/SectionNav/SectionNav.primary.d.ts.map +1 -1
- package/dist/user-avatar.js +7 -7
- package/dist/utility/InfiniteScroll.js +2 -2
- package/dist/utility/InstallPrompt.js +2 -2
- package/package.json +5 -1
- package/src/components/form/CepField/CepField.tsx +3 -1
- package/src/components/form/Input/Input.factory.tsx +221 -0
- package/src/components/form/Input/Input.md +20 -0
- package/src/components/form/Input/Input.tsx +9 -196
- package/src/components/form/Input/outlined/index.ts +27 -0
- package/src/components/form/Input/outlined/text-field-slim-outlined.tsx +13 -0
- package/src/components/form/Input/text-field-slim.factory.tsx +248 -0
- package/src/components/form/Input/text-field-slim.tsx +9 -209
- package/src/components/navigation/SectionNav/SectionNav.bar.tsx +9 -3
- package/src/components/navigation/SectionNav/SectionNav.md +1 -1
- package/src/components/navigation/SectionNav/SectionNav.primary.tsx +14 -1
- package/dist/chunk-23LPXHR2.js.map +0 -1
- package/dist/chunk-2ZHF5VE4.js.map +0 -1
- package/dist/chunk-EQK3K65G.js.map +0 -1
- package/dist/chunk-SL6454K7.js.map +0 -1
- /package/dist/{chunk-NQP72RTD.js.map → chunk-27F2VXS4.js.map} +0 -0
- /package/dist/{chunk-GMJBWOIU.js.map → chunk-2ILXXBMG.js.map} +0 -0
- /package/dist/{chunk-LVATGJZO.js.map → chunk-2K2Q7VGV.js.map} +0 -0
- /package/dist/{chunk-ISW5K72V.js.map → chunk-2ZRZTGWP.js.map} +0 -0
- /package/dist/{chunk-BM3MKZL2.js.map → chunk-3BDMYTH6.js.map} +0 -0
- /package/dist/{chunk-Q7BGMLCX.js.map → chunk-3FDSXSEP.js.map} +0 -0
- /package/dist/{chunk-5WJFCQFN.js.map → chunk-3O2OJW4O.js.map} +0 -0
- /package/dist/{chunk-L4FWEI2P.js.map → chunk-3V3Z4EML.js.map} +0 -0
- /package/dist/{chunk-CE74DKHT.js.map → chunk-44PBCQ7E.js.map} +0 -0
- /package/dist/{chunk-U5YOOHR6.js.map → chunk-4QGPRORO.js.map} +0 -0
- /package/dist/{chunk-W2RXXF7K.js.map → chunk-4XBAEKQQ.js.map} +0 -0
- /package/dist/{chunk-LYVTJLCF.js.map → chunk-56JF5PZK.js.map} +0 -0
- /package/dist/{chunk-QBY3TWV3.js.map → chunk-5HFB4WFE.js.map} +0 -0
- /package/dist/{chunk-3DPPDGOF.js.map → chunk-62SXUU5U.js.map} +0 -0
- /package/dist/{chunk-QADTI63U.js.map → chunk-6ATXOJVQ.js.map} +0 -0
- /package/dist/{chunk-F3AYISXT.js.map → chunk-6PU3JYVY.js.map} +0 -0
- /package/dist/{chunk-WVIJFS5Y.js.map → chunk-725H45MT.js.map} +0 -0
- /package/dist/{chunk-XP522FFM.js.map → chunk-7JKDB5J5.js.map} +0 -0
- /package/dist/{chunk-V45JGJ3W.js.map → chunk-7K23NEZO.js.map} +0 -0
- /package/dist/{chunk-EOQ6EKTS.js.map → chunk-7XSCEHGA.js.map} +0 -0
- /package/dist/{chunk-7VUXSNVZ.js.map → chunk-A4B27HYU.js.map} +0 -0
- /package/dist/{chunk-ADSA76T7.js.map → chunk-AG3DY5TH.js.map} +0 -0
- /package/dist/{chunk-G5ORAVSP.js.map → chunk-AJ5LXKLQ.js.map} +0 -0
- /package/dist/{chunk-HI7JPDD6.js.map → chunk-AMLHEKSV.js.map} +0 -0
- /package/dist/{chunk-XZILNBAU.js.map → chunk-ARVLS57B.js.map} +0 -0
- /package/dist/{chunk-ZEH6MGP5.js.map → chunk-BEHM2VLH.js.map} +0 -0
- /package/dist/{chunk-EBMWYRXW.js.map → chunk-BEYLI32I.js.map} +0 -0
- /package/dist/{chunk-YKKHNYEW.js.map → chunk-BF3SGOWT.js.map} +0 -0
- /package/dist/{chunk-MA6SUE7F.js.map → chunk-BGGVYKVZ.js.map} +0 -0
- /package/dist/{chunk-YNIOCELQ.js.map → chunk-BJONUBQL.js.map} +0 -0
- /package/dist/{chunk-E5GYHN4X.js.map → chunk-CAX3NFFE.js.map} +0 -0
- /package/dist/{chunk-LIN4A2BW.js.map → chunk-CSD6SWBZ.js.map} +0 -0
- /package/dist/{chunk-QK63RXLG.js.map → chunk-CYH5QQUP.js.map} +0 -0
- /package/dist/{chunk-CJGSQL77.js.map → chunk-CZV6NVCA.js.map} +0 -0
- /package/dist/{chunk-755VS7NA.js.map → chunk-DOWVAC4U.js.map} +0 -0
- /package/dist/{chunk-PIP7XII2.js.map → chunk-E54XIRY2.js.map} +0 -0
- /package/dist/{chunk-NJMAFII4.js.map → chunk-F5IXDEWJ.js.map} +0 -0
- /package/dist/{chunk-U57NFQYE.js.map → chunk-FIOBPQL2.js.map} +0 -0
- /package/dist/{chunk-6VUVSYP4.js.map → chunk-FR2RJXHS.js.map} +0 -0
- /package/dist/{chunk-FWPQUYND.js.map → chunk-FS55MQ4Q.js.map} +0 -0
- /package/dist/{chunk-UXVB423Q.js.map → chunk-FVL6U72V.js.map} +0 -0
- /package/dist/{chunk-LWZ2K225.js.map → chunk-FXZUVZON.js.map} +0 -0
- /package/dist/{chunk-RGR6YKK5.js.map → chunk-GBKIGUNP.js.map} +0 -0
- /package/dist/{chunk-YBAK2WN5.js.map → chunk-HBHBRRSW.js.map} +0 -0
- /package/dist/{chunk-HNFZLXZI.js.map → chunk-HBP2OU4Q.js.map} +0 -0
- /package/dist/{chunk-V6OC2PSQ.js.map → chunk-HCLAVPGG.js.map} +0 -0
- /package/dist/{chunk-4MKVGSHX.js.map → chunk-HN3PZTUK.js.map} +0 -0
- /package/dist/{chunk-ZOUWHGV3.js.map → chunk-HOJL2GKW.js.map} +0 -0
- /package/dist/{chunk-JVOEVTCZ.js.map → chunk-HQCZT6TO.js.map} +0 -0
- /package/dist/{chunk-PCM4VEPO.js.map → chunk-HSIUVFXE.js.map} +0 -0
- /package/dist/{chunk-L5R2FB4T.js.map → chunk-HVGQH54G.js.map} +0 -0
- /package/dist/{chunk-7SPFK73H.js.map → chunk-IHLOP4LG.js.map} +0 -0
- /package/dist/{chunk-RQF4NXDC.js.map → chunk-IWJTLCTF.js.map} +0 -0
- /package/dist/{chunk-IICBAAL7.js.map → chunk-IZ7JTG3Z.js.map} +0 -0
- /package/dist/{chunk-2QB4WIU5.js.map → chunk-J5QNJERV.js.map} +0 -0
- /package/dist/{chunk-6OLERKNC.js.map → chunk-JA3WJPXH.js.map} +0 -0
- /package/dist/{chunk-5ZOJLYD2.js.map → chunk-JE6RZ5L6.js.map} +0 -0
- /package/dist/{chunk-GICG3XJK.js.map → chunk-JGLPSBZE.js.map} +0 -0
- /package/dist/{chunk-J2RUDZVJ.js.map → chunk-KARMRTTM.js.map} +0 -0
- /package/dist/{chunk-RIAZPGHT.js.map → chunk-KKVM723A.js.map} +0 -0
- /package/dist/{chunk-3DFWHF6O.js.map → chunk-KLEKSTZI.js.map} +0 -0
- /package/dist/{chunk-6QOJEZDH.js.map → chunk-KZ5I5WCH.js.map} +0 -0
- /package/dist/{chunk-CDYQKIBL.js.map → chunk-LABIUXDM.js.map} +0 -0
- /package/dist/{chunk-ZAPP32GD.js.map → chunk-M7HYNXCU.js.map} +0 -0
- /package/dist/{chunk-QVEQOUQY.js.map → chunk-MA6ENJDP.js.map} +0 -0
- /package/dist/{chunk-D34PZJH3.js.map → chunk-MBMZNSBP.js.map} +0 -0
- /package/dist/{chunk-Z2J4MRTF.js.map → chunk-MKNW4FRR.js.map} +0 -0
- /package/dist/{chunk-RCZ4KL2H.js.map → chunk-NIENIKZ5.js.map} +0 -0
- /package/dist/{chunk-6QRN4JK7.js.map → chunk-NKBCUR4V.js.map} +0 -0
- /package/dist/{chunk-2B3NX5HJ.js.map → chunk-NPSARV2I.js.map} +0 -0
- /package/dist/{chunk-YPAH2NWN.js.map → chunk-NQ6P7O7C.js.map} +0 -0
- /package/dist/{chunk-EWVJJ32N.js.map → chunk-OKYYHBGS.js.map} +0 -0
- /package/dist/{chunk-WQ32YFM5.js.map → chunk-P7VAMJFJ.js.map} +0 -0
- /package/dist/{chunk-KYPHR4TT.js.map → chunk-QWSYHENP.js.map} +0 -0
- /package/dist/{chunk-SE5WHKCB.js.map → chunk-RPKUZDRY.js.map} +0 -0
- /package/dist/{chunk-V6SRBQMN.js.map → chunk-S4JXSC4D.js.map} +0 -0
- /package/dist/{chunk-TIM4PXWN.js.map → chunk-SB2SEGR6.js.map} +0 -0
- /package/dist/{chunk-7PTE6HBW.js.map → chunk-SUXT6QAY.js.map} +0 -0
- /package/dist/{chunk-DAT4XWYX.js.map → chunk-TRYYYWV3.js.map} +0 -0
- /package/dist/{chunk-65NYUQXD.js.map → chunk-TSID4257.js.map} +0 -0
- /package/dist/{chunk-DWFUT45A.js.map → chunk-VEBNL5MG.js.map} +0 -0
- /package/dist/{chunk-LVXGCXKB.js.map → chunk-VMTOLAZ5.js.map} +0 -0
- /package/dist/{chunk-BRBQNPM2.js.map → chunk-VQSBZPKO.js.map} +0 -0
- /package/dist/{chunk-ZEVFMQAQ.js.map → chunk-VWVA74JY.js.map} +0 -0
- /package/dist/{chunk-RX2XP7V5.js.map → chunk-WHUJAGPV.js.map} +0 -0
- /package/dist/{chunk-YULI2EBC.js.map → chunk-XICRCPEQ.js.map} +0 -0
- /package/dist/{chunk-Q4WTVAJ5.js.map → chunk-XLCVMRSO.js.map} +0 -0
- /package/dist/{chunk-ZIHSCBMN.js.map → chunk-Z5V5E3JW.js.map} +0 -0
- /package/dist/{chunk-7KAZ3B5B.js.map → chunk-Z5W4QPEC.js.map} +0 -0
- /package/dist/{chunk-G3JFESKD.js.map → chunk-Z5WUSI47.js.map} +0 -0
- /package/dist/{chunk-JPYNGWV4.js.map → chunk-ZOLUUX4B.js.map} +0 -0
- /package/dist/{chunk-4W6AQFMO.js.map → chunk-ZVWQ5TF4.js.map} +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import CircularProgress from '@mui/material/CircularProgress/index.js';
|
|
2
|
+
import InputAdornment from '@mui/material/InputAdornment/index.js';
|
|
3
|
+
import { styled, useTheme } from '@mui/material/styles/index.js';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
import { INPUT_LOADING } from './Input.metrics';
|
|
7
|
+
import type { TextFieldSlimComponent } from './text-field-slim.factory';
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
filledStyles,
|
|
11
|
+
floatingLabelStyles,
|
|
12
|
+
glowStyles,
|
|
13
|
+
inputBaseStyles,
|
|
14
|
+
inputRadiusStyles,
|
|
15
|
+
muiVariantFor,
|
|
16
|
+
outlinedStyles,
|
|
17
|
+
pulseStyles,
|
|
18
|
+
SIZE_MAP,
|
|
19
|
+
} from './Input.styles';
|
|
20
|
+
import type { InputProps } from './Input.types';
|
|
21
|
+
import { splitTestId } from '../../../platform/test-id';
|
|
22
|
+
import { fieldControlStyles } from '../../../tokens/field-height';
|
|
23
|
+
import { rem } from '../../../tokens/relative';
|
|
24
|
+
import type { SizeValue } from '../../../tokens/vocabulary';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The field `Input` renders, styled, over whichever text field it is given.
|
|
28
|
+
*
|
|
29
|
+
* Always a `TextFieldSlim`, never MUI's `TextField` — see `text-field-slim.tsx`.
|
|
30
|
+
* MUI's own `TextField` imports `Select` unconditionally, and through it `Menu`,
|
|
31
|
+
* `Popover`, `Modal` and seven more component modules, so every screen with one
|
|
32
|
+
* text box shipped a dropdown it can never render. Same composition, same DOM,
|
|
33
|
+
* same prop routing; the select branch is the only thing missing.
|
|
34
|
+
*/
|
|
35
|
+
function styledField(TextField: TextFieldSlimComponent) {
|
|
36
|
+
return styled(TextField, {
|
|
37
|
+
shouldForwardProp: (prop) =>
|
|
38
|
+
!['customVariant', 'fieldSize', 'floating', 'glow', 'pulse', 'loading'].includes(prop as string),
|
|
39
|
+
})<{
|
|
40
|
+
customVariant?: InputProps['variant'];
|
|
41
|
+
fieldSize: SizeValue;
|
|
42
|
+
floating?: boolean;
|
|
43
|
+
glow?: boolean;
|
|
44
|
+
pulse?: boolean;
|
|
45
|
+
loading?: boolean;
|
|
46
|
+
}>(({ theme, customVariant, fieldSize, floating, glow, pulse, loading }) => ({
|
|
47
|
+
position: 'relative',
|
|
48
|
+
// The theme's field height for this size (outlined family, one line).
|
|
49
|
+
...fieldControlStyles(theme, fieldSize),
|
|
50
|
+
opacity: loading ? INPUT_LOADING.opacity : 1,
|
|
51
|
+
|
|
52
|
+
...(glow ? glowStyles(theme) : {}),
|
|
53
|
+
...(pulse ? pulseStyles(theme, fieldSize) : {}),
|
|
54
|
+
...(floating ? floatingLabelStyles(theme) : {}),
|
|
55
|
+
|
|
56
|
+
'& .MuiInputBase-root': {
|
|
57
|
+
transition: 'all 0.3s ease',
|
|
58
|
+
...inputRadiusStyles(theme, customVariant),
|
|
59
|
+
...inputBaseStyles(theme, customVariant),
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
'& .MuiOutlinedInput-root': outlinedStyles(theme),
|
|
63
|
+
'& .MuiFilledInput-root': filledStyles(theme),
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Only one adornment shows at a time: the spinner replaces the caller's while loading. */
|
|
68
|
+
const EndAdornment: React.FC<{ loading: boolean; endAdornment?: React.ReactNode }> = ({
|
|
69
|
+
loading,
|
|
70
|
+
endAdornment,
|
|
71
|
+
}) => {
|
|
72
|
+
const theme = useTheme();
|
|
73
|
+
if (loading) {
|
|
74
|
+
return (
|
|
75
|
+
<InputAdornment position="end">
|
|
76
|
+
<CircularProgress size={rem(theme, INPUT_LOADING.spinnerSize)} />
|
|
77
|
+
</InputAdornment>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!endAdornment) return null;
|
|
82
|
+
|
|
83
|
+
return <InputAdornment position="end">{endAdornment}</InputAdornment>;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/** While loading the field is inert: no clicks, and disabled to assistive tech. */
|
|
87
|
+
const interactionProps = (
|
|
88
|
+
loading: boolean,
|
|
89
|
+
onClick: InputProps['onClick'],
|
|
90
|
+
disabled?: boolean,
|
|
91
|
+
) => ({
|
|
92
|
+
disabled: loading || disabled,
|
|
93
|
+
onClick: loading ? undefined : onClick,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* The ARIA that describes the field has to sit on the `<input>`: the text
|
|
98
|
+
* field puts every attribute it does not recognise on its root `FormControl`,
|
|
99
|
+
* a `<div>` with no role, where a screen reader never reads it.
|
|
100
|
+
*
|
|
101
|
+
* `aria-label` has ridden `inputProps` since FUT-755. `aria-describedby` and
|
|
102
|
+
* `aria-busy` fell through to the div until FUT-2619, so CepField's input
|
|
103
|
+
* pointed at nothing while its lookup status lived in a live region beside it.
|
|
104
|
+
*
|
|
105
|
+
* `inputProps` are spread onto the `<input>` AFTER the `aria-describedby` MUI
|
|
106
|
+
* writes for helper text, so a caller's ids REPLACE the helper text's: MUI's
|
|
107
|
+
* `TextField` on its own keeps only one of the two. This joins both, helper
|
|
108
|
+
* text first. The helper id is MUI's `<id>-helper-text` (the parity test pins
|
|
109
|
+
* that spelling), which is why the field's id is fixed here rather than left
|
|
110
|
+
* to the text field.
|
|
111
|
+
*/
|
|
112
|
+
function inputAriaOf(a: {
|
|
113
|
+
id: string;
|
|
114
|
+
helperText: React.ReactNode;
|
|
115
|
+
label?: string;
|
|
116
|
+
describedBy?: string;
|
|
117
|
+
busy?: InputProps['aria-busy'];
|
|
118
|
+
}): Record<string, unknown> {
|
|
119
|
+
const describedBy = [a.helperText ? `${a.id}-helper-text` : undefined, a.describedBy]
|
|
120
|
+
.filter(Boolean)
|
|
121
|
+
.join(' ');
|
|
122
|
+
return {
|
|
123
|
+
...(a.label === undefined ? {} : { 'aria-label': a.label }),
|
|
124
|
+
...(a.describedBy === undefined ? {} : { 'aria-describedby': describedBy }),
|
|
125
|
+
...(a.busy === undefined ? {} : { 'aria-busy': a.busy }),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** The render function `createInput` hands `forwardRef`, over a given styled field. */
|
|
130
|
+
function inputRenderer(
|
|
131
|
+
StyledTextField: ReturnType<typeof styledField>,
|
|
132
|
+
): React.ForwardRefRenderFunction<HTMLInputElement, InputProps> {
|
|
133
|
+
return (
|
|
134
|
+
{
|
|
135
|
+
variant = 'outlined',
|
|
136
|
+
size = 'md',
|
|
137
|
+
label,
|
|
138
|
+
error,
|
|
139
|
+
helperText,
|
|
140
|
+
startAdornment,
|
|
141
|
+
endAdornment,
|
|
142
|
+
fullWidth = true,
|
|
143
|
+
floating = false,
|
|
144
|
+
glow = false,
|
|
145
|
+
pulse = false,
|
|
146
|
+
loading = false,
|
|
147
|
+
onClick,
|
|
148
|
+
onFocus,
|
|
149
|
+
onBlur,
|
|
150
|
+
'aria-label': ariaLabel,
|
|
151
|
+
'aria-describedby': ariaDescribedBy,
|
|
152
|
+
'aria-busy': ariaBusy,
|
|
153
|
+
inputProps,
|
|
154
|
+
...rest
|
|
155
|
+
},
|
|
156
|
+
ref,
|
|
157
|
+
) => {
|
|
158
|
+
const { testId: dataTestId, rest: props } = splitTestId(rest);
|
|
159
|
+
const generatedId = React.useId();
|
|
160
|
+
const id = props.id ?? generatedId;
|
|
161
|
+
return (
|
|
162
|
+
<StyledTextField
|
|
163
|
+
ref={ref}
|
|
164
|
+
variant={muiVariantFor(variant)}
|
|
165
|
+
customVariant={variant}
|
|
166
|
+
fieldSize={size}
|
|
167
|
+
floating={floating}
|
|
168
|
+
glow={glow}
|
|
169
|
+
pulse={pulse}
|
|
170
|
+
loading={loading}
|
|
171
|
+
label={label}
|
|
172
|
+
error={error}
|
|
173
|
+
helperText={helperText}
|
|
174
|
+
fullWidth={fullWidth}
|
|
175
|
+
{...interactionProps(loading, onClick, props.disabled)}
|
|
176
|
+
onFocus={onFocus}
|
|
177
|
+
onBlur={onBlur}
|
|
178
|
+
/*
|
|
179
|
+
* `aria-label` has to ride `inputProps` to reach the `<input>` (FUT-755).
|
|
180
|
+
* Spread with the rest it lands on the FormControl DIV that the text
|
|
181
|
+
* field renders as its root, which carries no role — so the field kept
|
|
182
|
+
* no accessible name, and a source grep saying "this input is labelled"
|
|
183
|
+
* disagreed with the DOM. The reports search box and the block-title
|
|
184
|
+
* inputs were both named in source and anonymous to a screen reader.
|
|
185
|
+
* `aria-describedby` and `aria-busy` are the same case: `inputAriaOf`.
|
|
186
|
+
*/
|
|
187
|
+
inputProps={{
|
|
188
|
+
'data-testid': dataTestId,
|
|
189
|
+
...inputProps,
|
|
190
|
+
...inputAriaOf({ id, helperText, label: ariaLabel, describedBy: ariaDescribedBy, busy: ariaBusy }),
|
|
191
|
+
}}
|
|
192
|
+
InputProps={{
|
|
193
|
+
startAdornment: startAdornment && (
|
|
194
|
+
<InputAdornment position="start">{startAdornment}</InputAdornment>
|
|
195
|
+
),
|
|
196
|
+
endAdornment: <EndAdornment loading={loading} endAdornment={endAdornment} />,
|
|
197
|
+
}}
|
|
198
|
+
{...SIZE_MAP[size]}
|
|
199
|
+
{...props}
|
|
200
|
+
id={id}
|
|
201
|
+
/>
|
|
202
|
+
);
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** The `Input` component every entry exports. */
|
|
207
|
+
export type InputComponent<P extends InputProps = InputProps> = React.ForwardRefExoticComponent<
|
|
208
|
+
P & React.RefAttributes<HTMLInputElement>
|
|
209
|
+
>;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* `Input` over a given text field (FUT-1054). The generic entry passes the
|
|
213
|
+
* field that renders any MUI variant; `./outlined` passes one that only ever
|
|
214
|
+
* imports `OutlinedInput`. Everything else — styles, adornments, the ARIA
|
|
215
|
+
* routing — is this one body, so the two cannot drift.
|
|
216
|
+
*/
|
|
217
|
+
export function createInput(TextField: TextFieldSlimComponent): InputComponent {
|
|
218
|
+
const Input = React.forwardRef<HTMLInputElement, InputProps>(inputRenderer(styledField(TextField)));
|
|
219
|
+
Input.displayName = 'Input';
|
|
220
|
+
return Input;
|
|
221
|
+
}
|
|
@@ -115,6 +115,26 @@ The Input component provides a flexible text input field with comprehensive vali
|
|
|
115
115
|
/>
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
+
## The outlined entry: `@12-apps/ui/form/Input/outlined`
|
|
119
|
+
|
|
120
|
+
The same `Input`, with the same props, styles and DOM, built on a field that imports MUI's `OutlinedInput` and no other MUI input (FUT-1054).
|
|
121
|
+
|
|
122
|
+
The generic `@12-apps/ui/form/Input` chooses MUI's input at runtime from `variant`. A bundler therefore ships `OutlinedInput`, `FilledInput` and `Input` (about 7 KB raw for the last two) to every screen that renders one. The outlined entry ships only the first.
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
import { Input } from '@12-apps/ui/form/Input/outlined';
|
|
126
|
+
|
|
127
|
+
<Input type="search" size="sm" aria-label="Buscar produtos" />
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**When to use it:** a control that only ever renders the outlined family (`outlined`, `glass` or `gradient`, the variants `muiVariantFor` draws as an outline), and that sits where its bytes matter: a storefront header, a first screen, or a library component such as `CepField`.
|
|
131
|
+
|
|
132
|
+
**What it refuses:** `variant="filled"` and `variant="underline"` are type errors. They need the inputs this entry exists to leave out, so use the generic entry for them.
|
|
133
|
+
|
|
134
|
+
**What stays the same:** `__tests__/outlined-entry.test.tsx` renders both entries from the same props and compares the DOM. `__tests__/outlined-reachability.test.ts` fails if `FilledInput` or MUI's `Input` becomes reachable from this entry or from `CepField`.
|
|
135
|
+
|
|
136
|
+
**Reachable only through this subpath.** The entry is not re-exported from `form/Input` or from the `form` barrel, where a second `Input` would collide.
|
|
137
|
+
|
|
118
138
|
## Accessibility
|
|
119
139
|
|
|
120
140
|
### ARIA Attributes
|
|
@@ -1,199 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import React from 'react';
|
|
5
|
-
|
|
6
|
-
import { INPUT_LOADING } from './Input.metrics';
|
|
7
|
-
import { TextFieldSlim } from './text-field-slim';
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
filledStyles,
|
|
11
|
-
floatingLabelStyles,
|
|
12
|
-
glowStyles,
|
|
13
|
-
inputBaseStyles,
|
|
14
|
-
inputRadiusStyles,
|
|
15
|
-
muiVariantFor,
|
|
16
|
-
outlinedStyles,
|
|
17
|
-
pulseStyles,
|
|
18
|
-
SIZE_MAP,
|
|
19
|
-
} from './Input.styles';
|
|
20
|
-
import type { InputProps } from './Input.types';
|
|
21
|
-
import { splitTestId } from '../../../platform/test-id';
|
|
22
|
-
import { fieldControlStyles } from '../../../tokens/field-height';
|
|
23
|
-
import { rem } from '../../../tokens/relative';
|
|
24
|
-
import type { SizeValue } from '../../../tokens/vocabulary';
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* `TextFieldSlim`, not `TextField` — see `text-field-slim.tsx`. MUI's own
|
|
28
|
-
* `TextField` imports `Select` unconditionally, and through it `Menu`,
|
|
29
|
-
* `Popover`, `Modal` and seven more component modules, so every screen with one
|
|
30
|
-
* text box shipped a dropdown it can never render. Same composition, same DOM,
|
|
31
|
-
* same prop routing; the select branch is the only thing missing.
|
|
32
|
-
*/
|
|
33
|
-
const StyledTextField = styled(TextFieldSlim, {
|
|
34
|
-
shouldForwardProp: (prop) =>
|
|
35
|
-
!['customVariant', 'fieldSize', 'floating', 'glow', 'pulse', 'loading'].includes(prop as string),
|
|
36
|
-
})<{
|
|
37
|
-
customVariant?: InputProps['variant'];
|
|
38
|
-
fieldSize: SizeValue;
|
|
39
|
-
floating?: boolean;
|
|
40
|
-
glow?: boolean;
|
|
41
|
-
pulse?: boolean;
|
|
42
|
-
loading?: boolean;
|
|
43
|
-
}>(({ theme, customVariant, fieldSize, floating, glow, pulse, loading }) => ({
|
|
44
|
-
position: 'relative',
|
|
45
|
-
// The theme's field height for this size (outlined family, one line).
|
|
46
|
-
...fieldControlStyles(theme, fieldSize),
|
|
47
|
-
opacity: loading ? INPUT_LOADING.opacity : 1,
|
|
48
|
-
|
|
49
|
-
...(glow ? glowStyles(theme) : {}),
|
|
50
|
-
...(pulse ? pulseStyles(theme, fieldSize) : {}),
|
|
51
|
-
...(floating ? floatingLabelStyles(theme) : {}),
|
|
52
|
-
|
|
53
|
-
'& .MuiInputBase-root': {
|
|
54
|
-
transition: 'all 0.3s ease',
|
|
55
|
-
...inputRadiusStyles(theme, customVariant),
|
|
56
|
-
...inputBaseStyles(theme, customVariant),
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
'& .MuiOutlinedInput-root': outlinedStyles(theme),
|
|
60
|
-
'& .MuiFilledInput-root': filledStyles(theme),
|
|
61
|
-
}));
|
|
62
|
-
|
|
63
|
-
/** Only one adornment shows at a time: the spinner replaces the caller's while loading. */
|
|
64
|
-
const EndAdornment: React.FC<{ loading: boolean; endAdornment?: React.ReactNode }> = ({
|
|
65
|
-
loading,
|
|
66
|
-
endAdornment,
|
|
67
|
-
}) => {
|
|
68
|
-
const theme = useTheme();
|
|
69
|
-
if (loading) {
|
|
70
|
-
return (
|
|
71
|
-
<InputAdornment position="end">
|
|
72
|
-
<CircularProgress size={rem(theme, INPUT_LOADING.spinnerSize)} />
|
|
73
|
-
</InputAdornment>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (!endAdornment) return null;
|
|
78
|
-
|
|
79
|
-
return <InputAdornment position="end">{endAdornment}</InputAdornment>;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
/** While loading the field is inert: no clicks, and disabled to assistive tech. */
|
|
83
|
-
const interactionProps = (
|
|
84
|
-
loading: boolean,
|
|
85
|
-
onClick: InputProps['onClick'],
|
|
86
|
-
disabled?: boolean,
|
|
87
|
-
) => ({
|
|
88
|
-
disabled: loading || disabled,
|
|
89
|
-
onClick: loading ? undefined : onClick,
|
|
90
|
-
});
|
|
1
|
+
import { createInput } from "./Input.factory";
|
|
2
|
+
import type { InputComponent } from "./Input.factory";
|
|
3
|
+
import { TextFieldSlim } from "./text-field-slim";
|
|
91
4
|
|
|
92
5
|
/**
|
|
93
|
-
* The
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* `aria-busy` fell through to the div until FUT-2619, so CepField's input
|
|
99
|
-
* pointed at nothing while its lookup status lived in a live region beside it.
|
|
100
|
-
*
|
|
101
|
-
* `inputProps` are spread onto the `<input>` AFTER the `aria-describedby` MUI
|
|
102
|
-
* writes for helper text, so a caller's ids REPLACE the helper text's: MUI's
|
|
103
|
-
* `TextField` on its own keeps only one of the two. This joins both, helper
|
|
104
|
-
* text first. The helper id is MUI's `<id>-helper-text` (the parity test pins
|
|
105
|
-
* that spelling), which is why the field's id is fixed here rather than left
|
|
106
|
-
* to the text field.
|
|
6
|
+
* The text input, over `TextFieldSlim` — see `text-field-slim.tsx` for why not
|
|
7
|
+
* MUI's `TextField`, and `Input.factory.tsx` for the body. This entry renders
|
|
8
|
+
* any of the five variants; a control that only ever renders the outlined
|
|
9
|
+
* family can import `@12-apps/ui/form/Input/outlined`, which ships one MUI
|
|
10
|
+
* input instead of three (FUT-1054).
|
|
107
11
|
*/
|
|
108
|
-
|
|
109
|
-
id: string;
|
|
110
|
-
helperText: React.ReactNode;
|
|
111
|
-
label?: string;
|
|
112
|
-
describedBy?: string;
|
|
113
|
-
busy?: InputProps['aria-busy'];
|
|
114
|
-
}): Record<string, unknown> {
|
|
115
|
-
const describedBy = [a.helperText ? `${a.id}-helper-text` : undefined, a.describedBy]
|
|
116
|
-
.filter(Boolean)
|
|
117
|
-
.join(' ');
|
|
118
|
-
return {
|
|
119
|
-
...(a.label === undefined ? {} : { 'aria-label': a.label }),
|
|
120
|
-
...(a.describedBy === undefined ? {} : { 'aria-describedby': describedBy }),
|
|
121
|
-
...(a.busy === undefined ? {} : { 'aria-busy': a.busy }),
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
126
|
-
(
|
|
127
|
-
{
|
|
128
|
-
variant = 'outlined',
|
|
129
|
-
size = 'md',
|
|
130
|
-
label,
|
|
131
|
-
error,
|
|
132
|
-
helperText,
|
|
133
|
-
startAdornment,
|
|
134
|
-
endAdornment,
|
|
135
|
-
fullWidth = true,
|
|
136
|
-
floating = false,
|
|
137
|
-
glow = false,
|
|
138
|
-
pulse = false,
|
|
139
|
-
loading = false,
|
|
140
|
-
onClick,
|
|
141
|
-
onFocus,
|
|
142
|
-
onBlur,
|
|
143
|
-
'aria-label': ariaLabel,
|
|
144
|
-
'aria-describedby': ariaDescribedBy,
|
|
145
|
-
'aria-busy': ariaBusy,
|
|
146
|
-
inputProps,
|
|
147
|
-
...rest
|
|
148
|
-
},
|
|
149
|
-
ref,
|
|
150
|
-
) => {
|
|
151
|
-
const { testId: dataTestId, rest: props } = splitTestId(rest);
|
|
152
|
-
const generatedId = React.useId();
|
|
153
|
-
const id = props.id ?? generatedId;
|
|
154
|
-
return (
|
|
155
|
-
<StyledTextField
|
|
156
|
-
ref={ref}
|
|
157
|
-
variant={muiVariantFor(variant)}
|
|
158
|
-
customVariant={variant}
|
|
159
|
-
fieldSize={size}
|
|
160
|
-
floating={floating}
|
|
161
|
-
glow={glow}
|
|
162
|
-
pulse={pulse}
|
|
163
|
-
loading={loading}
|
|
164
|
-
label={label}
|
|
165
|
-
error={error}
|
|
166
|
-
helperText={helperText}
|
|
167
|
-
fullWidth={fullWidth}
|
|
168
|
-
{...interactionProps(loading, onClick, props.disabled)}
|
|
169
|
-
onFocus={onFocus}
|
|
170
|
-
onBlur={onBlur}
|
|
171
|
-
/*
|
|
172
|
-
* `aria-label` has to ride `inputProps` to reach the `<input>` (FUT-755).
|
|
173
|
-
* Spread with the rest it lands on the FormControl DIV that the text
|
|
174
|
-
* field renders as its root, which carries no role — so the field kept
|
|
175
|
-
* no accessible name, and a source grep saying "this input is labelled"
|
|
176
|
-
* disagreed with the DOM. The reports search box and the block-title
|
|
177
|
-
* inputs were both named in source and anonymous to a screen reader.
|
|
178
|
-
* `aria-describedby` and `aria-busy` are the same case: `inputAriaOf`.
|
|
179
|
-
*/
|
|
180
|
-
inputProps={{
|
|
181
|
-
'data-testid': dataTestId,
|
|
182
|
-
...inputProps,
|
|
183
|
-
...inputAriaOf({ id, helperText, label: ariaLabel, describedBy: ariaDescribedBy, busy: ariaBusy }),
|
|
184
|
-
}}
|
|
185
|
-
InputProps={{
|
|
186
|
-
startAdornment: startAdornment && (
|
|
187
|
-
<InputAdornment position="start">{startAdornment}</InputAdornment>
|
|
188
|
-
),
|
|
189
|
-
endAdornment: <EndAdornment loading={loading} endAdornment={endAdornment} />,
|
|
190
|
-
}}
|
|
191
|
-
{...SIZE_MAP[size]}
|
|
192
|
-
{...props}
|
|
193
|
-
id={id}
|
|
194
|
-
/>
|
|
195
|
-
);
|
|
196
|
-
},
|
|
197
|
-
);
|
|
198
|
-
|
|
199
|
-
Input.displayName = 'Input';
|
|
12
|
+
export const Input: InputComponent = createInput(TextFieldSlim);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createInput } from '../Input.factory';
|
|
2
|
+
import type { InputComponent } from '../Input.factory';
|
|
3
|
+
import type { InputProps as GenericInputProps, InputVariant } from '../Input.types';
|
|
4
|
+
import { OutlinedTextFieldSlim } from './text-field-slim-outlined';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The house variants MUI draws as `outlined`: `muiVariantFor` maps `glass` and
|
|
8
|
+
* `gradient` onto an outline (`Input.metrics.ts`). `filled` and `underline`
|
|
9
|
+
* need the inputs this entry exists to leave out, so they are a type error here
|
|
10
|
+
* rather than a silent fallback.
|
|
11
|
+
*/
|
|
12
|
+
export type OutlinedInputVariant = Extract<InputVariant, 'outlined' | 'glass' | 'gradient'>;
|
|
13
|
+
|
|
14
|
+
export type InputProps = Omit<GenericInputProps, 'variant'> & { variant?: OutlinedInputVariant };
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* `@12-apps/ui/form/Input/outlined` — the same `Input`, with the same props,
|
|
18
|
+
* styles and DOM, built on a field that imports `OutlinedInput` and no other
|
|
19
|
+
* MUI input (FUT-1054). For a control that only ever renders the outlined
|
|
20
|
+
* family and sits where its bytes matter: a storefront header, a first screen.
|
|
21
|
+
*
|
|
22
|
+
* Not re-exported from `form/Input` or the `form` barrel: a second `Input`
|
|
23
|
+
* there would collide. Reach it only through this subpath.
|
|
24
|
+
*/
|
|
25
|
+
export const Input = createInput(OutlinedTextFieldSlim) as InputComponent<InputProps>;
|
|
26
|
+
|
|
27
|
+
export type { InputSize } from '../Input.types';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import OutlinedInput from '@mui/material/OutlinedInput/index.js';
|
|
2
|
+
|
|
3
|
+
import { createTextFieldSlim } from '../text-field-slim.factory';
|
|
4
|
+
import type { TextFieldSlimComponent } from '../text-field-slim.factory';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* `TextFieldSlim` pinned to MUI's outlined input (FUT-1054). The generic field
|
|
8
|
+
* picks its input from a three-way table at runtime, so a bundler has to keep
|
|
9
|
+
* `FilledInput` and `Input` for every caller; this one imports `OutlinedInput`
|
|
10
|
+
* alone. Every variant it can be asked for renders outlined, which is what the
|
|
11
|
+
* outlined `Input` entry ever asks for.
|
|
12
|
+
*/
|
|
13
|
+
export const OutlinedTextFieldSlim: TextFieldSlimComponent = createTextFieldSlim(() => OutlinedInput);
|