@astryx-vue/core 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/index.js +1 -1
- package/dist/{AlertDialog-BylcA4vV.js → AlertDialog-ovx4cBjM.js} +1 -1
- package/dist/AppShell/index.d.ts +2 -0
- package/dist/AppShell/index.js +2 -0
- package/dist/AppShell-EiGyPFbA.js +249 -0
- package/dist/AspectRatio/index.d.ts +2 -0
- package/dist/AspectRatio/index.js +2 -0
- package/dist/AspectRatio-Bij7e-tq.js +40 -0
- package/dist/AvatarGroup/index.d.ts +1 -1
- package/dist/Banner/index.d.ts +1 -1
- package/dist/BottomSheet/index.d.ts +1 -1
- package/dist/Button/index.d.ts +1 -1
- package/dist/ButtonGroup/index.d.ts +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/{Calendar-BEyrkUtr.js → Calendar-BG7wEsro.js} +1 -1
- package/dist/Carousel/index.d.ts +2 -0
- package/dist/Carousel/index.js +2 -0
- package/dist/Carousel-BTtHkKea.js +363 -0
- package/dist/Chat/index.js +1 -1
- package/dist/{Chat-CO3mCs9A.js → Chat-DjNxw5gv.js} +2 -2
- package/dist/CheckboxInput/index.d.ts +1 -1
- package/dist/CheckboxInput/index.js +1 -1
- package/dist/{CheckboxInput-C86o3XoG.js → CheckboxInput-CMsEE1_4.js} +4 -2
- package/dist/CheckboxList/index.d.ts +1 -1
- package/dist/CheckboxList/index.js +1 -1
- package/dist/{CheckboxList-BL2sDOWK.js → CheckboxList-EsIEXjK_.js} +2 -2
- package/dist/Citation/index.js +1 -1
- package/dist/{Citation-BqwJvw7o.js → Citation-DijdbUUu.js} +2 -2
- package/dist/ClickableCard/index.d.ts +2 -0
- package/dist/ClickableCard/index.js +2 -0
- package/dist/ClickableCard-Bhds4RRe.js +112 -0
- package/dist/Code/index.d.ts +3 -2
- package/dist/Code/index.js +4 -2
- package/dist/Code-yb_KOFtJ.js +299 -0
- package/dist/{CodeBlock-BQdooQy2.js → CodeBlock-CxTb6j9_.js} +8 -2
- package/dist/Collapsible/index.d.ts +2 -2
- package/dist/Collapsible/index.js +2 -2
- package/dist/Collapsible-9MC08X39.js +192 -0
- package/dist/CommandPalette/index.d.ts +2 -0
- package/dist/CommandPalette/index.js +2 -0
- package/dist/CommandPalette-BD2iODF5.js +489 -0
- package/dist/ComplexSelector/index.d.ts +2 -0
- package/dist/ComplexSelector/index.js +2 -0
- package/dist/ComplexSelector-D9iXd5cH.js +293 -0
- package/dist/ContextMenu/index.d.ts +1 -1
- package/dist/ContextMenu/index.js +1 -1
- package/dist/{ContextMenu-dA-ppaRQ.js → ContextMenu-HS_WqYIg.js} +1 -1
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.js +1 -1
- package/dist/{DateInput-BOIb0zAp.js → DateInput-DE2TN1Rq.js} +2 -2
- package/dist/DateRangeInput/index.d.ts +1 -1
- package/dist/DateRangeInput/index.js +1 -1
- package/dist/{DateRangeInput-DLcbgUBi.js → DateRangeInput-1bhPGG2s.js} +4 -4
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.js +1 -1
- package/dist/{DateTimeInput-RitYX_Yx.js → DateTimeInput-SnPdgk6P.js} +4 -4
- package/dist/Divider/index.d.ts +1 -1
- package/dist/DropdownMenu/index.js +1 -1
- package/dist/{DropdownMenu-B0gogrvG.js → DropdownMenu-UJGych6v.js} +1 -1
- package/dist/EmptyState/index.js +1 -1
- package/dist/{EmptyState-Bhlqgsg4.js → EmptyState-CUJdTYKV.js} +1 -1
- package/dist/Field/index.js +2 -2
- package/dist/{Field-VlTBsIEo.js → Field-8zRxzDHE.js} +11 -3
- package/dist/{FieldLabel-B1NRyQlS.js → FieldLabel-DmmJyX7w.js} +6 -1
- package/dist/FileInput/index.d.ts +1 -1
- package/dist/FileInput/index.js +1 -1
- package/dist/{FileInput-CYvEV503.js → FileInput-BQiwE-GB.js} +3 -3
- package/dist/FormLayout/index.d.ts +2 -0
- package/dist/FormLayout/index.js +2 -0
- package/dist/FormLayout-D47FjiOq.js +40 -0
- package/dist/HoverCard/index.d.ts +1 -1
- package/dist/Icon/index.d.ts +3 -0
- package/dist/Icon/index.js +2 -0
- package/dist/{Icon-5MdZQ18k.js → Icon-Dfr4k6-S.js} +1 -1
- package/dist/Layout/index.d.ts +2 -0
- package/dist/Layout/index.js +3 -0
- package/dist/Layout-Bed3kP0M.js +56 -0
- package/dist/LayoutPanel-C34uOq3e.js +358 -0
- package/dist/Lightbox/index.d.ts +2 -0
- package/dist/Lightbox/index.js +2 -0
- package/dist/Lightbox-CshKoB0r.js +384 -0
- package/dist/Link/index.d.ts +1 -1
- package/dist/List/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.js +1 -1
- package/dist/{Markdown-Dnlp8cVx.js → Markdown-D-Ua055V.js} +2 -2
- package/dist/MetadataList/index.js +1 -1
- package/dist/{MetadataList-DIsqS1Qb.js → MetadataList-sYph_d8Q.js} +1 -1
- package/dist/MobileNav/index.d.ts +1 -1
- package/dist/MobileNav/index.js +1 -1
- package/dist/{MobileNavToggle-aUZiDwHm.js → MobileNavToggle-DD9D01aj.js} +19 -12
- package/dist/MoreMenu/index.d.ts +1 -1
- package/dist/MoreMenu/index.js +1 -1
- package/dist/{MoreMenu-BXL6Dqsu.js → MoreMenu-BVrK5kkk.js} +1 -1
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.js +1 -1
- package/dist/{MultiSelector-Bh8or2S6.js → MultiSelector-DiYov9sF.js} +3 -3
- package/dist/NavItem/index.d.ts +1 -1
- package/dist/NavMenu/index.d.ts +1 -1
- package/dist/NavMenu/index.js +1 -1
- package/dist/{NavMenuItem-mzNQESpB.js → NavMenuItem-B-k7olt5.js} +2 -1
- package/dist/NumberInput/index.d.ts +1 -1
- package/dist/NumberInput/index.js +1 -1
- package/dist/{NumberInput-C3S-4dIu.js → NumberInput-CTYiQxHq.js} +1 -1
- package/dist/Outline/index.d.ts +2 -0
- package/dist/Outline/index.js +2 -0
- package/dist/Outline-DQfEBxlc.js +325 -0
- package/dist/OverflowList/index.d.ts +1 -1
- package/dist/OverflowList/index.js +1 -1
- package/dist/{OverflowList-Kr4iJrNV.js → OverflowList-BU5VCntl.js} +2 -2
- package/dist/Overlay/index.d.ts +1 -1
- package/dist/Pagination/index.js +1 -1
- package/dist/{Pagination-BRStpeSB.js → Pagination-HdhtykeF.js} +2 -2
- package/dist/Popover/index.d.ts +2 -1
- package/dist/Radio/index.d.ts +1 -1
- package/dist/Radio/index.js +1 -1
- package/dist/{RadioGroup-DS6oTV_j.js → RadioGroup-BqjdSCfJ.js} +1 -1
- package/dist/RadioList/index.d.ts +1 -1
- package/dist/RadioList/index.js +1 -1
- package/dist/{RadioList-pwr93I-z.js → RadioList-DI8ujXcT.js} +1 -1
- package/dist/Resizable/index.d.ts +2 -0
- package/dist/Resizable/index.js +2 -0
- package/dist/Resizable-BhSMfO5B.js +261 -0
- package/dist/ScrollableArea/index.d.ts +2 -0
- package/dist/ScrollableArea/index.js +2 -0
- package/dist/ScrollableArea-DQDYjnxO.js +78 -0
- package/dist/Section/index.d.ts +2 -0
- package/dist/Section/index.js +2 -0
- package/dist/Section-C48Wqfc7.js +68 -0
- package/dist/SelectableCard/index.d.ts +2 -0
- package/dist/SelectableCard/index.js +2 -0
- package/dist/SelectableCard-Bj5s_tIN.js +108 -0
- package/dist/Selector/index.d.ts +1 -1
- package/dist/Selector/index.js +1 -1
- package/dist/{Selector-DvEUIVEC.js → Selector-Da-2BO3q.js} +1 -1
- package/dist/SideNav/index.d.ts +1 -1
- package/dist/SideNav/index.js +2 -1
- package/dist/{SideNav-B7LX4RcP.js → SideNav-B-Om6Bz3.js} +49 -27
- package/dist/Slider/index.js +1 -1
- package/dist/{Slider-DTnWxtnb.js → Slider-D8h_RKcF.js} +1 -1
- package/dist/Stepper/index.d.ts +2 -0
- package/dist/Stepper/index.js +2 -0
- package/dist/Stepper-BZ_8SEZt.js +423 -0
- package/dist/Switch/index.d.ts +1 -1
- package/dist/Switch/index.js +1 -1
- package/dist/{Switch-CNdnr5TP.js → Switch-SesQzPGZ.js} +4 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.js +2 -2
- package/dist/TabList-Cnc2Hs1H.js +380 -0
- package/dist/Table/index.d.ts +2 -1
- package/dist/Table/index.js +1 -1
- package/dist/{Table-D5zWaITo.js → Table-D-LhAy_J.js} +6 -6
- package/dist/Text/index.d.ts +3 -2
- package/dist/Text/index.js +1 -1
- package/dist/{Text-CKd7e3gK.js → Text-BHVghsWo.js} +12 -2
- package/dist/TextArea/index.d.ts +1 -1
- package/dist/TextArea/index.js +1 -1
- package/dist/{TextArea-BL0NuB99.js → TextArea-Cv9UVbzS.js} +5 -3
- package/dist/TextInput/index.d.ts +1 -1
- package/dist/TextInput/index.js +1 -1
- package/dist/{TextInput-B0IKC7g5.js → TextInput-BasnjVvy.js} +5 -3
- package/dist/Theme/index.d.ts +2 -0
- package/dist/Theme/index.js +2 -0
- package/dist/Theme-BuUiiJNr.js +429 -0
- package/dist/Thumbnail/index.js +1 -1
- package/dist/{Thumbnail-DMOgWncm.js → Thumbnail-Dc1UpykG.js} +2 -2
- package/dist/{TimeField-DeQ1ukHl.js → TimeField-C7t9Knq9.js} +2 -2
- package/dist/TimeInput/index.d.ts +1 -1
- package/dist/TimeInput/index.js +1 -1
- package/dist/{TimeInput-jb1nLqZk.js → TimeInput-BXxCOY98.js} +2 -2
- package/dist/Timer/index.d.ts +2 -0
- package/dist/Timer/index.js +2 -0
- package/dist/Timer-B7GV6hqd.js +134 -0
- package/dist/Timestamp/index.d.ts +1 -1
- package/dist/Timestamp/index.js +1 -1
- package/dist/{Timestamp-DrWwVQBL.js → Timestamp-DlZSmgCJ.js} +3 -3
- package/dist/ToggleButton/index.d.ts +1 -1
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.js +1 -1
- package/dist/{Token-CV2J94bn.js → Token-wt4e80IM.js} +1 -1
- package/dist/Tokenizer/index.d.ts +1 -1
- package/dist/Tokenizer/index.js +1 -1
- package/dist/{Tokenizer-DF9r4hTW.js → Tokenizer-nmTqdS9n.js} +3 -3
- package/dist/Toolbar/index.d.ts +1 -1
- package/dist/Tooltip/index.d.ts +1 -1
- package/dist/TopNav/index.d.ts +1 -1
- package/dist/TopNav/index.js +1 -1
- package/dist/{TopNav-BH_s3uap.js → TopNav-notp-mJx.js} +58 -32
- package/dist/TreeList/index.js +1 -1
- package/dist/{TreeList-D9cR-w7r.js → TreeList-s1xBQ0qq.js} +2 -2
- package/dist/Typeahead/index.d.ts +1 -1
- package/dist/Typeahead/index.js +1 -1
- package/dist/{Typeahead-s4DC1Qem.js → Typeahead-VAuiCurV.js} +3 -3
- package/dist/composables/index.d.ts +3 -2
- package/dist/composables/index.js +5 -2
- package/dist/composables-CVfjp9h4.js +502 -0
- package/dist/context-BjNya0v8.js +19 -0
- package/dist/context-Cfjh8te1.js +29 -0
- package/dist/{context-BshXcNYX.js → context-Dbo22sck.js} +138 -0
- package/dist/context-O2Vb8cJl.js +57 -0
- package/dist/index-1AZ4KZhg.d.ts +96 -0
- package/dist/index-1uRMrk63.d.ts +54 -0
- package/dist/{index-FEy8qFSD.d.ts → index-BHqRH7QW.d.ts} +2 -2
- package/dist/index-BMrggCw-.d.ts +52 -0
- package/dist/{index-BlWLperN.d.ts → index-BUXNRekN.d.ts} +2 -2
- package/dist/index-Bainr_3n.d.ts +31 -0
- package/dist/index-Be1czg3M.d.ts +167 -0
- package/dist/{index-Dbmgcm8a.d.ts → index-BeR-1LgF.d.ts} +2 -0
- package/dist/{index-DXDGk38y.d.ts → index-Bn_odHQ9.d.ts} +1 -1
- package/dist/index-BrJzFA5X.d.ts +38 -0
- package/dist/{index-AkMWQ97a.d.ts → index-BtPZKO20.d.ts} +3 -3
- package/dist/index-Bu0Zd1uw.d.ts +38 -0
- package/dist/{index-BDZCJ9ri.d.ts → index-BuubzuE8.d.ts} +2 -2
- package/dist/index-By2mSzUA.d.ts +67 -0
- package/dist/index-C59PdX9L.d.ts +141 -0
- package/dist/{index-BkIgRYGz.d.ts → index-C5p2NeCr.d.ts} +2 -2
- package/dist/{index-CQ9F1f_F.d.ts → index-C6iJwTL0.d.ts} +324 -145
- package/dist/{index-B4OOtNP8.d.ts → index-C7mxUcDR.d.ts} +2 -2
- package/dist/{index-BSRk8MFK.d.ts → index-C8wDPDcP.d.ts} +1 -1
- package/dist/index-CDdRQQF3.d.ts +170 -0
- package/dist/index-COqjznX0.d.ts +47 -0
- package/dist/index-CRizexSC.d.ts +147 -0
- package/dist/{index-Bc0dgVM5.d.ts → index-CTolyeii.d.ts} +4 -4
- package/dist/index-CVn0GBdB.d.ts +115 -0
- package/dist/index-Cm_TiLXU.d.ts +22 -0
- package/dist/index-Cn-sSds-.d.ts +68 -0
- package/dist/index-CsVS37na.d.ts +81 -0
- package/dist/{index-5R_pi3eT.d.ts → index-D-ZuubCK.d.ts} +3 -3
- package/dist/{index-g03bmR4K.d.ts → index-D0TlUOtG.d.ts} +2 -2
- package/dist/index-DA52oIdw.d.ts +171 -0
- package/dist/{index-D3V7yRUP.d.ts → index-DOUEn7V0.d.ts} +4 -4
- package/dist/{index-CCA4R0Mf.d.ts → index-DT9S92sh.d.ts} +31 -6
- package/dist/{index-CR6sUmRT.d.ts → index-DXSs3rwa.d.ts} +3 -107
- package/dist/{index--dh0s8Li.d.ts → index-DfgHJE7H.d.ts} +1 -1
- package/dist/{index-CNcQmDrK.d.ts → index-DoFCm2Q2.d.ts} +71 -0
- package/dist/{index-mQ6EPmaG.d.ts → index-DsyKhauk.d.ts} +78 -9
- package/dist/{index-12ObcW99.d.ts → index-DtjAdYEc.d.ts} +2 -2
- package/dist/{index-Byar3h1e.d.ts → index-HV6W3xCx.d.ts} +1 -1
- package/dist/{index-CsJpQElv.d.ts → index-NzLDrOkk.d.ts} +2 -2
- package/dist/{index-BnNh5Iml.d.ts → index-SMh42NI8.d.ts} +99 -2
- package/dist/{index-Q4gqBSIZ.d.ts → index-fa72tWIU.d.ts} +1 -1
- package/dist/{index-Bqb_Fyju.d.ts → index-jdjcb3Js.d.ts} +2 -2
- package/dist/{index-BhYFxnjV.d.ts → index-kaKBOZSU.d.ts} +2 -2
- package/dist/index-nKlTsNfV.d.ts +42 -0
- package/dist/index.d.ts +84 -63
- package/dist/index.js +118 -91
- package/dist/locale/index.d.ts +1 -1
- package/dist/locale/index.js +1 -1
- package/dist/size-BuTzpgnR.d.ts +14 -0
- package/dist/size-xcIqExkS.js +79 -0
- package/dist/syntaxTheme-Bcs1YMF7.d.ts +38 -0
- package/dist/syntaxTheme-ClpWALZX.js +75 -0
- package/dist/types-Bt-lSgYX.d.ts +65 -0
- package/dist/types-DZoEm_DG.d.ts +97 -0
- package/dist/{index-Bovw9_8d.d.ts → types-Db3Owy8Q.d.ts} +1 -36
- package/dist/types-JktRxujg.d.ts +107 -0
- package/dist/useAppShellMobile-DTsyuAJ4.js +19 -0
- package/dist/useClickableContainer-DyNpnSEa.js +112 -0
- package/dist/useResizable-CeESZS1v.d.ts +72 -0
- package/dist/useScrollableArea-DDk_CluT.js +172 -0
- package/package.json +73 -1
- package/styles/app-shell.css +151 -0
- package/styles/aspect-ratio.css +49 -0
- package/styles/card.css +5 -1
- package/styles/carousel.css +120 -0
- package/styles/clickable-card.css +101 -0
- package/styles/collapsible.css +37 -0
- package/styles/command-palette.css +183 -0
- package/styles/complex-selector.css +114 -0
- package/styles/field.css +12 -0
- package/styles/form-layout.css +31 -0
- package/styles/heading.css +25 -19
- package/styles/layout.css +280 -0
- package/styles/lightbox.css +144 -0
- package/styles/media-theme.css +51 -0
- package/styles/outline.css +124 -0
- package/styles/resize-handle.css +128 -0
- package/styles/scrollable-area.css +50 -0
- package/styles/section.css +60 -0
- package/styles/side-nav.css +26 -0
- package/styles/stepper.css +357 -0
- package/styles/tab-menu.css +91 -0
- package/styles/text.css +63 -14
- package/styles/theme.css +29 -0
- package/styles/timer.css +34 -0
- package/styles.css +18 -0
- package/dist/Collapsible-BYg9soTk.js +0 -102
- package/dist/TabList-LV1U4ZD6.js +0 -184
- package/dist/composables-Dq9RS33w.js +0 -111
- package/dist/index-BzqRns96.d.ts +0 -64
- package/dist/index-TnaIHsCS.d.ts +0 -87
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Component, VNodeChild } from "vue";
|
|
2
|
+
//#region src/Icon/types.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Icon sizes are expressed in `rem` so they scale with the root font-size.
|
|
5
|
+
* Values are the px-equivalents at a 16px root: 12, 16, 20, and 24px.
|
|
6
|
+
*/
|
|
7
|
+
type IconSize = 'xsm' | 'sm' | 'md' | 'lg';
|
|
8
|
+
interface IconColorMap {
|
|
9
|
+
accent: true;
|
|
10
|
+
blue: true;
|
|
11
|
+
cyan: true;
|
|
12
|
+
disabled: true;
|
|
13
|
+
error: true;
|
|
14
|
+
gray: true;
|
|
15
|
+
green: true;
|
|
16
|
+
inherit: true;
|
|
17
|
+
orange: true;
|
|
18
|
+
pink: true;
|
|
19
|
+
primary: true;
|
|
20
|
+
purple: true;
|
|
21
|
+
red: true;
|
|
22
|
+
secondary: true;
|
|
23
|
+
success: true;
|
|
24
|
+
teal: true;
|
|
25
|
+
tertiary: true;
|
|
26
|
+
warning: true;
|
|
27
|
+
yellow: true;
|
|
28
|
+
}
|
|
29
|
+
type IconColor = Extract<keyof IconColorMap, string>;
|
|
30
|
+
/**
|
|
31
|
+
* The semantic names of the artwork astryx-vue keeps for its own chrome.
|
|
32
|
+
*
|
|
33
|
+
* A name describes what the icon is for, not one particular drawing, so a theme
|
|
34
|
+
* can replace the artwork with one declaration. Applications never pass these
|
|
35
|
+
* names: the artwork is a library implementation detail, and a `icon` prop or
|
|
36
|
+
* slot takes a CSS icon class or the application's own component instead.
|
|
37
|
+
*/
|
|
38
|
+
type IconName = 'chevronDown' | 'chevronLeft' | 'chevronRight' | 'check' | 'moreHorizontal' | 'copy' | 'calendar' | 'clock' | 'upload' | 'arrowUp' | 'arrowDown' | 'close' | 'funnel' | 'image';
|
|
39
|
+
/**
|
|
40
|
+
* A built-in name, or any other string.
|
|
41
|
+
*
|
|
42
|
+
* The `(string & {})` intersection keeps the built-in names available for
|
|
43
|
+
* autocomplete while allowing keys contributed by a component or application.
|
|
44
|
+
*/
|
|
45
|
+
type ExtendedIconName = IconName | (string & {});
|
|
46
|
+
interface IconProps {
|
|
47
|
+
/**
|
|
48
|
+
* The icon to render. Three forms are accepted:
|
|
49
|
+
*
|
|
50
|
+
* - a string, treated as a CSS icon class you provide — for example an
|
|
51
|
+
* UnoCSS icon such as `'i-carbon-search'`, or your own class;
|
|
52
|
+
* - a name from the library's own chrome, which only the components use;
|
|
53
|
+
* - a component, rendered as it is.
|
|
54
|
+
*
|
|
55
|
+
* Omit it when the default slot provides the artwork instead.
|
|
56
|
+
*/
|
|
57
|
+
icon?: ExtendedIconName | Component;
|
|
58
|
+
/**
|
|
59
|
+
* The color of the icon.
|
|
60
|
+
*
|
|
61
|
+
* `inherit` (the default) leaves the icon at the surrounding text color,
|
|
62
|
+
* which is what you want for an icon next to a label. Use a semantic color
|
|
63
|
+
* only when the color itself carries meaning.
|
|
64
|
+
*
|
|
65
|
+
* @default 'inherit'
|
|
66
|
+
*/
|
|
67
|
+
color?: IconColor;
|
|
68
|
+
/**
|
|
69
|
+
* The size of the icon.
|
|
70
|
+
*
|
|
71
|
+
* An explicit value wins. When omitted, Icon uses the nearest default
|
|
72
|
+
* supplied by an owning astryx-vue component for its icon slot, then falls
|
|
73
|
+
* back to `md`.
|
|
74
|
+
*/
|
|
75
|
+
size?: IconSize;
|
|
76
|
+
/**
|
|
77
|
+
* Accessible name for the icon.
|
|
78
|
+
*
|
|
79
|
+
* Set it only when the icon is meaningful on its own, such as a standalone
|
|
80
|
+
* status glyph with no adjacent text. A non-empty `label` renders the icon as
|
|
81
|
+
* `role="img"` with this string as `aria-label`; omitting it (or passing an
|
|
82
|
+
* empty string) keeps the icon `aria-hidden="true"` as decoration.
|
|
83
|
+
*
|
|
84
|
+
* Do not set `label` when an interactive parent such as a button or a link
|
|
85
|
+
* already names the control, or screen readers announce the name twice.
|
|
86
|
+
*/
|
|
87
|
+
label?: string;
|
|
88
|
+
}
|
|
89
|
+
interface IconSlots {
|
|
90
|
+
/**
|
|
91
|
+
* The SVG markup to render. Use it instead of the `icon` prop when the
|
|
92
|
+
* artwork is written inline.
|
|
93
|
+
*/
|
|
94
|
+
default?: () => VNodeChild;
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
export { IconSize as a, IconProps as i, IconColor as n, IconSlots as o, IconName as r, ExtendedIconName as t };
|
|
@@ -36,39 +36,4 @@ interface PopoverProps {
|
|
|
36
36
|
hasEscapeDismiss?: boolean;
|
|
37
37
|
}
|
|
38
38
|
//#endregion
|
|
39
|
-
|
|
40
|
-
declare var __VLS_1: {}, __VLS_9: {};
|
|
41
|
-
type __VLS_Slots = {} & {
|
|
42
|
-
default?: (props: typeof __VLS_1) => any;
|
|
43
|
-
} & {
|
|
44
|
-
content?: (props: typeof __VLS_9) => any;
|
|
45
|
-
};
|
|
46
|
-
declare const __VLS_base: import("vue").DefineComponent<PopoverProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
47
|
-
openChange: (isOpen: boolean) => any;
|
|
48
|
-
}, string, import("vue").PublicProps, Readonly<PopoverProps> & Readonly<{
|
|
49
|
-
onOpenChange?: ((isOpen: boolean) => any) | undefined;
|
|
50
|
-
}>, {
|
|
51
|
-
label: string;
|
|
52
|
-
width: string | number;
|
|
53
|
-
padding: PopoverPadding;
|
|
54
|
-
hasAutoFocus: boolean;
|
|
55
|
-
placement: LayerPlacement;
|
|
56
|
-
alignment: LayerAlignment;
|
|
57
|
-
isEnabled: boolean;
|
|
58
|
-
isOpen: boolean;
|
|
59
|
-
role: PopoverRole;
|
|
60
|
-
isModal: boolean;
|
|
61
|
-
hasCloseButton: boolean;
|
|
62
|
-
closeButtonLabel: string;
|
|
63
|
-
hasLightDismiss: boolean;
|
|
64
|
-
hasEscapeDismiss: boolean;
|
|
65
|
-
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
66
|
-
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
67
|
-
declare const _default: typeof __VLS_export;
|
|
68
|
-
type __VLS_WithSlots<T, S> = T & {
|
|
69
|
-
new (): {
|
|
70
|
-
$slots: S;
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
//#endregion
|
|
74
|
-
export { PopoverProps as a, PopoverPlacement as i, PopoverAlignment as n, PopoverRole as o, PopoverPadding as r, _default as t };
|
|
39
|
+
export { PopoverRole as a, PopoverProps as i, PopoverPadding as n, PopoverPlacement as r, PopoverAlignment as t };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { VNode, VNodeChild } from "vue";
|
|
2
|
+
//#region src/Table/types.d.ts
|
|
3
|
+
type TableDensity = 'compact' | 'balanced' | 'spacious';
|
|
4
|
+
type TableDividers = 'rows' | 'columns' | 'grid' | 'none';
|
|
5
|
+
type TableTextOverflow = 'wrap' | 'truncate';
|
|
6
|
+
type TableVerticalAlign = 'top' | 'middle' | 'bottom';
|
|
7
|
+
type TableColumnAlign = 'start' | 'center' | 'end';
|
|
8
|
+
type TableSortDirection = 'ascending' | 'descending';
|
|
9
|
+
interface ProportionalWidth {
|
|
10
|
+
type: 'proportional';
|
|
11
|
+
value: number;
|
|
12
|
+
minWidth?: number;
|
|
13
|
+
}
|
|
14
|
+
interface PixelWidth {
|
|
15
|
+
type: 'pixel';
|
|
16
|
+
value: number;
|
|
17
|
+
}
|
|
18
|
+
type ColumnWidth = ProportionalWidth | PixelWidth;
|
|
19
|
+
interface TableSortEntry<TSortKey extends string = string> {
|
|
20
|
+
sortKey: TSortKey;
|
|
21
|
+
direction: TableSortDirection;
|
|
22
|
+
}
|
|
23
|
+
type TableSortState<TSortKey extends string = string> = TableSortEntry<TSortKey>[];
|
|
24
|
+
interface TableColumn<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
25
|
+
key: string;
|
|
26
|
+
header?: string;
|
|
27
|
+
width?: ColumnWidth;
|
|
28
|
+
align?: TableColumnAlign;
|
|
29
|
+
verticalAlign?: TableVerticalAlign;
|
|
30
|
+
sortable?: boolean | {
|
|
31
|
+
sortKey?: string;
|
|
32
|
+
compare?: (a: T, b: T) => number;
|
|
33
|
+
};
|
|
34
|
+
/** Field key used by the filtering plugin. */
|
|
35
|
+
filter?: string;
|
|
36
|
+
renderCell?: (item: T, index: number) => VNodeChild;
|
|
37
|
+
}
|
|
38
|
+
interface TableFilterField {
|
|
39
|
+
key: string;
|
|
40
|
+
label: string;
|
|
41
|
+
type: 'string' | 'enum';
|
|
42
|
+
options?: readonly {
|
|
43
|
+
value: string;
|
|
44
|
+
label: string;
|
|
45
|
+
}[];
|
|
46
|
+
}
|
|
47
|
+
type TableFilterValue = string | string[];
|
|
48
|
+
type TableFilterState = Record<string, TableFilterValue>;
|
|
49
|
+
interface TableSortContribution {
|
|
50
|
+
direction: TableSortDirection | null;
|
|
51
|
+
rank: number | null;
|
|
52
|
+
label: string;
|
|
53
|
+
onClick: (event: MouseEvent) => void;
|
|
54
|
+
}
|
|
55
|
+
interface TableFilterContribution {
|
|
56
|
+
variant: 'inline' | 'popover';
|
|
57
|
+
field: TableFilterField;
|
|
58
|
+
value: TableFilterValue | null;
|
|
59
|
+
onChange: (value: TableFilterValue | null) => void;
|
|
60
|
+
}
|
|
61
|
+
interface TableSelectionContribution<T> {
|
|
62
|
+
isAllSelected: () => boolean;
|
|
63
|
+
isIndeterminate: () => boolean;
|
|
64
|
+
isSelected: (row: T) => boolean;
|
|
65
|
+
isSelectable?: (row: T) => boolean;
|
|
66
|
+
selectAll: (selected: boolean) => void;
|
|
67
|
+
selectRow: (row: T, selected: boolean) => void;
|
|
68
|
+
rowLabel?: (row: T) => string;
|
|
69
|
+
hasRowHighlight?: boolean;
|
|
70
|
+
}
|
|
71
|
+
interface TablePlugin<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
72
|
+
transformColumns?: (columns: TableColumn<T>[]) => TableColumn<T>[];
|
|
73
|
+
sortFor?: (column: TableColumn<T>) => TableSortContribution | null;
|
|
74
|
+
filterFor?: (column: TableColumn<T>) => TableFilterContribution | null;
|
|
75
|
+
selection?: TableSelectionContribution<T>;
|
|
76
|
+
widthFor?: (column: TableColumn<T>) => number | undefined;
|
|
77
|
+
onColumnResizeEnd?: (key: string, width: number) => void;
|
|
78
|
+
below?: () => VNodeChild;
|
|
79
|
+
}
|
|
80
|
+
interface TableProps<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
81
|
+
data?: readonly T[];
|
|
82
|
+
columns?: readonly TableColumn<T>[];
|
|
83
|
+
idKey?: string;
|
|
84
|
+
density?: TableDensity;
|
|
85
|
+
dividers?: TableDividers;
|
|
86
|
+
isStriped?: boolean;
|
|
87
|
+
hasHover?: boolean;
|
|
88
|
+
verticalAlign?: TableVerticalAlign;
|
|
89
|
+
textOverflow?: TableTextOverflow;
|
|
90
|
+
plugins?: Record<string, TablePlugin<T> | undefined>;
|
|
91
|
+
label?: string;
|
|
92
|
+
}
|
|
93
|
+
interface TableSlots {
|
|
94
|
+
default?: () => VNode[];
|
|
95
|
+
empty?: () => VNode[];
|
|
96
|
+
}
|
|
97
|
+
interface TableRowProps {
|
|
98
|
+
isHeaderRow?: boolean;
|
|
99
|
+
}
|
|
100
|
+
interface TableCellProps {
|
|
101
|
+
align?: TableColumnAlign;
|
|
102
|
+
colSpan?: number;
|
|
103
|
+
rowSpan?: number;
|
|
104
|
+
headers?: string;
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
export { TableSortEntry as _, TableColumn as a, TableVerticalAlign as b, TableDividers as c, TableFilterValue as d, TablePlugin as f, TableSortDirection as g, TableSlots as h, TableCellProps as i, TableFilterField as l, TableRowProps as m, PixelWidth as n, TableColumnAlign as o, TableProps as p, ProportionalWidth as r, TableDensity as s, ColumnWidth as t, TableFilterState as u, TableSortState as v, TableTextOverflow as y };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { inject } from "vue";
|
|
2
|
+
//#region src/composables/useAppShellMobile.ts
|
|
3
|
+
const appShellMobileKey = Symbol("astryx-app-shell-mobile");
|
|
4
|
+
const fallback = {
|
|
5
|
+
isMobile: false,
|
|
6
|
+
isMobileNavOpen: false,
|
|
7
|
+
isMobileNavEnabled: false,
|
|
8
|
+
hasAutoToggle: true,
|
|
9
|
+
hasSideNav: false,
|
|
10
|
+
toggleMobileNav: () => {},
|
|
11
|
+
openMobileNav: () => {},
|
|
12
|
+
closeMobileNav: () => {}
|
|
13
|
+
};
|
|
14
|
+
/** 外壳外面、或者关掉了移动导航时,返回一组不会做事的默认值。 */
|
|
15
|
+
function useAppShellMobile() {
|
|
16
|
+
return inject(appShellMobileKey, fallback);
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { useAppShellMobile as n, appShellMobileKey as t };
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
//#region src/composables/useClickableContainer.ts
|
|
2
|
+
/**
|
|
3
|
+
* 对应原版 Astryx 的 `hooks/useClickableContainer`。
|
|
4
|
+
*
|
|
5
|
+
* 让整块容器可点,同时把点在嵌套按钮、链接、输入框上的点击留给那些控件自己。
|
|
6
|
+
* ClickableCard 和 SelectableCard 都走这里,避免两套“点到谁算谁”的判断。
|
|
7
|
+
*/
|
|
8
|
+
const INTERACTIVE_SELECTORS = [
|
|
9
|
+
"button",
|
|
10
|
+
"a",
|
|
11
|
+
"input",
|
|
12
|
+
"select",
|
|
13
|
+
"textarea",
|
|
14
|
+
"[role=\"button\"]",
|
|
15
|
+
"[role=\"link\"]",
|
|
16
|
+
"[role=\"checkbox\"]",
|
|
17
|
+
"[role=\"radio\"]",
|
|
18
|
+
"[role=\"switch\"]",
|
|
19
|
+
"[role=\"tab\"]",
|
|
20
|
+
"[role=\"menuitem\"]",
|
|
21
|
+
"[role=\"option\"]",
|
|
22
|
+
"[role=\"combobox\"]",
|
|
23
|
+
"[role=\"listbox\"]",
|
|
24
|
+
"[role=\"slider\"]",
|
|
25
|
+
"[role=\"spinbutton\"]",
|
|
26
|
+
"[data-pressable-container]"
|
|
27
|
+
].join(",");
|
|
28
|
+
const NON_INTERACTIVE_SELECTORS = "[aria-readonly=\"true\"]";
|
|
29
|
+
function hasInteractiveAncestor(element, root) {
|
|
30
|
+
let current = element;
|
|
31
|
+
while (current != null && current !== root && current !== document.body) {
|
|
32
|
+
if (current.matches(INTERACTIVE_SELECTORS) && !current.matches(NON_INTERACTIVE_SELECTORS)) return true;
|
|
33
|
+
current = current.parentElement;
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
function hasTextSelection(node) {
|
|
38
|
+
if (typeof document === "undefined" || document.getSelection == null) return false;
|
|
39
|
+
const selection = document.getSelection();
|
|
40
|
+
if (selection == null || selection.isCollapsed) return false;
|
|
41
|
+
return node.contains(selection.anchorNode);
|
|
42
|
+
}
|
|
43
|
+
function openInNewTab(href) {
|
|
44
|
+
window.open(href, "_blank", "noopener");
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 把容器的 click / mouseup 交给调用方绑到根元素上。
|
|
48
|
+
* 组件挂载后会给容器加上 `data-pressable-container`,嵌套的可点容器因此不会互相抢走点击。
|
|
49
|
+
*/
|
|
50
|
+
function useClickableContainer(options) {
|
|
51
|
+
function markContainer() {
|
|
52
|
+
const container = options.containerRef.value;
|
|
53
|
+
if (container != null) container.dataset.pressableContainer = "true";
|
|
54
|
+
}
|
|
55
|
+
function onClick(event) {
|
|
56
|
+
markContainer();
|
|
57
|
+
if (options.disabled) return;
|
|
58
|
+
const container = options.containerRef.value;
|
|
59
|
+
if (container == null) return;
|
|
60
|
+
if (hasTextSelection(container)) return;
|
|
61
|
+
const target = event.target;
|
|
62
|
+
if (!(target instanceof Element)) return;
|
|
63
|
+
if (target !== event.currentTarget && hasInteractiveAncestor(target, container)) return;
|
|
64
|
+
options.onClick?.(event);
|
|
65
|
+
if (event.defaultPrevented) return;
|
|
66
|
+
const href = options.href;
|
|
67
|
+
if (href != null && href !== "") {
|
|
68
|
+
if (options.target === "_blank" || event.metaKey || event.ctrlKey) {
|
|
69
|
+
openInNewTab(href);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const interactive = options.interactiveRef?.value;
|
|
73
|
+
if (interactive != null) {
|
|
74
|
+
interactive.click();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
window.location.assign(href);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (options.onClick == null) {
|
|
81
|
+
const interactive = options.interactiveRef?.value;
|
|
82
|
+
if (interactive != null) {
|
|
83
|
+
interactive.dispatchEvent(new MouseEvent("click", {
|
|
84
|
+
bubbles: true,
|
|
85
|
+
cancelable: true,
|
|
86
|
+
button: event.button,
|
|
87
|
+
ctrlKey: event.ctrlKey,
|
|
88
|
+
metaKey: event.metaKey,
|
|
89
|
+
shiftKey: event.shiftKey,
|
|
90
|
+
altKey: event.altKey
|
|
91
|
+
}));
|
|
92
|
+
event.stopPropagation();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function onMouseUp(event) {
|
|
97
|
+
if (options.disabled) return;
|
|
98
|
+
const href = options.href;
|
|
99
|
+
if (href == null || href === "" || event.button !== 1) return;
|
|
100
|
+
const container = options.containerRef.value;
|
|
101
|
+
const target = event.target;
|
|
102
|
+
if (container == null || !(target instanceof Element)) return;
|
|
103
|
+
if (target !== event.currentTarget && hasInteractiveAncestor(target, container)) return;
|
|
104
|
+
openInNewTab(href);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
onClick,
|
|
108
|
+
onMouseUp
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//#endregion
|
|
112
|
+
export { useClickableContainer as n, INTERACTIVE_SELECTORS as t };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { n as PixelWidth } from "./types-JktRxujg.js";
|
|
2
|
+
import { Ref } from "vue";
|
|
3
|
+
//#region src/composables/useResizable.d.ts
|
|
4
|
+
type ResizableDirection = 'horizontal' | 'vertical';
|
|
5
|
+
interface ResizablePercentSize {
|
|
6
|
+
type: 'percent';
|
|
7
|
+
value: number;
|
|
8
|
+
min?: PixelWidth;
|
|
9
|
+
max?: PixelWidth;
|
|
10
|
+
}
|
|
11
|
+
type ResizableSize = number | `${number}px` | `${number}%` | PixelWidth | ResizablePercentSize;
|
|
12
|
+
interface ResizableRegionConfig {
|
|
13
|
+
defaultSize?: ResizableSize | string;
|
|
14
|
+
minSize?: ResizableSize | string;
|
|
15
|
+
maxSize?: ResizableSize | string;
|
|
16
|
+
collapsible?: boolean;
|
|
17
|
+
collapsedSize?: number;
|
|
18
|
+
snaps?: number[];
|
|
19
|
+
/** Cascade priority. A lower number gives up space first when the shared container is narrower than the regions. */
|
|
20
|
+
shrinkOrder?: number;
|
|
21
|
+
}
|
|
22
|
+
interface UseResizableSingleOptions extends ResizableRegionConfig {
|
|
23
|
+
containerRef?: Ref<HTMLElement | null>;
|
|
24
|
+
direction?: ResizableDirection;
|
|
25
|
+
autoSaveId?: string;
|
|
26
|
+
defaultIsCollapsed?: boolean;
|
|
27
|
+
isCollapsed?: boolean;
|
|
28
|
+
onSizeChange?: (size: number) => void;
|
|
29
|
+
onCollapseChange?: (isCollapsed: boolean) => void;
|
|
30
|
+
}
|
|
31
|
+
interface UseResizableMultiConfig {
|
|
32
|
+
direction?: ResizableDirection;
|
|
33
|
+
containerRef?: Ref<HTMLElement | null>;
|
|
34
|
+
regions: Record<string, ResizableRegionConfig>;
|
|
35
|
+
autoSaveId?: string;
|
|
36
|
+
}
|
|
37
|
+
interface ResizableProps {
|
|
38
|
+
_size: number;
|
|
39
|
+
_isCollapsed: boolean;
|
|
40
|
+
_onResizeStart: () => void;
|
|
41
|
+
_onResizeMove: (delta: number) => void;
|
|
42
|
+
_onResizeEnd: () => void;
|
|
43
|
+
_onResizeCancel?: () => void;
|
|
44
|
+
_minSizePx: number;
|
|
45
|
+
_maxSizePx: number;
|
|
46
|
+
_snaps: number[];
|
|
47
|
+
_collapsedSize: number;
|
|
48
|
+
_collapsible: boolean;
|
|
49
|
+
_direction?: ResizableDirection;
|
|
50
|
+
_isResizableProps: true;
|
|
51
|
+
}
|
|
52
|
+
interface ResizableRegion {
|
|
53
|
+
size: number;
|
|
54
|
+
isCollapsed: boolean;
|
|
55
|
+
collapse: () => void;
|
|
56
|
+
expand: () => void;
|
|
57
|
+
resize: (size: number) => void;
|
|
58
|
+
props: ResizableProps;
|
|
59
|
+
}
|
|
60
|
+
declare function percent(value: number, options: {
|
|
61
|
+
min: PixelWidth;
|
|
62
|
+
max?: never;
|
|
63
|
+
} | {
|
|
64
|
+
min?: never;
|
|
65
|
+
max: PixelWidth;
|
|
66
|
+
}): ResizablePercentSize;
|
|
67
|
+
declare function useResizable(options: UseResizableMultiConfig): Record<string, ResizableRegion>;
|
|
68
|
+
declare function useResizable(options: UseResizableSingleOptions): ResizableRegion;
|
|
69
|
+
type UseResizableOptions = UseResizableSingleOptions | UseResizableMultiConfig;
|
|
70
|
+
type ResizableState = ResizableRegion;
|
|
71
|
+
//#endregion
|
|
72
|
+
export { ResizableRegionConfig as a, UseResizableMultiConfig as c, percent as d, useResizable as f, ResizableRegion as i, UseResizableOptions as l, ResizablePercentSize as n, ResizableSize as o, ResizableProps as r, ResizableState as s, ResizableDirection as t, UseResizableSingleOptions as u };
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { computed, onBeforeUnmount, onMounted, ref, watch } from "vue";
|
|
2
|
+
//#region src/composables/useScrollableArea.ts
|
|
3
|
+
const TOLERANCE = 1;
|
|
4
|
+
const idleAxis = () => ({
|
|
5
|
+
isScrollable: false,
|
|
6
|
+
atStart: true,
|
|
7
|
+
atEnd: true
|
|
8
|
+
});
|
|
9
|
+
function mappingFor(element) {
|
|
10
|
+
const style = getComputedStyle(element);
|
|
11
|
+
const mode = style.writingMode.toLowerCase();
|
|
12
|
+
const vertical = mode.startsWith("vertical") || mode.startsWith("sideways");
|
|
13
|
+
const rtl = style.direction === "rtl";
|
|
14
|
+
if (!vertical) return {
|
|
15
|
+
inline: "x",
|
|
16
|
+
block: "y",
|
|
17
|
+
inlineReversed: rtl,
|
|
18
|
+
blockReversed: false
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
inline: "y",
|
|
22
|
+
block: "x",
|
|
23
|
+
inlineReversed: mode === "sideways-lr" ? !rtl : rtl,
|
|
24
|
+
blockReversed: mode.endsWith("-rl")
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function extent(element, axis) {
|
|
28
|
+
if (axis === "x") return {
|
|
29
|
+
client: element.clientWidth,
|
|
30
|
+
content: element.scrollWidth,
|
|
31
|
+
offset: element.scrollLeft
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
client: element.clientHeight,
|
|
35
|
+
content: element.scrollHeight,
|
|
36
|
+
offset: element.scrollTop
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function useScrollableArea(options) {
|
|
40
|
+
const viewport = ref(null);
|
|
41
|
+
const content = ref(null);
|
|
42
|
+
const inline = ref(idleAxis());
|
|
43
|
+
const block = ref(idleAxis());
|
|
44
|
+
const overflowInline = ref(false);
|
|
45
|
+
const overflowBlock = ref(false);
|
|
46
|
+
const mapping = ref({
|
|
47
|
+
inline: "x",
|
|
48
|
+
block: "y",
|
|
49
|
+
inlineReversed: false,
|
|
50
|
+
blockReversed: false
|
|
51
|
+
});
|
|
52
|
+
let observer;
|
|
53
|
+
const axis = computed(() => options.axis ?? "block");
|
|
54
|
+
const overscroll = computed(() => options.overscroll ?? "allow");
|
|
55
|
+
const stickyContainment = computed(() => options.stickyContainment ?? "whenScrollable");
|
|
56
|
+
function requested(name) {
|
|
57
|
+
return axis.value === name || axis.value === "both";
|
|
58
|
+
}
|
|
59
|
+
function sameAxis(current, next) {
|
|
60
|
+
return current.isScrollable === next.isScrollable && current.atStart === next.atStart && current.atEnd === next.atEnd;
|
|
61
|
+
}
|
|
62
|
+
function measure() {
|
|
63
|
+
const element = viewport.value;
|
|
64
|
+
if (element == null) return;
|
|
65
|
+
const nextMapping = mappingFor(element);
|
|
66
|
+
const read = (name, reversed) => {
|
|
67
|
+
const box = extent(element, nextMapping[name]);
|
|
68
|
+
const overflowing = box.content > box.client + TOLERANCE;
|
|
69
|
+
const max = Math.max(0, box.content - box.client);
|
|
70
|
+
const offset = reversed ? max - Math.abs(box.offset) : Math.abs(box.offset);
|
|
71
|
+
const active = requested(name) && overflowing;
|
|
72
|
+
return {
|
|
73
|
+
overflowing,
|
|
74
|
+
state: {
|
|
75
|
+
isScrollable: active,
|
|
76
|
+
atStart: !active || offset <= TOLERANCE,
|
|
77
|
+
atEnd: !active || offset >= max - TOLERANCE
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
const inlineRead = read("inline", nextMapping.inlineReversed);
|
|
82
|
+
const blockRead = read("block", nextMapping.blockReversed);
|
|
83
|
+
const nextInline = requested("inline") ? inlineRead.state : idleAxis();
|
|
84
|
+
const nextBlock = requested("block") ? blockRead.state : idleAxis();
|
|
85
|
+
if (mapping.value.inline === nextMapping.inline && mapping.value.block === nextMapping.block && mapping.value.inlineReversed === nextMapping.inlineReversed && mapping.value.blockReversed === nextMapping.blockReversed && overflowInline.value === inlineRead.overflowing && overflowBlock.value === blockRead.overflowing && sameAxis(inline.value, nextInline) && sameAxis(block.value, nextBlock)) return;
|
|
86
|
+
mapping.value = nextMapping;
|
|
87
|
+
overflowInline.value = inlineRead.overflowing;
|
|
88
|
+
overflowBlock.value = blockRead.overflowing;
|
|
89
|
+
inline.value = nextInline;
|
|
90
|
+
block.value = nextBlock;
|
|
91
|
+
}
|
|
92
|
+
let queued = false;
|
|
93
|
+
function queueMeasure() {
|
|
94
|
+
if (queued) return;
|
|
95
|
+
queued = true;
|
|
96
|
+
queueMicrotask(() => {
|
|
97
|
+
queued = false;
|
|
98
|
+
measure();
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function bind(element) {
|
|
102
|
+
const node = element instanceof HTMLElement ? element : null;
|
|
103
|
+
if (viewport.value === node) return;
|
|
104
|
+
viewport.value?.removeEventListener("scroll", measure);
|
|
105
|
+
observer?.disconnect();
|
|
106
|
+
observer = void 0;
|
|
107
|
+
viewport.value = node;
|
|
108
|
+
if (node == null) return;
|
|
109
|
+
node.addEventListener("scroll", measure, { passive: true });
|
|
110
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
111
|
+
observer = new ResizeObserver(() => queueMeasure());
|
|
112
|
+
observer.observe(node);
|
|
113
|
+
if (content.value) observer.observe(content.value);
|
|
114
|
+
}
|
|
115
|
+
queueMeasure();
|
|
116
|
+
}
|
|
117
|
+
watch(content, (element) => {
|
|
118
|
+
if (element && observer) observer.observe(element);
|
|
119
|
+
queueMeasure();
|
|
120
|
+
});
|
|
121
|
+
watch([
|
|
122
|
+
axis,
|
|
123
|
+
overscroll,
|
|
124
|
+
stickyContainment
|
|
125
|
+
], queueMeasure);
|
|
126
|
+
onMounted(queueMeasure);
|
|
127
|
+
onBeforeUnmount(() => {
|
|
128
|
+
viewport.value?.removeEventListener("scroll", measure);
|
|
129
|
+
observer?.disconnect();
|
|
130
|
+
});
|
|
131
|
+
const viewportStyle = computed(() => {
|
|
132
|
+
const map = mapping.value;
|
|
133
|
+
const requestedX = requested("inline") && map.inline === "x" || requested("block") && map.block === "x";
|
|
134
|
+
const requestedY = requested("inline") && map.inline === "y" || requested("block") && map.block === "y";
|
|
135
|
+
const overflowingX = overflowInline.value && map.inline === "x" || overflowBlock.value && map.block === "x";
|
|
136
|
+
const overflowingY = overflowInline.value && map.inline === "y" || overflowBlock.value && map.block === "y";
|
|
137
|
+
const contains = overflowingX || overflowingY || stickyContainment.value === "always";
|
|
138
|
+
const scrollsX = stickyContainment.value === "always" ? requestedX : overflowingX;
|
|
139
|
+
const scrollsY = stickyContainment.value === "always" ? requestedY : overflowingY;
|
|
140
|
+
const style = {
|
|
141
|
+
overflowX: contains ? scrollsX ? "auto" : "hidden" : "clip",
|
|
142
|
+
overflowY: contains ? scrollsY ? "auto" : "hidden" : "clip"
|
|
143
|
+
};
|
|
144
|
+
if (requested("inline")) style[map.inline === "x" ? "overscrollBehaviorX" : "overscrollBehaviorY"] = overscroll.value === "contain" && inline.value.isScrollable ? "contain" : "auto";
|
|
145
|
+
if (requested("block")) style[map.block === "x" ? "overscrollBehaviorX" : "overscrollBehaviorY"] = overscroll.value === "contain" && block.value.isScrollable ? "contain" : "auto";
|
|
146
|
+
return style;
|
|
147
|
+
});
|
|
148
|
+
const scrollable = computed(() => inline.value.isScrollable || block.value.isScrollable);
|
|
149
|
+
return {
|
|
150
|
+
viewport: bind,
|
|
151
|
+
content,
|
|
152
|
+
viewportAttrs: computed(() => ({
|
|
153
|
+
"role": options.role ?? "group",
|
|
154
|
+
"aria-label": options.label,
|
|
155
|
+
"tabindex": scrollable.value ? 0 : void 0,
|
|
156
|
+
"data-scroll-axis": axis.value,
|
|
157
|
+
"data-scrollable-inline": inline.value.isScrollable ? "true" : void 0,
|
|
158
|
+
"data-scrollable-block": block.value.isScrollable ? "true" : void 0,
|
|
159
|
+
"data-scroll-inline-start": inline.value.atStart ? "true" : void 0,
|
|
160
|
+
"data-scroll-inline-end": inline.value.atEnd ? "true" : void 0,
|
|
161
|
+
"data-scroll-block-start": block.value.atStart ? "true" : void 0,
|
|
162
|
+
"data-scroll-block-end": block.value.atEnd ? "true" : void 0
|
|
163
|
+
})),
|
|
164
|
+
viewportStyle,
|
|
165
|
+
state: computed(() => ({
|
|
166
|
+
inline: inline.value,
|
|
167
|
+
block: block.value
|
|
168
|
+
}))
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//#endregion
|
|
172
|
+
export { useScrollableArea as t };
|