@astryx-vue/core 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/index.js +1 -1
- package/dist/{AlertDialog-RAVA_cT1.js → AlertDialog-C2inDZWG.js} +5 -5
- package/dist/AppShell/index.d.ts +1 -1
- package/dist/AppShell/index.js +1 -1
- package/dist/{AppShell-0wTvOo3H.js → AppShell-awAKicsc.js} +3 -3
- package/dist/Avatar/index.js +1 -1
- package/dist/{Avatar-pPZ4dI_s.js → Avatar-DXBjJ88C.js} +47 -34
- package/dist/AvatarGroup/index.d.ts +1 -1
- package/dist/AvatarGroup/index.js +1 -1
- package/dist/{AvatarGroup-B--NQSB3.js → AvatarGroup-kpAeKLNq.js} +57 -13
- package/dist/Banner/index.d.ts +1 -1
- package/dist/Banner/index.js +1 -1
- package/dist/{Banner-GbGxrqQO.js → Banner-BdvuyzAe.js} +71 -35
- package/dist/Blockquote/index.js +1 -1
- package/dist/Blockquote-DRoKdcxZ.js +27 -0
- package/dist/BottomSheet/index.d.ts +1 -1
- package/dist/BottomSheet/index.js +2 -2
- package/dist/{BottomSheet-pt7m4CvC.js → BottomSheet-B4sc3F1S.js} +286 -140
- package/dist/{BottomSheet-JYMB_Ofl.js → BottomSheet-m54uCMJN.js} +20 -4
- package/dist/Breadcrumbs/index.d.ts +2 -2
- package/dist/Breadcrumbs/index.js +2 -2
- package/dist/Breadcrumbs-D4ZzHEB0.js +223 -0
- package/dist/Button/index.d.ts +1 -1
- package/dist/Button/index.js +1 -1
- package/dist/{Button-B6Hj_O_s.js → Button-ONOoHdkg.js} +25 -15
- package/dist/ButtonGroup/index.d.ts +1 -1
- package/dist/ButtonGroup/index.js +1 -1
- package/dist/ButtonGroup-DnkSZ9a5.js +87 -0
- package/dist/{ButtonTooltip-nWWrth8j.js → ButtonTooltip-CNKOQHYR.js} +7 -4
- package/dist/Calendar/index.d.ts +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/{Calendar-B7vIowKq.js → Calendar-CjK-JUDM.js} +5 -5
- package/dist/Card/index.d.ts +2 -2
- package/dist/Carousel/index.js +1 -1
- package/dist/{Carousel-CA8zpD9v.js → Carousel-D262qigj.js} +8 -8
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/{Chat-Bmna9EOA.js → Chat-DD_mlIP3.js} +165 -101
- package/dist/CheckboxIndicator/index.js +1 -1
- package/dist/{CheckboxIndicator-D37cm2Rh.js → CheckboxIndicator-fH4d-JE1.js} +9 -3
- package/dist/CheckboxInput/index.d.ts +1 -1
- package/dist/CheckboxInput/index.js +1 -1
- package/dist/{CheckboxInput-BS9J6edf.js → CheckboxInput-D8vTmAMZ.js} +20 -12
- package/dist/CheckboxList/index.d.ts +1 -1
- package/dist/CheckboxList/index.js +1 -1
- package/dist/{CheckboxList-CX1i_jVP.js → CheckboxList-DCvHewHB.js} +155 -38
- package/dist/Citation/index.js +1 -1
- package/dist/{Citation-Djgwa0ko.js → Citation-C69BgxW3.js} +8 -3
- package/dist/ClickableCard/index.d.ts +1 -1
- package/dist/ClickableCard/index.js +1 -1
- package/dist/{ClickableCard-DUsC-j03.js → ClickableCard-ChAfiw9T.js} +9 -6
- package/dist/Code/index.d.ts +1 -1
- package/dist/Code/index.js +3 -3
- package/dist/{Code-XnPuGxey.js → Code-Bg7GBdxy.js} +2 -1
- package/dist/{CodeBlock-D0BFubut.js → CodeBlock-DsbwTBiT.js} +8 -8
- package/dist/Collapsible/index.d.ts +1 -1
- package/dist/Collapsible/index.js +1 -1
- package/dist/{Collapsible-Cov3Pyq5.js → Collapsible-Bdj0WYpb.js} +13 -11
- package/dist/CommandPalette/index.d.ts +1 -1
- package/dist/CommandPalette/index.js +1 -1
- package/dist/{CommandPalette-YHsUNg3V.js → CommandPalette-CZ7CZglZ.js} +147 -67
- package/dist/ComplexSelector/index.d.ts +1 -1
- package/dist/ComplexSelector/index.js +1 -1
- package/dist/{ComplexSelector-DWLdKPGI.js → ComplexSelector-CIz6DDmY.js} +114 -28
- package/dist/ContextMenu/index.d.ts +2 -2
- package/dist/ContextMenu/index.js +2 -2
- package/dist/{ContextMenu-Bq9b3Ti5.js → ContextMenu-CxoiRh_h.js} +297 -179
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.js +1 -1
- package/dist/{DateInput-DT518j5E.js → DateInput-C67HCOU-.js} +563 -72
- package/dist/DateRangeInput/index.d.ts +1 -1
- package/dist/DateRangeInput/index.js +1 -1
- package/dist/{DateRangeInput-Bqi5tlIA.js → DateRangeInput-Dsf5Tyf-.js} +91 -26
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.js +1 -1
- package/dist/DateTimeInput-tfM1y5nZ.js +562 -0
- package/dist/Dialog/index.d.ts +1 -1
- package/dist/Dialog/index.js +2 -2
- package/dist/{Dialog-BiOSKQso.js → Dialog-DT1GzCrB.js} +28 -11
- package/dist/{Dialog-FGHfDu5M.js → Dialog-fhyxB00e.js} +32 -5
- package/dist/Divider/index.d.ts +1 -1
- package/dist/Divider/index.js +1 -1
- package/dist/{Divider-BtwnL18I.js → Divider-mOZ6vIQw.js} +5 -1
- package/dist/DropdownMenu/index.d.ts +2 -2
- package/dist/DropdownMenu/index.js +3 -3
- package/dist/{DropdownMenu-CoOQVlRp.js → DropdownMenu-C6wBC18g.js} +84 -56
- package/dist/{DropdownMenu-DEb2dSSP.js → DropdownMenu-G-pWSiBk.js} +479 -264
- package/dist/{DropdownMenuRadioItem.vue-CXEURBcq.d.ts → DropdownMenuRadioItem.vue-Qd-8Rg4Q.d.ts} +236 -230
- package/dist/EmptyState/index.js +1 -1
- package/dist/{EmptyState-C_GH7IV5.js → EmptyState-CmOQf2SH.js} +2 -2
- package/dist/Field/index.d.ts +4 -3
- package/dist/Field/index.js +4 -3
- package/dist/{Field-D5gUEGw4.js → Field-JIxT3xCh.js} +5 -4
- package/dist/FieldIcon-BFSHZEs_.js +40 -0
- package/dist/{FieldInfoTip-Ds-sW_jY.js → FieldInfoTip-BbgLt4ug.js} +4 -4
- package/dist/{FieldLabel-BNeXRuGH.js → FieldLabel-CHqp1y3z.js} +13 -8
- package/dist/FieldStatus/index.d.ts +1 -1
- package/dist/FieldStatus/index.js +1 -1
- package/dist/{FieldStatus-MjY19ERl.js → FieldStatus-DaAB3TIt.js} +1 -1
- package/dist/FileInput/index.d.ts +1 -1
- package/dist/FileInput/index.js +1 -1
- package/dist/{FileInput-BpdiO1V8.js → FileInput-Bi1uty-F.js} +108 -31
- package/dist/FormLayout/index.d.ts +1 -1
- package/dist/FormLayout/index.js +1 -1
- package/dist/{FormLayout-D47FjiOq.js → FormLayout-B9dUB6Ps.js} +1 -1
- package/dist/Heading/index.d.ts +1 -1
- package/dist/Heading/index.js +1 -1
- package/dist/{Heading-BnwWEWkp.js → Heading-BzBunfN7.js} +1 -1
- package/dist/HoverCard/index.js +1 -1
- package/dist/{HoverCard-ycY50pRN.js → HoverCard-BpJhT0sn.js} +35 -22
- package/dist/Icon/index.d.ts +4 -4
- package/dist/Icon/index.js +1 -1
- package/dist/{Icon-bteSId7T.js → Icon-KDnUyY7f.js} +12 -20
- package/dist/IconButton/index.js +1 -1
- package/dist/{IconButton-DDNgNl7B.js → IconButton-DI-XBbtV.js} +1 -1
- package/dist/Indicator/index.d.ts +2 -2
- package/dist/Indicator/index.js +2 -1
- package/dist/InputClearButton-CfSIqc-V.js +40 -0
- package/dist/InputGroup/index.d.ts +1 -1
- package/dist/InputGroup/index.js +2 -2
- package/dist/{InputGroup-CA03Smrs.js → InputGroup-D3F-QnET.js} +2 -2
- package/dist/InternationalizationProvider/index.d.ts +1 -1
- package/dist/InternationalizationProvider/index.js +1 -1
- package/dist/{InternationalizationProvider-DJay_w3B.js → InternationalizationProvider-CVV5QDgp.js} +5 -9
- package/dist/{Item-KhFKX9St.js → Item-DWMIjN8n.js} +34 -9
- package/dist/Kbd/index.js +1 -1
- package/dist/{Kbd-BB-Dw6zE.js → Kbd-CV3LO2Ge.js} +18 -2
- package/dist/LayerContentBoundary-CvsKxwwm.js +27 -0
- package/dist/LayerProvider/index.js +1 -1
- package/dist/{LayerProvider-D9NsQFzL.js → LayerProvider-B6zpMBWC.js} +15 -3
- package/dist/Layout/index.d.ts +1 -1
- package/dist/Layout/index.js +2 -2
- package/dist/{Layout-C6RHllr-.js → Layout-JJRCG7Mf.js} +1 -1
- package/dist/{LayoutPanel-DXOsaeQb.js → LayoutPanel-zM5vjrKS.js} +12 -8
- package/dist/Lightbox/index.js +1 -1
- package/dist/{Lightbox-DTF9EdTG.js → Lightbox-CjXhbDPc.js} +14 -12
- package/dist/Link/index.js +1 -1
- package/dist/{Link-BqHCtiyt.js → Link-ClNkTN1Q.js} +29 -12
- package/dist/List/index.d.ts +1 -1
- package/dist/List/index.js +2 -2
- package/dist/{ListItem-8RWT8XAG.js → ListItem-BQXMu1Tb.js} +1 -1
- package/dist/Markdown/index.d.ts +5 -2
- package/dist/Markdown/index.js +4 -2
- package/dist/Markdown/parser/index.d.ts +4 -0
- package/dist/Markdown/parser/index.js +2 -0
- package/dist/Markdown/plugin-protocol/index.d.ts +35 -0
- package/dist/Markdown/plugin-protocol/index.js +107 -0
- package/dist/Markdown/plugin-renderer/index.d.ts +31 -0
- package/dist/Markdown/plugin-renderer/index.js +42 -0
- package/dist/{Markdown-CvtN7HnF.js → Markdown-EIBrwQrb.js} +195 -524
- package/dist/MediaTheme-DlLqYhDy.js +433 -0
- package/dist/MetadataList/index.js +1 -1
- package/dist/{MetadataList-B-OelQlt.js → MetadataList-DLlSLX1n.js} +15 -7
- package/dist/MobileNav/index.js +1 -1
- package/dist/{MobileNavToggle-DxGz0xKA.js → MobileNavToggle-DgJYyzT6.js} +52 -17
- package/dist/MoreMenu/index.d.ts +1 -1
- package/dist/MoreMenu/index.js +1 -1
- package/dist/{MoreMenu-Dlb7MLlW.js → MoreMenu-C8BEt6-O.js} +74 -61
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.js +1 -1
- package/dist/MultiSelector-C7NCAtwW.js +1456 -0
- package/dist/{NavDisclosure-C_fugrQ3.js → NavDisclosure-Bq9DTZLO.js} +29 -7
- package/dist/{NavHeadingSurface-B3yJspSN.js → NavHeadingSurface-DQXisuaX.js} +29 -26
- package/dist/NavItem/index.d.ts +1 -1
- package/dist/NavItem/index.js +2 -2
- package/dist/{NavItem-BBIGSvDj.js → NavItem-BPb3yfgz.js} +17 -4
- package/dist/NavMenu/index.d.ts +1 -1
- package/dist/NavMenu/index.js +3 -3
- package/dist/{NavMenu-ThXguZAz.js → NavMenu-BYIDzjix.js} +42 -15
- package/dist/{NavMenuItem-BvJNsDFC.js → NavMenuItem-D3FO90GR.js} +14 -12
- package/dist/NumberInput/index.d.ts +1 -1
- package/dist/NumberInput/index.js +1 -1
- package/dist/NumberInput-3u3NZWnv.js +727 -0
- package/dist/Outline/index.d.ts +2 -2
- package/dist/Outline/index.js +2 -2
- package/dist/{Outline-755h-lMP.js → Outline-8szj9eXu.js} +91 -6
- package/dist/OverflowList/index.d.ts +2 -2
- package/dist/OverflowList/index.js +1 -1
- package/dist/{OverflowList-NmrSMbxb.js → OverflowList-BizpEwH8.js} +23 -6
- package/dist/Pagination/index.d.ts +1 -1
- package/dist/Pagination/index.js +1 -1
- package/dist/{Pagination-DqwNQFRp.js → Pagination-Cihr1CjD.js} +2 -2
- package/dist/PickerWheel-CSwUYfes.js +69 -0
- package/dist/Popover/index.d.ts +1 -1
- package/dist/Popover/index.js +1 -1
- package/dist/{Popover-DJf8POzL.js → Popover-78dFjTb9.js} +20 -15
- package/dist/PowerSearch/index.d.ts +1 -1
- package/dist/PowerSearch/index.js +1 -1
- package/dist/{PowerSearch-DvjiPqMZ.js → PowerSearch-BHx91ypY.js} +778 -590
- package/dist/ProgressBar/index.d.ts +1 -1
- package/dist/ProgressBar/index.js +1 -1
- package/dist/{ProgressBar-CVLzdoBK.js → ProgressBar-VP4JS7vm.js} +10 -7
- package/dist/Radio/index.d.ts +1 -1
- package/dist/Radio/index.js +1 -1
- package/dist/{RadioGroup-Bfu6JSNV.js → RadioGroup-DeSIRrgt.js} +94 -26
- package/dist/RadioList/index.d.ts +1 -1
- package/dist/RadioList/index.js +1 -1
- package/dist/{RadioList-xY1cwLdZ.js → RadioList-Co2lmetC.js} +57 -8
- package/dist/Resizable/index.d.ts +1 -1
- package/dist/Resizable/index.js +1 -1
- package/dist/{ResizeHandle-q4nD_586.js → ResizeHandle-DjLZ2pcq.js} +103 -50
- package/dist/ScrollableArea/index.d.ts +1 -1
- package/dist/ScrollableArea/index.js +1 -1
- package/dist/{ScrollableArea-D4dCJv9I.js → ScrollableArea-0u6RWtGG.js} +1 -1
- package/dist/SegmentedControl/index.d.ts +1 -1
- package/dist/SegmentedControl/index.js +1 -1
- package/dist/{SegmentedControl-ChHmFrrC.js → SegmentedControl-D1wWGBZo.js} +11 -5
- package/dist/SelectableCard/index.d.ts +1 -1
- package/dist/SelectableCard/index.js +1 -1
- package/dist/{SelectableCard-Cku4dRzc.js → SelectableCard-BEqnhPaX.js} +16 -11
- package/dist/Selector/index.d.ts +1 -1
- package/dist/Selector/index.js +1 -1
- package/dist/Selector-swa3RNQI.js +1049 -0
- package/dist/SideNav/index.d.ts +1 -1
- package/dist/SideNav/index.js +1 -1
- package/dist/{SideNav-BF8mYDxl.js → SideNav-BH6XKsW2.js} +56 -42
- package/dist/Slider/index.d.ts +1 -1
- package/dist/Slider/index.js +1 -1
- package/dist/{Slider-DWobsPgm.js → Slider-DG2YXll8.js} +172 -46
- package/dist/Spinner/index.js +1 -1
- package/dist/Spinner-BY8iQz--.js +200 -0
- package/dist/Stack/index.js +2 -2
- package/dist/{Stack-CTsTFfar.js → Stack-Bb_h60t3.js} +1 -1
- package/dist/{Stack-kQlYbbL4.js → Stack-Bp-XN9J4.js} +12 -7
- package/dist/StatusDot/index.d.ts +1 -1
- package/dist/StatusDot/index.js +1 -1
- package/dist/{StatusDot-BPUhMOff.js → StatusDot-BS_ohXhd.js} +8 -4
- package/dist/Stepper/index.d.ts +1 -1
- package/dist/Stepper/index.js +1 -1
- package/dist/{Stepper-CE8dHysu.js → Stepper-FtkTq5qR.js} +127 -113
- package/dist/Switch/index.d.ts +1 -1
- package/dist/Switch/index.js +1 -1
- package/dist/{Switch-DaVPRxvN.js → Switch-0JKvJluV.js} +38 -22
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.js +1 -1
- package/dist/{TabList-DIkK9sgK.js → TabList-cpjvnbhx.js} +205 -63
- package/dist/Table/index.d.ts +3 -3
- package/dist/Table/index.js +1 -1
- package/dist/{Table-fecqnm7P.js → Table-fWs_ZQBF.js} +735 -461
- package/dist/Text/index.d.ts +1 -1
- package/dist/Text/index.js +1 -1
- package/dist/{Text-CV3LmscH.js → Text-CmTOgYXf.js} +1 -1
- package/dist/TextArea/index.d.ts +1 -1
- package/dist/TextArea/index.js +1 -1
- package/dist/{TextArea-Ab5Sw60T.js → TextArea-CwSfEjT1.js} +110 -50
- package/dist/TextInput/index.d.ts +1 -1
- package/dist/TextInput/index.js +1 -1
- package/dist/{TextInput-zFT1_qgI.js → TextInput-CavITage.js} +71 -38
- package/dist/Theme/index.d.ts +3 -3
- package/dist/Theme/index.js +3 -2
- package/dist/Theme-BbDT8B_C.js +2125 -0
- package/dist/Thumbnail/index.js +1 -1
- package/dist/{Thumbnail-C3NnJUFG.js → Thumbnail-DpJnaNbg.js} +17 -14
- package/dist/{TimeField-CoHDGmsP.js → TimeField-DefNjDIT.js} +297 -40
- package/dist/TimeInput/index.d.ts +1 -1
- package/dist/TimeInput/index.js +1 -1
- package/dist/{TimeInput-D2k3Ux3p.js → TimeInput-j5vzN8MG.js} +78 -9
- package/dist/Timer/index.js +1 -1
- package/dist/{Timer-avMQk5DN.js → Timer-CH7GsEVu.js} +1 -1
- package/dist/Timestamp/index.d.ts +1 -1
- package/dist/Timestamp/index.js +1 -1
- package/dist/{Timestamp-xpQKCk0d.js → Timestamp-dtT4yADD.js} +9 -9
- package/dist/Toast/index.d.ts +1 -1
- package/dist/Toast/index.js +1 -1
- package/dist/Toast-igtJYSw0.js +685 -0
- package/dist/ToggleButton/index.d.ts +1 -1
- package/dist/ToggleButton/index.js +1 -1
- package/dist/{ToggleButton-B-C-Q7XP.js → ToggleButton-cLjh9W-x.js} +5 -4
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.js +1 -1
- package/dist/{Token-DsntTYhQ.js → Token-DhsAtAH6.js} +32 -17
- package/dist/Tokenizer/index.d.ts +1 -1
- package/dist/Tokenizer/index.js +1 -1
- package/dist/{Tokenizer-B5C_qY7t.js → Tokenizer-BGdj78UK.js} +107 -23
- package/dist/Toolbar/index.d.ts +2 -2
- package/dist/Toolbar/index.js +1 -1
- package/dist/{Toolbar-BrgvvTCk.js → Toolbar-C0pMWL4S.js} +1 -1
- package/dist/Tooltip/index.d.ts +1 -1
- package/dist/Tooltip/index.js +1 -1
- package/dist/{Tooltip-C4Vaqd3G.js → Tooltip-sAM8i1eO.js} +23 -19
- package/dist/TopNav/index.d.ts +1 -1
- package/dist/TopNav/index.js +1 -1
- package/dist/{TopNav-Ciq0l1w7.js → TopNav-Dw0m387B.js} +23 -22
- package/dist/TreeList/index.d.ts +1 -1
- package/dist/TreeList/index.js +1 -1
- package/dist/{TreeList-BUz-KZJd.js → TreeList-Bunn7u3T.js} +129 -46
- package/dist/Typeahead/index.d.ts +1 -1
- package/dist/Typeahead/index.js +2 -2
- package/dist/{Typeahead-JP9RT87x.js → Typeahead-DRyf2HEh.js} +123 -26
- package/dist/{TypeaheadMenu-DBW6rHeO.js → TypeaheadMenu-BY5__sPC.js} +141 -51
- package/dist/{announce-Cnio10Wk.js → announce-B210eJVf.js} +17 -2
- package/dist/characters-rcDbGt71.d.ts +29 -0
- package/dist/characters-wTnzjkkR.js +58 -0
- package/dist/{colorMode-CBgdgDSn.js → colorMode-BxqfDP4P.js} +1 -4
- package/dist/composables/index.d.ts +5 -4
- package/dist/composables/index.js +23 -18
- package/dist/{composables-CbKx9C1Y.js → composables-CnsDaMuU.js} +167 -197
- package/dist/context-B6UElI5X.js +5 -0
- package/dist/context-CM-cjGg_.js +1425 -0
- package/dist/{context-Cfjh8te1.js → context-Cfml4jaK.js} +5 -3
- package/dist/context-IvbU9c3T.js +8 -0
- package/dist/context-pjBxaMSh.js +28 -0
- package/dist/fieldParts--SyRZVQG.js +44 -0
- package/dist/fieldParts-LXpQMKE8.d.ts +27 -0
- package/dist/{focus-CpficIgf.js → focus-l8jVTcqd.js} +1 -1
- package/dist/hoverIntent-DMHGb85c.js +115 -0
- package/dist/{index-ClNU2Th8.d.ts → index-3t5RAfNP.d.ts} +6 -2
- package/dist/{index-B9e52paP.d.ts → index-5LVG3QyV.d.ts} +1 -1
- package/dist/{index-CsNi1I8j.d.ts → index-B08-Uxhv.d.ts} +4 -2
- package/dist/{index-TXcNH86P.d.ts → index-B1eCxBCY.d.ts} +1 -1
- package/dist/{index-Cn-sSds-.d.ts → index-B1t1oQWH.d.ts} +24 -1
- package/dist/{index-BkjSF265.d.ts → index-BEZ4ezJk.d.ts} +3 -3
- package/dist/{index-yT1yiiww.d.ts → index-BI6jikpA.d.ts} +23 -11
- package/dist/{index-DeQwYJbg.d.ts → index-BNaRK-s5.d.ts} +10 -1
- package/dist/{index-D97pQbua.d.ts → index-BV2D2x_u.d.ts} +1 -1
- package/dist/{index-Crp3NFLW.d.ts → index-BZKgbyN9.d.ts} +1 -1
- package/dist/{index-Bu8NA2SD.d.ts → index-BaxM-pFP.d.ts} +12 -3
- package/dist/{index-BVKivP59.d.ts → index-Bgk1Rj2A.d.ts} +32 -3
- package/dist/index-BkUkm6Al.d.ts +11 -0
- package/dist/index-Bo-ofFyg.d.ts +166 -0
- package/dist/{index-B1WJxt-n.d.ts → index-C-tFz2Yx.d.ts} +17 -7
- package/dist/{index-DWh2WC8W.d.ts → index-C4Cjz6OK.d.ts} +2 -2
- package/dist/{index-CqE4Bf3Q.d.ts → index-C732aNMY.d.ts} +18 -4
- package/dist/{index-B7yhzGUT.d.ts → index-C7sam-SB.d.ts} +2 -2
- package/dist/{index-BrJzFA5X.d.ts → index-C90l2rH1.d.ts} +1 -1
- package/dist/{index-vP0EtrJJ.d.ts → index-C9gAlDt_.d.ts} +6 -3
- package/dist/index-CKUfpmFL.d.ts +375 -0
- package/dist/{index-CL1T2j4y.d.ts → index-CL8JvxHW.d.ts} +3 -3
- package/dist/{index-IBAInumL.d.ts → index-CMme-xmL.d.ts} +19 -6
- package/dist/{index-gW0HW02U.d.ts → index-COxy6LEW.d.ts} +1 -1
- package/dist/{index-12QYAbiz.d.ts → index-CRrSHbok.d.ts} +3 -2
- package/dist/{index-B42oE_F-.d.ts → index-CT5OEUxd.d.ts} +17 -4
- package/dist/{index-DG52Bg0W.d.ts → index-CTf3SK0b.d.ts} +6 -0
- package/dist/{index-Cde5JvtX.d.ts → index-CUVmtB5-.d.ts} +13 -6
- package/dist/{index-DXpSFlPG.d.ts → index-CWaSYtk9.d.ts} +4 -4
- package/dist/{index-CVn0GBdB.d.ts → index-Ca8VIE4l.d.ts} +1 -1
- package/dist/{index-Cyb9Du5Z.d.ts → index-CfR2Z0uG.d.ts} +1 -1
- package/dist/{index-Byar3h1e.d.ts → index-D05JGsT3.d.ts} +6 -3
- package/dist/{index-hCpxKePE.d.ts → index-D5N9ikrS.d.ts} +1 -1
- package/dist/{index-CkKPMIeX.d.ts → index-D7XRtUTY.d.ts} +9 -0
- package/dist/{index-i0tNFWfz.d.ts → index-D8lv2BiD.d.ts} +3 -1
- package/dist/{index-TntQsADQ.d.ts → index-DEm3kRBO.d.ts} +4 -3
- package/dist/{index-0QGtSf3r.d.ts → index-DFLPv9io.d.ts} +4 -3
- package/dist/{index-C2nbK2AA.d.ts → index-DLAG3m9W.d.ts} +13 -3
- package/dist/{index-D41_xqjs.d.ts → index-DTuhnqHb.d.ts} +16 -9
- package/dist/{index-B3Fomy15.d.ts → index-DbiZvj1P.d.ts} +4 -4
- package/dist/{index-C5e-7Obr.d.ts → index-Dj1_1t3j.d.ts} +19 -6
- package/dist/{index-DIXAzTKL.d.ts → index-DxxudRgB.d.ts} +1 -1
- package/dist/{index-BhpAUzUr.d.ts → index-Dy746dfn.d.ts} +1 -1
- package/dist/{index-GI9xIV9l.d.ts → index-JL4auphT.d.ts} +2 -2
- package/dist/{index-DVmgNb78.d.ts → index-TA1zVibb.d.ts} +4 -4
- package/dist/{index-DUaLJO7l.d.ts → index-UA93Im7H.d.ts} +155 -109
- package/dist/{index-COgrQZIL.d.ts → index-YKCx03zD.d.ts} +2 -2
- package/dist/{index-XuAAcYiP.d.ts → index-f3d9cVtj.d.ts} +1 -1
- package/dist/{index-T2FOcOuI.d.ts → index-jOwU3YoR.d.ts} +400 -90
- package/dist/{index-CICeEoZV.d.ts → index-pNtfr-RW.d.ts} +1 -1
- package/dist/{index-B4OOtNP8.d.ts → index-pYh4gqgl.d.ts} +1 -1
- package/dist/index.d.ts +81 -75
- package/dist/index.js +150 -136
- package/dist/inlineSize-BNe8wggI.js +66 -0
- package/dist/inputPresentation-BOyHkCDr.js +62 -0
- package/dist/interactionModality-ACpTMhak.js +44 -0
- package/dist/isApplePlatform-B1ju6F5B.js +27 -0
- package/dist/isRenderable-BnKHIqfd.js +21 -0
- package/dist/layerDepth-CNDh-IHb.js +181 -0
- package/dist/link-DuuA2eCL.js +30 -0
- package/dist/loadCatalog-CsZFr9dg.js +424 -0
- package/dist/loadCatalog-opk5hs94.d.ts +803 -0
- package/dist/locale/index.d.ts +2 -2
- package/dist/locale/index.js +4 -3
- package/dist/locale-D1Z3K290.js +343 -0
- package/dist/modalOutlet-CUOcrhIu.js +56 -0
- package/dist/optionAction-Cg7xQLUA.d.ts +6 -0
- package/dist/{power-search-DrDfcoL1.d.ts → power-search-gHLIYXs5.d.ts} +2 -0
- package/dist/protocol-DHxY0NI8.js +113 -0
- package/dist/protocol-DwUmpC5G.d.ts +240 -0
- package/dist/publicParser-B6XMcsB2.d.ts +141 -0
- package/dist/publicParser-DWUMCx7j.js +1437 -0
- package/dist/resizableChannel-3vivrEcT.js +20 -0
- package/dist/safeUrl-CsvfcZ9m.js +54 -0
- package/dist/scopedProvide-C-Df7c15.js +30 -0
- package/dist/scrollKeyboardDelegation-D7cumnOl.js +238 -0
- package/dist/scrollLock-C3aT4-0z.js +102 -0
- package/dist/{searchResultMessage-hXXNOFJP.js → searchResultMessage-DtyScdZs.js} +5 -14
- package/dist/{semantic-CKH9XVqa.d.ts → semantic-BF_AjLvk.d.ts} +6 -3
- package/dist/slug-DAK6hdbr.js +17 -0
- package/dist/syntaxContext-DmIfNNtb.js +4 -0
- package/dist/triggerVariant-BsL8jMHs.js +16 -0
- package/dist/{types-0Q_SJv_F.d.ts → types-Bb7OGivY.d.ts} +6 -1
- package/dist/{types-CwyibrRB.d.ts → types-C5GQ2KCK.d.ts} +23 -3
- package/dist/{types-gKsEkk2g.d.ts → types-CsqwQkf1.d.ts} +143 -10
- package/dist/upstreamMap-ocuIRfI2.js +893 -0
- package/dist/{useAnchoredListbox-DwztMNjP.js → useAnchoredListbox-DGxxKHZb.js} +2 -2
- package/dist/{useAsyncSource-xpQovjV_.d.ts → useAsyncSource-aGzrvRkI.d.ts} +3 -0
- package/dist/{useClickableContainer-DyNpnSEa.js → useClickableContainer-CdGp_Cev.js} +1 -1
- package/dist/{useClipboard-BDfbEsWd.js → useClipboard-Dk8cS810.js} +1 -1
- package/dist/useHoverLayerDismiss-kYJ_NqL4.js +27 -0
- package/dist/{useIndicator-i1NORM7W.js → useIndicator-D9Y0dJsm.js} +5 -23
- package/dist/{useInputContainer-CpgDe2-4.js → useInputContainer-CLcYrby4.js} +1 -1
- package/dist/{useInputStatusIcon-DBOwxV4x.js → useInputStatusIcon-CWkCeMyX.js} +2 -2
- package/dist/useLayerMountTarget-BmZyeKWE.js +156 -0
- package/dist/{useListFocus-D0iOJl39.js → useListFocus-ChxLg0b4.js} +3 -2
- package/dist/{useMenuDrillIn-DzKGkTho.js → useMenuDrillIn-DhUnPvKs.js} +6 -5
- package/dist/useMenuHover-Djreu23i.js +170 -0
- package/dist/useMenuPress-8foxY8z4.js +764 -0
- package/dist/{useMergedRefs-CfHHlCsn.js → useMergedRefs-Cb6_w93m.js} +24 -4
- package/dist/{useNumberField-4-dIGVed.js → useNumberField-Dk1BE3-K.js} +3 -3
- package/dist/useOptionActionGrid-CkJcuvaU.js +97 -0
- package/dist/{usePositionedLayer-Cru9_00b.js → usePositionedLayer-B7cvG-_v.js} +43 -49
- package/dist/usePressFeedback-BJCpjEpv.js +319 -0
- package/dist/{useResizable-DDwPpPe6.d.ts → useResizable-1MHPNaRD.d.ts} +19 -1
- package/dist/{useResizable-B3ahKLoZ.js → useResizable-I3BCiLSL.js} +72 -40
- package/dist/useResolvedLabelHidden-B2rlWiaI.js +30 -0
- package/dist/{useRestoreFocus-Djw9RUIf.js → useRestoreFocus-XEKs5-gp.js} +49 -7
- package/dist/useScrollOverflow-DuMoGXmm.js +67 -0
- package/dist/useScrollableArea-BE8b3qm7.js +222 -0
- package/dist/{useTimeValue-6ufHM15W.js → useTimeValue-BJd0xBhG.js} +4 -22
- package/dist/useTranslator-PEXMxDpv.js +35 -0
- package/dist/{useTypeahead-PAK8lMYz.js → useTypeahead-BvtflkRk.js} +4 -5
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +5 -0
- package/dist/{utils-D33VQDnk.js → utils-ClVseK2w.js} +29 -2
- package/dist/utils-z3Q6BGIJ.js +819 -0
- package/locales/SOURCE.json +1 -1
- package/package.json +18 -2
- package/reset.css +364 -1
- package/styles/avatar-group.css +9 -1
- package/styles/badge.css +8 -5
- package/styles/banner.css +125 -26
- package/styles/blockquote.css +1 -0
- package/styles/bordered-control.css +1 -1
- package/styles/bottom-sheet.css +74 -6
- package/styles/breadcrumbs.css +16 -2
- package/styles/button-group.css +3 -1
- package/styles/button.css +53 -11
- package/styles/card.css +1 -1
- package/styles/chat.css +16 -6
- package/styles/checkbox-input.css +10 -0
- package/styles/clickable-card.css +10 -3
- package/styles/collapsible.css +12 -5
- package/styles/command-palette.css +29 -14
- package/styles/complex-selector.css +24 -5
- package/styles/context-menu.css +3 -3
- package/styles/date-input.css +111 -1
- package/styles/dialog-header.css +4 -1
- package/styles/dialog.css +7 -0
- package/styles/dropdown-menu.css +12 -3
- package/styles/field.css +5 -0
- package/styles/form-layout.css +1 -0
- package/styles/heading.css +18 -8
- package/styles/icon.css +9 -9
- package/styles/kbd.css +1 -1
- package/styles/layer.css +72 -0
- package/styles/list.css +9 -2
- package/styles/metadata-list.css +1 -0
- package/styles/mobile-nav.css +4 -1
- package/styles/multi-selector.css +48 -1
- package/styles/nav-item.css +9 -2
- package/styles/nav-menu.css +12 -2
- package/styles/number-input.css +9 -1
- package/styles/overflow-list.css +1 -1
- package/styles/popover.css +2 -1
- package/styles/power-search.css +5 -3
- package/styles/pressable.css +63 -22
- package/styles/progress-bar.css +15 -3
- package/styles/radio.css +16 -0
- package/styles/resize-handle.css +42 -0
- package/styles/segmented-control.css +12 -4
- package/styles/selector.css +53 -1
- package/styles/side-nav.css +19 -0
- package/styles/slider.css +4 -3
- package/styles/spinner.css +48 -42
- package/styles/stepper.css +58 -4
- package/styles/switch.css +26 -0
- package/styles/tab-list.css +132 -3
- package/styles/table.css +88 -11
- package/styles/text-area.css +7 -1
- package/styles/text-input.css +1 -1
- package/styles/text.css +6 -6
- package/styles/thumbnail.css +11 -3
- package/styles/time-input.css +8 -0
- package/styles/toast.css +37 -3
- package/styles/token.css +2 -2
- package/styles/tokenizer.css +1 -1
- package/styles/toolbar.css +4 -1
- package/styles/tree-list.css +1 -1
- package/styles/typeahead.css +34 -1
- package/styles.css +1 -0
- package/dist/Blockquote-DFqBv_oJ.js +0 -18
- package/dist/Breadcrumbs-DIm4figq.js +0 -141
- package/dist/ButtonGroup-ySQWanDP.js +0 -125
- package/dist/DateTimeInput-A7m2O3bg.js +0 -268
- package/dist/FieldIcon--NTgW5IU.js +0 -44
- package/dist/MultiSelector-BtAUfQ3t.js +0 -990
- package/dist/NumberInput-AZ9x3oja.js +0 -473
- package/dist/Selector-DJ2BhUTV.js +0 -677
- package/dist/Spinner-9cYUCnDy.js +0 -84
- package/dist/Theme-CtaUWo4g.js +0 -1246
- package/dist/Toast-BuqIZV5z.js +0 -322
- package/dist/context-4PuqD1Ic.js +0 -4
- package/dist/context-D5-MwxnN.js +0 -4
- package/dist/context-iABt_ueM.js +0 -976
- package/dist/index-BH9PzQ1F.d.ts +0 -87
- package/dist/link-C4_WogdF.js +0 -18
- package/dist/loadCatalog-BGHKG_9N.d.ts +0 -457
- package/dist/loadCatalog-CXKqEB9s.js +0 -877
- package/dist/locale-DgkZEMTn.js +0 -105
- package/dist/platform-B_9W_aHW.js +0 -33
- package/dist/scrollLock-BzIvIimL.js +0 -42
- package/dist/useMenuPress-D-FRNrBW.js +0 -573
- package/dist/useScrollableArea-DDk_CluT.js +0 -172
- /package/dist/{index-lgvUFSCO.d.ts → index-CryFtTT6.d.ts} +0 -0
|
@@ -0,0 +1,819 @@
|
|
|
1
|
+
//#region src/utils/chainEventHandlers.ts
|
|
2
|
+
/**
|
|
3
|
+
* 把多个事件处理函数串成一个。每个函数都会按参数顺序执行。
|
|
4
|
+
*
|
|
5
|
+
* 和「前一个调用了 preventDefault 就跳过后面」不同:组件自己的处理函数
|
|
6
|
+
* 不能把事件藏起来,调用方也不能用 preventDefault 取消组件的行为。
|
|
7
|
+
*/
|
|
8
|
+
function chainEventHandlers(...handlers) {
|
|
9
|
+
return (event) => {
|
|
10
|
+
for (const handler of handlers) handler?.(event);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/utils/plainDate.ts
|
|
15
|
+
function plainDateCreate(year, month, day) {
|
|
16
|
+
if (!Number.isInteger(year) || year < 1) throw new RangeError(`year must be a positive integer, got ${year}`);
|
|
17
|
+
if (!Number.isInteger(month) || month < 1 || month > 12) throw new RangeError(`month must be 1–12, got ${month}`);
|
|
18
|
+
const maxDay = getDaysInMonth(year, month);
|
|
19
|
+
if (!Number.isInteger(day) || day < 1 || day > maxDay) throw new RangeError(`day must be 1–${maxDay} for ${year}-${String(month).padStart(2, "0")}, got ${day}`);
|
|
20
|
+
return {
|
|
21
|
+
year,
|
|
22
|
+
month,
|
|
23
|
+
day
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function plainDateFromISO(str) {
|
|
27
|
+
const [year, month, day] = str.split("-").map(Number);
|
|
28
|
+
return plainDateCreate(year, month, day);
|
|
29
|
+
}
|
|
30
|
+
function plainDateToISO(pd) {
|
|
31
|
+
return `${String(pd.year).padStart(4, "0")}-${String(pd.month).padStart(2, "0")}-${String(pd.day).padStart(2, "0")}`;
|
|
32
|
+
}
|
|
33
|
+
function plainDateToDate(pd) {
|
|
34
|
+
const d = new Date(0, 0, 1);
|
|
35
|
+
d.setFullYear(pd.year, pd.month - 1, pd.day);
|
|
36
|
+
return d;
|
|
37
|
+
}
|
|
38
|
+
function plainDateFromDate(d) {
|
|
39
|
+
return {
|
|
40
|
+
year: d.getFullYear(),
|
|
41
|
+
month: d.getMonth() + 1,
|
|
42
|
+
day: d.getDate()
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function plainDateToday() {
|
|
46
|
+
return plainDateFromDate(/* @__PURE__ */ new Date());
|
|
47
|
+
}
|
|
48
|
+
function getDaysInMonth(year, month) {
|
|
49
|
+
if (month === 2) return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0 ? 29 : 28;
|
|
50
|
+
return [
|
|
51
|
+
0,
|
|
52
|
+
31,
|
|
53
|
+
0,
|
|
54
|
+
31,
|
|
55
|
+
30,
|
|
56
|
+
31,
|
|
57
|
+
30,
|
|
58
|
+
31,
|
|
59
|
+
31,
|
|
60
|
+
30,
|
|
61
|
+
31,
|
|
62
|
+
30,
|
|
63
|
+
31
|
|
64
|
+
][month];
|
|
65
|
+
}
|
|
66
|
+
function plainDateDayOfWeek(pd) {
|
|
67
|
+
return plainDateToDate(pd).getDay();
|
|
68
|
+
}
|
|
69
|
+
function plainDateAddMonths(pd, n) {
|
|
70
|
+
const totalMonths = pd.year * 12 + (pd.month - 1) + n;
|
|
71
|
+
const year = Math.floor(totalMonths / 12);
|
|
72
|
+
const month = (totalMonths % 12 + 12) % 12 + 1;
|
|
73
|
+
return {
|
|
74
|
+
year,
|
|
75
|
+
month,
|
|
76
|
+
day: Math.min(pd.day, getDaysInMonth(year, month))
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function plainDateAddDays(pd, n) {
|
|
80
|
+
const d = plainDateToDate(pd);
|
|
81
|
+
d.setDate(d.getDate() + n);
|
|
82
|
+
return plainDateFromDate(d);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* `Date.UTC` with years 0-99 kept as given; `Date.UTC` itself reads them as
|
|
86
|
+
* 1900-1999.
|
|
87
|
+
*/
|
|
88
|
+
function utcTime(year, monthIndex, day, hour = 0, minute = 0, second = 0) {
|
|
89
|
+
const d = /* @__PURE__ */ new Date(0);
|
|
90
|
+
d.setUTCFullYear(year, monthIndex, day);
|
|
91
|
+
d.setUTCHours(hour, minute, second);
|
|
92
|
+
return d.getTime();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Whole calendar days from `a` to `b`, ignoring time of day. Positive when
|
|
96
|
+
* `b` is after `a`, negative when before. Uses UTC midnight so DST shifts
|
|
97
|
+
* never add or drop a day.
|
|
98
|
+
*/
|
|
99
|
+
function plainDateDiffDays(a, b) {
|
|
100
|
+
const msPerDay = 864e5;
|
|
101
|
+
const aUTC = utcTime(a.year, a.month - 1, a.day);
|
|
102
|
+
const bUTC = utcTime(b.year, b.month - 1, b.day);
|
|
103
|
+
return Math.round((bUTC - aUTC) / msPerDay);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The wall-clock fields an instant reads as in a given zone.
|
|
107
|
+
*
|
|
108
|
+
* A fixed `'en-US'` locale with `hourCycle: 'h23'` keeps the parts numeric and
|
|
109
|
+
* stable whatever locale the viewer has, so callers can assemble machine
|
|
110
|
+
* shapes (`YYYY-MM-DD`, `HH:mm:ss`) from them. Exported for Timestamp, whose
|
|
111
|
+
* `system_*` formats are built from these fields rather than through `Intl`
|
|
112
|
+
* formatting.
|
|
113
|
+
*/
|
|
114
|
+
function getTimeZoneParts(instant, timezoneID) {
|
|
115
|
+
const parts = new Intl.DateTimeFormat("en-US", {
|
|
116
|
+
timeZone: timezoneID,
|
|
117
|
+
year: "numeric",
|
|
118
|
+
month: "2-digit",
|
|
119
|
+
day: "2-digit",
|
|
120
|
+
hour: "2-digit",
|
|
121
|
+
minute: "2-digit",
|
|
122
|
+
second: "2-digit",
|
|
123
|
+
hourCycle: "h23",
|
|
124
|
+
calendar: "gregory"
|
|
125
|
+
}).formatToParts(new Date(instant));
|
|
126
|
+
const lookup = Object.fromEntries(parts.filter((part) => part.type !== "literal").map((part) => [part.type, Number(part.value)]));
|
|
127
|
+
return {
|
|
128
|
+
year: lookup.year,
|
|
129
|
+
month: lookup.month,
|
|
130
|
+
day: lookup.day,
|
|
131
|
+
hour: lookup.hour,
|
|
132
|
+
minute: lookup.minute,
|
|
133
|
+
second: lookup.second
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function getTimezoneOffsetMS(timezoneID, instant) {
|
|
137
|
+
const parts = getTimeZoneParts(instant, timezoneID);
|
|
138
|
+
return utcTime(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second) - instant;
|
|
139
|
+
}
|
|
140
|
+
const DAY_MS = 864e5;
|
|
141
|
+
function plainDateToInstant(date, timezoneID, hour = 0, minute = 0) {
|
|
142
|
+
const wallTime = utcTime(date.year, date.month - 1, date.day, hour, minute);
|
|
143
|
+
const offsetBefore = getTimezoneOffsetMS(timezoneID, wallTime - DAY_MS);
|
|
144
|
+
const offsetAfter = getTimezoneOffsetMS(timezoneID, wallTime + DAY_MS);
|
|
145
|
+
const candidates = [offsetBefore, offsetAfter].map((offset) => wallTime - offset).filter((instant, index) => getTimezoneOffsetMS(timezoneID, instant) === (index === 0 ? offsetBefore : offsetAfter));
|
|
146
|
+
return candidates.length > 0 ? Math.min(...candidates) : wallTime - offsetBefore;
|
|
147
|
+
}
|
|
148
|
+
function plainDateFromInstant(instant, timezoneID) {
|
|
149
|
+
const parts = getTimeZoneParts(instant, timezoneID);
|
|
150
|
+
return plainDateCreate(parts.year, parts.month, parts.day);
|
|
151
|
+
}
|
|
152
|
+
function compare(a, b) {
|
|
153
|
+
if (a.year !== b.year) return a.year - b.year;
|
|
154
|
+
if (a.month !== b.month) return a.month - b.month;
|
|
155
|
+
return a.day - b.day;
|
|
156
|
+
}
|
|
157
|
+
function plainDateIsBefore(a, b) {
|
|
158
|
+
return compare(a, b) < 0;
|
|
159
|
+
}
|
|
160
|
+
function plainDateIsAfter(a, b) {
|
|
161
|
+
return compare(a, b) > 0;
|
|
162
|
+
}
|
|
163
|
+
function plainDateIsEqual(a, b) {
|
|
164
|
+
return compare(a, b) === 0;
|
|
165
|
+
}
|
|
166
|
+
function plainDateMax(a, b) {
|
|
167
|
+
return compare(a, b) >= 0 ? a : b;
|
|
168
|
+
}
|
|
169
|
+
function plainDateMin(a, b) {
|
|
170
|
+
return compare(a, b) <= 0 ? a : b;
|
|
171
|
+
}
|
|
172
|
+
function plainDateIsInRange(pd, range) {
|
|
173
|
+
return compare(pd, range[0]) >= 0 && compare(pd, range[1]) <= 0;
|
|
174
|
+
}
|
|
175
|
+
function plainDateSetFirstOfMonth(pd) {
|
|
176
|
+
return {
|
|
177
|
+
year: pd.year,
|
|
178
|
+
month: pd.month,
|
|
179
|
+
day: 1
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function plainDateSetStartOfWeek(pd, weekStartsOn) {
|
|
183
|
+
return plainDateAddDays(pd, -((plainDateDayOfWeek(pd) - weekStartsOn + 7) % 7));
|
|
184
|
+
}
|
|
185
|
+
function plainDateSetEndOfWeekExclusive(pd, weekStartsOn) {
|
|
186
|
+
return plainDateAddDays(plainDateSetStartOfWeek(pd, weekStartsOn), 7);
|
|
187
|
+
}
|
|
188
|
+
function plainDateGetWeekNumber(pd) {
|
|
189
|
+
const d = plainDateToDate(pd);
|
|
190
|
+
const dayNum = d.getDay() || 7;
|
|
191
|
+
d.setDate(d.getDate() + 4 - dayNum);
|
|
192
|
+
const yearStart = plainDateToDate({
|
|
193
|
+
year: d.getFullYear(),
|
|
194
|
+
month: 1,
|
|
195
|
+
day: 1
|
|
196
|
+
});
|
|
197
|
+
return Math.ceil(((d.getTime() - yearStart.getTime()) / 864e5 + 1) / 7);
|
|
198
|
+
}
|
|
199
|
+
const DATE_FORMAT_WITH_WEEKDAY = {
|
|
200
|
+
weekday: "long",
|
|
201
|
+
year: "numeric",
|
|
202
|
+
month: "long",
|
|
203
|
+
day: "numeric"
|
|
204
|
+
};
|
|
205
|
+
const DATE_FORMAT_SHORT_WITH_WEEKDAY = {
|
|
206
|
+
weekday: "short",
|
|
207
|
+
month: "short",
|
|
208
|
+
day: "numeric",
|
|
209
|
+
year: "numeric"
|
|
210
|
+
};
|
|
211
|
+
const DATE_FORMAT_LONG = {
|
|
212
|
+
year: "numeric",
|
|
213
|
+
month: "long",
|
|
214
|
+
day: "numeric"
|
|
215
|
+
};
|
|
216
|
+
const DATE_FORMAT_MONTH_YEAR = {
|
|
217
|
+
year: "numeric",
|
|
218
|
+
month: "long"
|
|
219
|
+
};
|
|
220
|
+
const DATE_FORMAT_WEEKDAY_ONLY = { weekday: "short" };
|
|
221
|
+
const DATE_FORMAT_MONTH_ONLY = { month: "long" };
|
|
222
|
+
const DATE_FORMAT_SHORT = {
|
|
223
|
+
month: "short",
|
|
224
|
+
day: "numeric"
|
|
225
|
+
};
|
|
226
|
+
const DATE_FORMAT_SHORT_WITH_YEAR = {
|
|
227
|
+
month: "short",
|
|
228
|
+
day: "numeric",
|
|
229
|
+
year: "numeric"
|
|
230
|
+
};
|
|
231
|
+
/**
|
|
232
|
+
* Format a `PlainDate` for display.
|
|
233
|
+
*
|
|
234
|
+
* The locale defaults to the same `'en'` fallback as `useLocale()`, avoiding
|
|
235
|
+
* runtime-dependent output when no provider locale is available. Astryx date
|
|
236
|
+
* APIs currently model Gregorian dates, so this helper defaults to Gregorian
|
|
237
|
+
* when `options.calendar` is omitted. The explicit option remains supported for
|
|
238
|
+
* compatibility with the public `Intl.DateTimeFormatOptions` signature; it is a
|
|
239
|
+
* display-only escape hatch and does not change PlainDate arithmetic, parsing,
|
|
240
|
+
* serialization, or any Astryx component's calendar semantics.
|
|
241
|
+
*/
|
|
242
|
+
function plainDateFormat(pd, options, locale = "en") {
|
|
243
|
+
return new Intl.DateTimeFormat(locale, {
|
|
244
|
+
...options,
|
|
245
|
+
calendar: options.calendar ?? "gregory"
|
|
246
|
+
}).format(plainDateToDate(pd));
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* The locale's name for the "week of year" date field ("week", "Woche", "週"),
|
|
250
|
+
* from CLDR through `Intl.DisplayNames`. Calendar names its week-number
|
|
251
|
+
* column header with it, so no catalog string is needed for a word the
|
|
252
|
+
* platform already carries in every locale.
|
|
253
|
+
*
|
|
254
|
+
* `Intl.DisplayNames` with `type: 'dateTimeField'` is inside the Baseline − 2
|
|
255
|
+
* support tier (Chrome 106, Safari 15.4, Firefox 110). Should a host lack it
|
|
256
|
+
* or return nothing, the field's English CLDR name stands in rather than an
|
|
257
|
+
* empty header.
|
|
258
|
+
*/
|
|
259
|
+
function plainDateWeekFieldName(locale = "en") {
|
|
260
|
+
try {
|
|
261
|
+
const name = new Intl.DisplayNames(locale, { type: "dateTimeField" }).of("weekOfYear");
|
|
262
|
+
if (name != null && name !== "") return name;
|
|
263
|
+
} catch {}
|
|
264
|
+
return "week";
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Intl option bags for the locale-aware shared date members. `system_date` is
|
|
268
|
+
* intentionally absent — it is emitted as a fixed ISO `YYYY-MM-DD` string, not
|
|
269
|
+
* via `Intl` — and is handled directly by {@link formatSharedDate}.
|
|
270
|
+
*
|
|
271
|
+
* This is the single source of truth consumed by both Timestamp's
|
|
272
|
+
* `formatTimestamp` switch and DateInput's display path, so the two never
|
|
273
|
+
* drift for the members they share.
|
|
274
|
+
*/
|
|
275
|
+
const SHARED_DATE_FORMAT_OPTIONS = {
|
|
276
|
+
date: DATE_FORMAT_SHORT_WITH_YEAR,
|
|
277
|
+
date_long: DATE_FORMAT_LONG,
|
|
278
|
+
date_weekday: DATE_FORMAT_SHORT_WITH_WEEKDAY
|
|
279
|
+
};
|
|
280
|
+
/**
|
|
281
|
+
* Renders a {@link PlainDate} using one of the {@link SharedDateFormat}
|
|
282
|
+
* members. The shared entry point DateInput uses for the named-format path;
|
|
283
|
+
* Timestamp maps the same members onto {@link SHARED_DATE_FORMAT_OPTIONS} in
|
|
284
|
+
* its own `formatTimestamp` switch (its input is a `Date`, not a `PlainDate`).
|
|
285
|
+
*/
|
|
286
|
+
function formatSharedDate(pd, format, locale = "en") {
|
|
287
|
+
if (format === "system_date") return plainDateToISO(pd);
|
|
288
|
+
return plainDateFormat(pd, SHARED_DATE_FORMAT_OPTIONS[format], locale);
|
|
289
|
+
}
|
|
290
|
+
//#endregion
|
|
291
|
+
//#region src/utils/dateParser.ts
|
|
292
|
+
/**
|
|
293
|
+
* Detects if the locale uses day-first date format (DD/MM/YYYY).
|
|
294
|
+
* US and a few others use month-first (MM/DD/YYYY).
|
|
295
|
+
*/
|
|
296
|
+
function isLocaleDayFirst(locale = "en") {
|
|
297
|
+
const parts = new Intl.DateTimeFormat(locale, { calendar: "gregory" }).formatToParts(new Date(2e3, 0, 15));
|
|
298
|
+
return parts.findIndex((p) => p.type === "day") < parts.findIndex((p) => p.type === "month");
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Parses user input into a PlainDate.
|
|
302
|
+
*
|
|
303
|
+
* Supports ISO dates, English month names, and ASCII numeric dates with or
|
|
304
|
+
* without a year. For ambiguous ASCII numeric input where both fields are at
|
|
305
|
+
* most 12, `locale` selects month-first versus day-first order. It does not
|
|
306
|
+
* localize month-name parsing, accept non-ASCII digits, or provide a general
|
|
307
|
+
* locale-aware parser.
|
|
308
|
+
*
|
|
309
|
+
* @returns PlainDate if valid, null if unparseable
|
|
310
|
+
*/
|
|
311
|
+
function parseDateInput(input, locale = "en") {
|
|
312
|
+
const trimmed = input.trim();
|
|
313
|
+
if (!trimmed) return null;
|
|
314
|
+
const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
315
|
+
const isoMatch = trimmed.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/);
|
|
316
|
+
if (isoMatch) {
|
|
317
|
+
const [, year, month, day] = isoMatch;
|
|
318
|
+
return tryCreatePlainDate(+year, +month, +day);
|
|
319
|
+
}
|
|
320
|
+
const monthFirstWithYearMatch = trimmed.match(/^([A-Z]+)\s+(\d{1,2}),?\s+(\d{4})$/i);
|
|
321
|
+
if (monthFirstWithYearMatch) {
|
|
322
|
+
const [, monthName, day, year] = monthFirstWithYearMatch;
|
|
323
|
+
const month = parseMonthName(monthName);
|
|
324
|
+
if (month !== null) return tryCreatePlainDate(+year, month, +day);
|
|
325
|
+
}
|
|
326
|
+
const dayFirstWithYearMatch = trimmed.match(/^(\d{1,2})\s+([A-Z]+),?\s+(\d{4})$/i);
|
|
327
|
+
if (dayFirstWithYearMatch) {
|
|
328
|
+
const [, day, monthName, year] = dayFirstWithYearMatch;
|
|
329
|
+
const month = parseMonthName(monthName);
|
|
330
|
+
if (month !== null) return tryCreatePlainDate(+year, month, +day);
|
|
331
|
+
}
|
|
332
|
+
const monthFirstNoYearMatch = trimmed.match(/^([A-Z]+)\s+(\d{1,2})$/i);
|
|
333
|
+
if (monthFirstNoYearMatch) {
|
|
334
|
+
const [, monthName, day] = monthFirstNoYearMatch;
|
|
335
|
+
const month = parseMonthName(monthName);
|
|
336
|
+
if (month !== null) return tryCreatePlainDate(currentYear, month, +day);
|
|
337
|
+
}
|
|
338
|
+
const dayFirstNoYearMatch = trimmed.match(/^(\d{1,2})\s+([A-Z]+)$/i);
|
|
339
|
+
if (dayFirstNoYearMatch) {
|
|
340
|
+
const [, day, monthName] = dayFirstNoYearMatch;
|
|
341
|
+
const month = parseMonthName(monthName);
|
|
342
|
+
if (month !== null) return tryCreatePlainDate(currentYear, month, +day);
|
|
343
|
+
}
|
|
344
|
+
const numericWithYearMatch = trimmed.match(/^(\d{1,2})([-/.])(\d{1,2})([-/.])(\d{4})$/);
|
|
345
|
+
if (numericWithYearMatch) {
|
|
346
|
+
const [, first, sep1, second, sep2, year] = numericWithYearMatch;
|
|
347
|
+
if (sep1 !== sep2) return null;
|
|
348
|
+
return parseNumericDate(+first, +second, +year, locale);
|
|
349
|
+
}
|
|
350
|
+
const numericNoYearMatch = trimmed.match(/^(\d{1,2})[-/.](\d{1,2})$/);
|
|
351
|
+
if (numericNoYearMatch) {
|
|
352
|
+
const [, first, second] = numericNoYearMatch;
|
|
353
|
+
return parseNumericDate(+first, +second, currentYear, locale);
|
|
354
|
+
}
|
|
355
|
+
if (/^\d+$/.test(trimmed)) return null;
|
|
356
|
+
const parsed = new Date(trimmed);
|
|
357
|
+
if (!Number.isNaN(parsed.getTime())) {
|
|
358
|
+
const fromDate = plainDateFromDate(parsed);
|
|
359
|
+
return tryCreatePlainDate(fromDate.year, fromDate.month, fromDate.day);
|
|
360
|
+
}
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
function parseNumericDate(first, second, year, locale) {
|
|
364
|
+
let day;
|
|
365
|
+
let month;
|
|
366
|
+
if (first > 12 && second <= 12) {
|
|
367
|
+
day = first;
|
|
368
|
+
month = second;
|
|
369
|
+
} else if (second > 12 && first <= 12) {
|
|
370
|
+
month = first;
|
|
371
|
+
day = second;
|
|
372
|
+
} else if (first > 12 && second > 12) return null;
|
|
373
|
+
else if (isLocaleDayFirst(locale)) {
|
|
374
|
+
day = first;
|
|
375
|
+
month = second;
|
|
376
|
+
} else {
|
|
377
|
+
month = first;
|
|
378
|
+
day = second;
|
|
379
|
+
}
|
|
380
|
+
return tryCreatePlainDate(year, month, day);
|
|
381
|
+
}
|
|
382
|
+
function parseMonthName(name) {
|
|
383
|
+
return {
|
|
384
|
+
january: 1,
|
|
385
|
+
jan: 1,
|
|
386
|
+
february: 2,
|
|
387
|
+
feb: 2,
|
|
388
|
+
march: 3,
|
|
389
|
+
mar: 3,
|
|
390
|
+
april: 4,
|
|
391
|
+
apr: 4,
|
|
392
|
+
may: 5,
|
|
393
|
+
june: 6,
|
|
394
|
+
jun: 6,
|
|
395
|
+
july: 7,
|
|
396
|
+
jul: 7,
|
|
397
|
+
august: 8,
|
|
398
|
+
aug: 8,
|
|
399
|
+
september: 9,
|
|
400
|
+
sep: 9,
|
|
401
|
+
sept: 9,
|
|
402
|
+
october: 10,
|
|
403
|
+
oct: 10,
|
|
404
|
+
november: 11,
|
|
405
|
+
nov: 11,
|
|
406
|
+
december: 12,
|
|
407
|
+
dec: 12
|
|
408
|
+
}[name.toLowerCase()] ?? null;
|
|
409
|
+
}
|
|
410
|
+
function tryCreatePlainDate(year, month, day) {
|
|
411
|
+
try {
|
|
412
|
+
return plainDateCreate(year, month, day);
|
|
413
|
+
} catch {
|
|
414
|
+
return null;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
//#endregion
|
|
418
|
+
//#region src/utils/dateTypes.ts
|
|
419
|
+
/** Weekday names indexed by {@link DayOfWeek} (0 = Sunday). */
|
|
420
|
+
const WEEKDAY_NAMES = [
|
|
421
|
+
"sun",
|
|
422
|
+
"mon",
|
|
423
|
+
"tue",
|
|
424
|
+
"wed",
|
|
425
|
+
"thu",
|
|
426
|
+
"fri",
|
|
427
|
+
"sat"
|
|
428
|
+
];
|
|
429
|
+
/**
|
|
430
|
+
* Normalize a weekday to its numeric {@link DayOfWeek}. Accepts either a
|
|
431
|
+
* number (0–6) or a three-letter day name ('sun'–'sat', case-insensitive),
|
|
432
|
+
* so APIs like `weekStartsOn` can take whichever is more readable at the
|
|
433
|
+
* call site. Unrecognized values fall back to 0 (Sunday).
|
|
434
|
+
*/
|
|
435
|
+
function normalizeDayOfWeek(value) {
|
|
436
|
+
if (typeof value === "number") return value;
|
|
437
|
+
const index = WEEKDAY_NAMES.indexOf(value.toLowerCase());
|
|
438
|
+
return index === -1 ? 0 : index;
|
|
439
|
+
}
|
|
440
|
+
//#endregion
|
|
441
|
+
//#region src/utils/groupItems.ts
|
|
442
|
+
/** 读出条目上的组名。不是字符串就不算分组。空字符串仍算一个组名。 */
|
|
443
|
+
function getItemGroup(item) {
|
|
444
|
+
const aux = item.auxiliaryData;
|
|
445
|
+
if (aux == null || typeof aux !== "object") return void 0;
|
|
446
|
+
const group = aux.group;
|
|
447
|
+
return typeof group === "string" ? group : void 0;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* 按 `auxiliaryData.group` 分组,组的先后跟它们第一次出现的顺序。
|
|
451
|
+
* 没有任何组名时,返回一组 `heading: null`。
|
|
452
|
+
*/
|
|
453
|
+
function groupItems(items, { ungroupedFirst = false } = {}) {
|
|
454
|
+
if (!items.some((item) => getItemGroup(item) != null)) return [{
|
|
455
|
+
heading: null,
|
|
456
|
+
items: [...items]
|
|
457
|
+
}];
|
|
458
|
+
const groupOrder = [];
|
|
459
|
+
const groups = /* @__PURE__ */ new Map();
|
|
460
|
+
const ungrouped = [];
|
|
461
|
+
for (const item of items) {
|
|
462
|
+
const group = getItemGroup(item);
|
|
463
|
+
if (group != null) {
|
|
464
|
+
const list = groups.get(group);
|
|
465
|
+
if (list) list.push(item);
|
|
466
|
+
else {
|
|
467
|
+
groupOrder.push(group);
|
|
468
|
+
groups.set(group, [item]);
|
|
469
|
+
}
|
|
470
|
+
} else ungrouped.push(item);
|
|
471
|
+
}
|
|
472
|
+
const namedGroups = groupOrder.map((heading) => ({
|
|
473
|
+
heading,
|
|
474
|
+
items: groups.get(heading) ?? []
|
|
475
|
+
}));
|
|
476
|
+
const ungroupedGroup = ungrouped.length > 0 ? [{
|
|
477
|
+
heading: null,
|
|
478
|
+
items: ungrouped
|
|
479
|
+
}] : [];
|
|
480
|
+
return ungroupedFirst ? [...ungroupedGroup, ...namedGroups] : [...namedGroups, ...ungroupedGroup];
|
|
481
|
+
}
|
|
482
|
+
//#endregion
|
|
483
|
+
//#region src/utils/inputAria.ts
|
|
484
|
+
function joinAriaIDs(...values) {
|
|
485
|
+
const ids = values.flatMap((value) => typeof value === "string" ? value.trim().split(/\s+/) : []).filter(Boolean);
|
|
486
|
+
if (ids.length === 0) return;
|
|
487
|
+
return Array.from(new Set(ids)).join(" ");
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Builds ARIA label/description wiring for an input.
|
|
491
|
+
*
|
|
492
|
+
* Standalone inputs keep their normal native label association. Grouped inputs
|
|
493
|
+
* are named by the visible InputGroup label plus their own input label, and
|
|
494
|
+
* inherit group description/status text in addition to input-local text.
|
|
495
|
+
*/
|
|
496
|
+
function getInputARIA(labelID, describedByIDs = [], inputGroup) {
|
|
497
|
+
return {
|
|
498
|
+
ariaLabelledBy: inputGroup ? joinAriaIDs(inputGroup.labelID, labelID) : void 0,
|
|
499
|
+
ariaDescribedBy: joinAriaIDs(inputGroup?.describedByIDs, ...describedByIDs)
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
//#endregion
|
|
503
|
+
//#region src/utils/parseStyleKey.ts
|
|
504
|
+
/** 把驼峰属性名变成主题用的 data 属性名,例如 listStyle → data-list-style。 */
|
|
505
|
+
function themeDataAttributeName(prop) {
|
|
506
|
+
return `data-${prop.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase()}`;
|
|
507
|
+
}
|
|
508
|
+
/** 双引号 CSS 属性选择器里的值转义。 */
|
|
509
|
+
function escapeAttributeValue(value) {
|
|
510
|
+
let escaped = "";
|
|
511
|
+
for (const char of value) {
|
|
512
|
+
const codePoint = char.codePointAt(0) ?? 0;
|
|
513
|
+
if (char === "\"" || char === "\\" || codePoint < 32 || codePoint === 127) escaped += `\\${(codePoint === 0 ? 65533 : codePoint).toString(16)} `;
|
|
514
|
+
else escaped += char;
|
|
515
|
+
}
|
|
516
|
+
return escaped;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* 把组件样式键编成 data 属性选择器后缀。
|
|
520
|
+
*
|
|
521
|
+
* `prop:value` 选择 `[data-prop="value"]`。裸状态选择 `[data-state="state"]`。
|
|
522
|
+
* `+` 把多个条件接在同一个组件目标上。轴名留在选择器里,避免不同属性的相同值撞在一起。
|
|
523
|
+
*
|
|
524
|
+
* @example
|
|
525
|
+
* parseStyleKey('base') // ''
|
|
526
|
+
* parseStyleKey('variant:secondary') // '[data-variant="secondary"]'
|
|
527
|
+
* parseStyleKey('checked+disabled') // '[data-checked="checked"][data-disabled="disabled"]'
|
|
528
|
+
*/
|
|
529
|
+
function parseStyleKey(key) {
|
|
530
|
+
if (key === "base") return "";
|
|
531
|
+
return key.split("+").map((part) => {
|
|
532
|
+
const separator = part.indexOf(":");
|
|
533
|
+
const prop = separator === -1 ? part : part.slice(0, separator);
|
|
534
|
+
const value = separator === -1 ? part : part.slice(separator + 1);
|
|
535
|
+
return `[${themeDataAttributeName(prop)}="${escapeAttributeValue(value)}"]`;
|
|
536
|
+
}).join("");
|
|
537
|
+
}
|
|
538
|
+
//#endregion
|
|
539
|
+
//#region src/utils/sharedResizeObserver.ts
|
|
540
|
+
let observer = null;
|
|
541
|
+
const callbacks = /* @__PURE__ */ new Map();
|
|
542
|
+
/**
|
|
543
|
+
* The shared observer, or null where the API does not exist (jsdom, an old
|
|
544
|
+
* browser). Callers still get the one-shot measurement `observeResize` fires
|
|
545
|
+
* on registration; live resize updates are the part that needs the API.
|
|
546
|
+
*/
|
|
547
|
+
function getObserver() {
|
|
548
|
+
if (typeof ResizeObserver === "undefined") return null;
|
|
549
|
+
if (!observer) observer = new ResizeObserver((entries) => {
|
|
550
|
+
for (const entry of entries) {
|
|
551
|
+
const targetCallbacks = callbacks.get(entry.target);
|
|
552
|
+
if (targetCallbacks) for (const cb of [...targetCallbacks.keys()]) cb(entry);
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
return observer;
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Observe an element's size via a shared ResizeObserver singleton.
|
|
559
|
+
*
|
|
560
|
+
* Fires the callback once synchronously on registration (with a
|
|
561
|
+
* synthetic entry) so callers don't need separate initial-measurement
|
|
562
|
+
* logic. Subsequent callbacks fire on actual resizes.
|
|
563
|
+
*
|
|
564
|
+
* Returns an unsubscribe function that removes only this registration, leaving
|
|
565
|
+
* every other observer of the same element intact — prefer it over
|
|
566
|
+
* `unobserveResize(element)`, which drops them all. The shared observer is
|
|
567
|
+
* destroyed when the last element is unobserved.
|
|
568
|
+
*
|
|
569
|
+
* @example
|
|
570
|
+
* ```
|
|
571
|
+
* const unsubscribe = observeResize(element, (entry) => {
|
|
572
|
+
* console.log(entry.contentBoxSize);
|
|
573
|
+
* });
|
|
574
|
+
*
|
|
575
|
+
* // Cleanup:
|
|
576
|
+
* unsubscribe();
|
|
577
|
+
* ```
|
|
578
|
+
*/
|
|
579
|
+
function observeResize(element, callback) {
|
|
580
|
+
const existing = callbacks.get(element);
|
|
581
|
+
if (existing) existing.set(callback, (existing.get(callback) ?? 0) + 1);
|
|
582
|
+
else callbacks.set(element, /* @__PURE__ */ new Map([[callback, 1]]));
|
|
583
|
+
getObserver()?.observe(element);
|
|
584
|
+
callback({ target: element });
|
|
585
|
+
let isSubscribed = true;
|
|
586
|
+
return () => {
|
|
587
|
+
if (!isSubscribed) return;
|
|
588
|
+
isSubscribed = false;
|
|
589
|
+
unobserveResize(element, callback);
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Stop observing an element.
|
|
594
|
+
*
|
|
595
|
+
* Pass the callback to remove only that registration — the unsubscribe returned
|
|
596
|
+
* by `observeResize` does this for you. Omitting it removes EVERY callback on
|
|
597
|
+
* the element, which silences peers that are still mounted, so it is only
|
|
598
|
+
* correct for a caller that owns the element outright.
|
|
599
|
+
*
|
|
600
|
+
* If no elements remain, the shared observer is disconnected and released for
|
|
601
|
+
* garbage collection.
|
|
602
|
+
*/
|
|
603
|
+
function unobserveResize(element, callback) {
|
|
604
|
+
const targetCallbacks = callbacks.get(element);
|
|
605
|
+
if (callback != null) {
|
|
606
|
+
const registrationCount = targetCallbacks?.get(callback);
|
|
607
|
+
if (targetCallbacks == null || registrationCount == null) return;
|
|
608
|
+
if (registrationCount > 1) {
|
|
609
|
+
targetCallbacks.set(callback, registrationCount - 1);
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
targetCallbacks.delete(callback);
|
|
613
|
+
if (targetCallbacks.size > 0) return;
|
|
614
|
+
}
|
|
615
|
+
callbacks.delete(element);
|
|
616
|
+
if (observer) {
|
|
617
|
+
observer.unobserve(element);
|
|
618
|
+
if (callbacks.size === 0) {
|
|
619
|
+
observer.disconnect();
|
|
620
|
+
observer = null;
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
//#endregion
|
|
625
|
+
//#region src/utils/timeParser.ts
|
|
626
|
+
/**
|
|
627
|
+
* Validates and creates an ISOTimeString from a string.
|
|
628
|
+
* Returns null if the string is not a valid time format.
|
|
629
|
+
*/
|
|
630
|
+
function createISOTimeString(value) {
|
|
631
|
+
const parsed = parseISOTime(value);
|
|
632
|
+
if (!parsed) return null;
|
|
633
|
+
return formatISOTime(parsed, value.split(":").length === 3);
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Parses an ISO time string into a ParsedTime object.
|
|
637
|
+
* Accepts HH:MM or HH:MM:SS format.
|
|
638
|
+
*/
|
|
639
|
+
function parseISOTime(time) {
|
|
640
|
+
if (!time) return null;
|
|
641
|
+
const parts = time.split(":");
|
|
642
|
+
if (parts.length < 2 || parts.length > 3) return null;
|
|
643
|
+
const hour = parseInt(parts[0], 10);
|
|
644
|
+
const minute = parseInt(parts[1], 10);
|
|
645
|
+
const second = parts.length === 3 ? parseInt(parts[2], 10) : 0;
|
|
646
|
+
if (Number.isNaN(hour) || Number.isNaN(minute) || Number.isNaN(second) || hour < 0 || hour > 23 || minute < 0 || minute > 59 || second < 0 || second > 59) return null;
|
|
647
|
+
return {
|
|
648
|
+
hour,
|
|
649
|
+
minute,
|
|
650
|
+
second
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
654
|
+
* Formats a ParsedTime object into an ISOTimeString.
|
|
655
|
+
*/
|
|
656
|
+
function formatISOTime(time, includeSeconds = false) {
|
|
657
|
+
const hh = time.hour.toString().padStart(2, "0");
|
|
658
|
+
const mm = time.minute.toString().padStart(2, "0");
|
|
659
|
+
if (includeSeconds) return `${hh}:${mm}:${time.second.toString().padStart(2, "0")}`;
|
|
660
|
+
return `${hh}:${mm}`;
|
|
661
|
+
}
|
|
662
|
+
/**
|
|
663
|
+
* Formats a time for display in 12-hour format.
|
|
664
|
+
* Example: "14:30" -> "2:30 PM"
|
|
665
|
+
*/
|
|
666
|
+
function formatDisplayTime12h(time, includeSeconds = false) {
|
|
667
|
+
if (!time) return "";
|
|
668
|
+
const parsed = parseISOTime(time);
|
|
669
|
+
if (!parsed) return "";
|
|
670
|
+
const hour12 = parsed.hour === 0 ? 12 : parsed.hour > 12 ? parsed.hour - 12 : parsed.hour;
|
|
671
|
+
const meridiem = parsed.hour < 12 ? "AM" : "PM";
|
|
672
|
+
const mm = parsed.minute.toString().padStart(2, "0");
|
|
673
|
+
if (includeSeconds) return `${hour12}:${mm}:${parsed.second.toString().padStart(2, "0")} ${meridiem}`;
|
|
674
|
+
return `${hour12}:${mm} ${meridiem}`;
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Formats a time for display in 24-hour format.
|
|
678
|
+
* Example: "14:30" -> "14:30"
|
|
679
|
+
*/
|
|
680
|
+
function formatDisplayTime24h(time, includeSeconds = false) {
|
|
681
|
+
if (!time) return "";
|
|
682
|
+
const parsed = parseISOTime(time);
|
|
683
|
+
if (!parsed) return "";
|
|
684
|
+
const hh = parsed.hour.toString().padStart(2, "0");
|
|
685
|
+
const mm = parsed.minute.toString().padStart(2, "0");
|
|
686
|
+
if (includeSeconds) return `${hh}:${mm}:${parsed.second.toString().padStart(2, "0")}`;
|
|
687
|
+
return `${hh}:${mm}`;
|
|
688
|
+
}
|
|
689
|
+
/**
|
|
690
|
+
* Parses user input into an ISOTimeString.
|
|
691
|
+
* Accepts various formats:
|
|
692
|
+
* - "2:30 PM", "2:30pm", "2:30 pm"
|
|
693
|
+
* - "14:30", "1430"
|
|
694
|
+
* - "2pm", "2 PM"
|
|
695
|
+
*/
|
|
696
|
+
function parseTimeInput(input, includeSeconds = false) {
|
|
697
|
+
if (!input) return null;
|
|
698
|
+
const trimmed = input.trim().toLowerCase();
|
|
699
|
+
const isPM = /p\.?m?\.?\s*$/i.test(trimmed);
|
|
700
|
+
const isAM = /a\.?m?\.?\s*$/i.test(trimmed);
|
|
701
|
+
const hasMeridiem = isPM || isAM;
|
|
702
|
+
const timeStr = trimmed.replace(/\s*[ap]\.?m?\.?\s*$/i, "").trim();
|
|
703
|
+
const convertHourTo24Hour = (hour) => {
|
|
704
|
+
if (!hasMeridiem) return hour;
|
|
705
|
+
if (hour < 1 || hour > 12) return null;
|
|
706
|
+
if (isPM && hour !== 12) return hour + 12;
|
|
707
|
+
if (isAM && hour === 12) return 0;
|
|
708
|
+
return hour;
|
|
709
|
+
};
|
|
710
|
+
if (/^\d{1,2}$/.test(timeStr)) {
|
|
711
|
+
const hour = parseInt(timeStr, 10);
|
|
712
|
+
if (hasMeridiem) {
|
|
713
|
+
const hour24 = convertHourTo24Hour(hour);
|
|
714
|
+
if (hour24 === null) return null;
|
|
715
|
+
return formatISOTime({
|
|
716
|
+
hour: hour24,
|
|
717
|
+
minute: 0,
|
|
718
|
+
second: 0
|
|
719
|
+
}, includeSeconds);
|
|
720
|
+
}
|
|
721
|
+
if (hour >= 0 && hour <= 23 && !hasMeridiem) return formatISOTime({
|
|
722
|
+
hour,
|
|
723
|
+
minute: 0,
|
|
724
|
+
second: 0
|
|
725
|
+
}, includeSeconds);
|
|
726
|
+
return null;
|
|
727
|
+
}
|
|
728
|
+
if (/^\d{4}$/.test(timeStr)) {
|
|
729
|
+
const hour = parseInt(timeStr.slice(0, 2), 10);
|
|
730
|
+
const minute = parseInt(timeStr.slice(2, 4), 10);
|
|
731
|
+
const hour24 = convertHourTo24Hour(hour);
|
|
732
|
+
if (hour24 !== null && hour24 >= 0 && hour24 <= 23 && minute >= 0 && minute <= 59) return formatISOTime({
|
|
733
|
+
hour: hour24,
|
|
734
|
+
minute,
|
|
735
|
+
second: 0
|
|
736
|
+
}, includeSeconds);
|
|
737
|
+
return null;
|
|
738
|
+
}
|
|
739
|
+
if (/^\d{6}$/.test(timeStr)) {
|
|
740
|
+
const hour = parseInt(timeStr.slice(0, 2), 10);
|
|
741
|
+
const minute = parseInt(timeStr.slice(2, 4), 10);
|
|
742
|
+
const second = parseInt(timeStr.slice(4, 6), 10);
|
|
743
|
+
const hour24 = convertHourTo24Hour(hour);
|
|
744
|
+
if (hour24 !== null && hour24 >= 0 && hour24 <= 23 && minute >= 0 && minute <= 59 && second >= 0 && second <= 59) return formatISOTime({
|
|
745
|
+
hour: hour24,
|
|
746
|
+
minute,
|
|
747
|
+
second
|
|
748
|
+
}, includeSeconds);
|
|
749
|
+
return null;
|
|
750
|
+
}
|
|
751
|
+
const colonParts = timeStr.split(":");
|
|
752
|
+
if (colonParts.length >= 2 && colonParts.length <= 3) {
|
|
753
|
+
let hour = parseInt(colonParts[0], 10);
|
|
754
|
+
const minute = parseInt(colonParts[1], 10);
|
|
755
|
+
const second = colonParts.length === 3 ? parseInt(colonParts[2], 10) : 0;
|
|
756
|
+
if (Number.isNaN(hour) || Number.isNaN(minute) || Number.isNaN(second)) return null;
|
|
757
|
+
if (minute < 0 || minute > 59 || second < 0 || second > 59) return null;
|
|
758
|
+
if (hasMeridiem) {
|
|
759
|
+
if (hour < 1 || hour > 12) return null;
|
|
760
|
+
if (isPM && hour !== 12) hour += 12;
|
|
761
|
+
if (isAM && hour === 12) hour = 0;
|
|
762
|
+
} else if (hour < 0 || hour > 23) return null;
|
|
763
|
+
return formatISOTime({
|
|
764
|
+
hour,
|
|
765
|
+
minute,
|
|
766
|
+
second
|
|
767
|
+
}, includeSeconds);
|
|
768
|
+
}
|
|
769
|
+
return null;
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* Compares two times. Returns:
|
|
773
|
+
* - negative if a < b
|
|
774
|
+
* - 0 if a === b
|
|
775
|
+
* - positive if a > b
|
|
776
|
+
*/
|
|
777
|
+
function compareTime(a, b) {
|
|
778
|
+
if (!a && !b) return 0;
|
|
779
|
+
if (!a) return -1;
|
|
780
|
+
if (!b) return 1;
|
|
781
|
+
const parsedA = parseISOTime(a);
|
|
782
|
+
const parsedB = parseISOTime(b);
|
|
783
|
+
if (!parsedA && !parsedB) return 0;
|
|
784
|
+
if (!parsedA) return -1;
|
|
785
|
+
if (!parsedB) return 1;
|
|
786
|
+
return parsedA.hour * 3600 + parsedA.minute * 60 + parsedA.second - (parsedB.hour * 3600 + parsedB.minute * 60 + parsedB.second);
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Clamps a time to a min/max range.
|
|
790
|
+
*/
|
|
791
|
+
function clampTime(time, min, max, includeSeconds = false) {
|
|
792
|
+
if (!parseISOTime(time)) return time;
|
|
793
|
+
if (min && compareTime(time, min) < 0) {
|
|
794
|
+
const parsedMin = parseISOTime(min);
|
|
795
|
+
if (parsedMin) return formatISOTime(parsedMin, includeSeconds);
|
|
796
|
+
}
|
|
797
|
+
if (max && compareTime(time, max) > 0) {
|
|
798
|
+
const parsedMax = parseISOTime(max);
|
|
799
|
+
if (parsedMax) return formatISOTime(parsedMax, includeSeconds);
|
|
800
|
+
}
|
|
801
|
+
return time;
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Adjusts a time by adding/subtracting minutes.
|
|
805
|
+
*/
|
|
806
|
+
function adjustTime(time, deltaMinutes, includeSeconds = false) {
|
|
807
|
+
const parsed = parseISOTime(time);
|
|
808
|
+
if (!parsed) return time;
|
|
809
|
+
if (!Number.isFinite(deltaMinutes)) return time;
|
|
810
|
+
let totalMinutes = parsed.hour * 60 + parsed.minute + deltaMinutes;
|
|
811
|
+
totalMinutes = (totalMinutes % 1440 + 1440) % 1440;
|
|
812
|
+
return formatISOTime({
|
|
813
|
+
hour: Math.floor(totalMinutes / 60),
|
|
814
|
+
minute: totalMinutes % 60,
|
|
815
|
+
second: parsed.second
|
|
816
|
+
}, includeSeconds);
|
|
817
|
+
}
|
|
818
|
+
//#endregion
|
|
819
|
+
export { plainDateWeekFieldName as $, plainDateAddDays as A, plainDateIsAfter as B, DATE_FORMAT_SHORT_WITH_YEAR as C, formatSharedDate as D, SHARED_DATE_FORMAT_OPTIONS as E, plainDateFormat as F, plainDateMin as G, plainDateIsEqual as H, plainDateFromDate as I, plainDateSetStartOfWeek as J, plainDateSetEndOfWeekExclusive as K, plainDateFromISO as L, plainDateCreate as M, plainDateDayOfWeek as N, getDaysInMonth as O, plainDateDiffDays as P, plainDateToday as Q, plainDateFromInstant as R, DATE_FORMAT_SHORT_WITH_WEEKDAY as S, DATE_FORMAT_WITH_WEEKDAY as T, plainDateIsInRange as U, plainDateIsBefore as V, plainDateMax as W, plainDateToISO as X, plainDateToDate as Y, plainDateToInstant as Z, parseDateInput as _, formatDisplayTime12h as a, DATE_FORMAT_MONTH_YEAR as b, observeResize as c, getInputARIA as d, chainEventHandlers as et, joinAriaIDs as f, isLocaleDayFirst as g, normalizeDayOfWeek as h, createISOTimeString as i, plainDateAddMonths as j, getTimeZoneParts as k, unobserveResize as l, groupItems as m, clampTime as n, formatDisplayTime24h as o, getItemGroup as p, plainDateSetFirstOfMonth as q, compareTime as r, parseTimeInput as s, adjustTime as t, parseStyleKey as u, DATE_FORMAT_LONG as v, DATE_FORMAT_WEEKDAY_ONLY as w, DATE_FORMAT_SHORT as x, DATE_FORMAT_MONTH_ONLY as y, plainDateGetWeekNumber as z };
|