@feugene/granularity 0.18.0 → 0.19.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/chunks/chevron-left-D8AUBAM7.js +23 -0
- package/dist/chunks/chevron-left-D8AUBAM7.js.map +1 -0
- package/dist/chunks/{chevron-right-BfqMVpbB.js → chevron-right-C6Z01h0X.js} +1 -22
- package/dist/chunks/chevron-right-C6Z01h0X.js.map +1 -0
- package/dist/chunks/config-8Pcutu1j2.js.map +1 -0
- package/dist/chunks/{config-K0C2tcLB.js → config-9PYRZlKE.js} +1 -1
- package/dist/chunks/{config-K0C2tcLB.js.map → config-9PYRZlKE.js.map} +1 -1
- package/dist/chunks/{config-DEvsMTQE.js → config-BJ7Bv_G2.js} +1 -3
- package/dist/chunks/config-BJ7Bv_G2.js.map +1 -0
- package/dist/chunks/config-BKvX0q102.js.map +1 -0
- package/dist/chunks/{config-gvq_hWNM.js → config-Be9k9bOf.js} +1 -7
- package/dist/chunks/config-Be9k9bOf.js.map +1 -0
- package/dist/chunks/{config-DpqOnJiz2.js → config-CDat1wXf2.js} +1 -1
- package/dist/chunks/config-CDat1wXf2.js.map +1 -0
- package/dist/chunks/config-CY0_6cMi2.js.map +1 -0
- package/dist/chunks/config-D94Z9po52.js.map +1 -0
- package/dist/chunks/{config-D2aNP7Es.js → config-DAX8Deh1.js} +1 -3
- package/dist/chunks/config-DAX8Deh1.js.map +1 -0
- package/dist/chunks/config-DCFvmHEv.js.map +1 -0
- package/dist/chunks/config-DKdlqXiY.js.map +1 -1
- package/dist/chunks/config-Rw9OyW702.js.map +1 -0
- package/dist/chunks/generated-BRkbhyxk.js +3270 -0
- package/dist/chunks/generated-BRkbhyxk.js.map +1 -0
- package/dist/chunks/{granular-provider-B9nXQCMu.js → granular-provider-C6uAujdJ.js} +12 -12
- package/dist/chunks/{granular-provider-B9nXQCMu.js.map → granular-provider-C6uAujdJ.js.map} +1 -1
- package/dist/chunks/grip-vertical-lRha2S7q.js +16 -0
- package/dist/chunks/grip-vertical-lRha2S7q.js.map +1 -0
- package/dist/chunks/icon-Dag2tIMs.js +21 -0
- package/dist/chunks/icon-Dag2tIMs.js.map +1 -0
- package/dist/chunks/{portalRoot-CWD4zHBm.js → portalRoot-CVhCgdG6.js} +10 -1
- package/dist/chunks/{portalRoot-CWD4zHBm.js.map → portalRoot-CVhCgdG6.js.map} +1 -1
- package/dist/chunks/{useModalOverlay-BTq-0ImG.js → useModalOverlay-DrQVYwwA.js} +1 -1
- package/dist/chunks/{useModalOverlay-BTq-0ImG.js.map → useModalOverlay-DrQVYwwA.js.map} +1 -1
- package/dist/chunks/{usePortalTarget-RyzEgNTb.js → usePortalTarget-Cn-Wiz5d.js} +1 -1
- package/dist/chunks/{usePortalTarget-RyzEgNTb.js.map → usePortalTarget-Cn-Wiz5d.js.map} +1 -1
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-CPEQxmLZ.js → GrAutocomplete-gY4Xopza.js} +32 -24
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-gY4Xopza.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +1 -1
- package/dist/components/GrAutocomplete/styles.css +1 -1
- package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-BCNGDS6k.js → GrBreadcrumbs-DS_-PBVt.js} +8 -7
- package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-DS_-PBVt.js.map +1 -0
- package/dist/components/GrBreadcrumbs/index.js +1 -1
- package/dist/components/GrCollapse/chunks/{GrCollapse-B2Fc6A9r.js.map → GrCollapse-Kk0DE8tb.js.map} +1 -1
- package/dist/components/GrCollapse/index.js +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-DAdQ-Gc3.js → GrColorPicker-CkBTzkqn.js} +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-DAdQ-Gc3.js.map → GrColorPicker-CkBTzkqn.js.map} +1 -1
- package/dist/components/GrColorPicker/index.js +1 -1
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-DMeSqkEv.js → GrCommandPalette-BugTlGdj.js} +37 -11
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-BugTlGdj.js.map +1 -0
- package/dist/components/GrCommandPalette/index.js +2 -2
- package/dist/components/GrCommandPalette/styles.css +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-hUTi-GdJ.js → GrConfirmDialog-Ds5T0GiR.js} +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-hUTi-GdJ.js.map → GrConfirmDialog-Ds5T0GiR.js.map} +1 -1
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrDataTable/chunks/{GrDataTable-DzaGLG3A.js → GrDataTable-CYe2A2WA.js} +9 -7
- package/dist/components/GrDataTable/chunks/GrDataTable-CYe2A2WA.js.map +1 -0
- package/dist/components/GrDataTable/index.js +2 -2
- package/dist/components/GrDialog/chunks/{GrDialog-MD9Fzy9C.js → GrDialog-C3tYaA8v.js} +1 -1
- package/dist/components/GrDialog/chunks/{GrDialog-MD9Fzy9C.js.map → GrDialog-C3tYaA8v.js.map} +1 -1
- package/dist/components/GrDialog/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-DtgUijMj.js → GrDialogService-CTBiiJDI.js} +3 -3
- package/dist/components/GrDialogService/chunks/{GrDialogService-DtgUijMj.js.map → GrDialogService-CTBiiJDI.js.map} +1 -1
- package/dist/components/GrDialogService/index.js +1 -1
- package/dist/components/GrDivider/chunks/{GrDivider-B2Xwc_QO.js → GrDivider-xxq1_fIl.js} +1 -1
- package/dist/components/GrDivider/chunks/{GrDivider-B2Xwc_QO.js.map → GrDivider-xxq1_fIl.js.map} +1 -1
- package/dist/components/GrDivider/index.js +2 -2
- package/dist/components/GrDrawer/chunks/{GrDrawer-DWHdZZzW.js → GrDrawer-BSSuiNHU.js} +2 -2
- package/dist/components/GrDrawer/chunks/{GrDrawer-DWHdZZzW.js.map → GrDrawer-BSSuiNHU.js.map} +1 -1
- package/dist/components/GrDrawer/index.js +2 -2
- package/dist/components/GrDropdown/chunks/{GrDropdown-0tJK01Kq.js → GrDropdown-Bh6UK2M5.js} +1 -1
- package/dist/components/GrDropdown/chunks/{GrDropdown-0tJK01Kq.js.map → GrDropdown-Bh6UK2M5.js.map} +1 -1
- package/dist/components/GrDropdown/index.js +1 -1
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-VPPrpCoA.js → GrDropdownMenu-LyfEFUbg.js} +2 -2
- package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-VPPrpCoA.js.map → GrDropdownMenu-LyfEFUbg.js.map} +1 -1
- package/dist/components/GrDropdownMenu/index.js +2 -2
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-DE7MBbF8.js → GrImageViewer-DfD4euH5.js} +3 -2
- package/dist/components/GrImageViewer/chunks/{GrImageViewer-DE7MBbF8.js.map → GrImageViewer-DfD4euH5.js.map} +1 -1
- package/dist/components/GrImageViewer/index.js +1 -1
- package/dist/components/GrModal/chunks/{GrModal-BbhcsDQ8.js → GrModal-CbMMr6W1.js} +1 -1
- package/dist/components/GrModal/chunks/{GrModal-BbhcsDQ8.js.map → GrModal-CbMMr6W1.js.map} +1 -1
- package/dist/components/GrModal/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-CZOyPz4J.js → GrNumberInput-B5CHZDBj.js} +2 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-CZOyPz4J.js.map → GrNumberInput-B5CHZDBj.js.map} +1 -1
- package/dist/components/GrNumberInput/index.js +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-waKhxBP7.js → GrPagination-BM4FrD6Q.js} +1 -1
- package/dist/components/GrPagination/chunks/{GrPagination-waKhxBP7.js.map → GrPagination-BM4FrD6Q.js.map} +1 -1
- package/dist/components/GrPagination/index.js +1 -1
- package/dist/components/GrPopover/chunks/{GrPopover-DuqeoFaI.js → GrPopover-DMH4Jjst.js} +1 -1
- package/dist/components/GrPopover/chunks/{GrPopover-DuqeoFaI.js.map → GrPopover-DMH4Jjst.js.map} +1 -1
- package/dist/components/GrPopover/index.js +1 -1
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-JVVqBsPY.js → GrPromptDialog-Pwr9NPxK.js} +1 -1
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-JVVqBsPY.js.map → GrPromptDialog-Pwr9NPxK.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +1 -1
- package/dist/components/GrRating/chunks/{GrRating-LarIiwJL.js → GrRating-DVFH3lYu.js} +8 -7
- package/dist/components/GrRating/chunks/GrRating-DVFH3lYu.js.map +1 -0
- package/dist/components/GrRating/index.js +1 -1
- package/dist/components/GrSelect/chunks/{GrSelect-DAdu044K.js → GrSelect-B-Voni7D.js} +65 -52
- package/dist/components/GrSelect/chunks/GrSelect-B-Voni7D.js.map +1 -0
- package/dist/components/GrSelect/index.js +1 -1
- package/dist/components/GrSelect/styles.css +1 -1
- package/dist/components/GrSidebar/chunks/{GrSidebar-DRGnnViw.js → GrSidebar-i7AxjhY_.js} +3 -2
- package/dist/components/GrSidebar/chunks/{GrSidebar-DRGnnViw.js.map → GrSidebar-i7AxjhY_.js.map} +1 -1
- package/dist/components/GrSidebar/index.js +2 -2
- package/dist/components/GrSkeleton/index.js +1 -1
- package/dist/components/GrSortableList/chunks/{GrSortableList-BefVfWKh.js → GrSortableList-XB7mXM1W.js} +6 -5
- package/dist/components/GrSortableList/chunks/GrSortableList-XB7mXM1W.js.map +1 -0
- package/dist/components/GrSortableList/index.js +2 -2
- package/dist/components/GrStatistic/chunks/{GrStatistic-J4qLs3TH.js → GrStatistic-DOsM6s5V.js} +54 -7
- package/dist/components/GrStatistic/chunks/GrStatistic-DOsM6s5V.js.map +1 -0
- package/dist/components/GrStatistic/index.js +2 -2
- package/dist/components/GrTabs/chunks/{GrTabs-TeXaU5Uh.js → GrTabs-f3-oQenu.js} +5 -4
- package/dist/components/GrTabs/chunks/GrTabs-f3-oQenu.js.map +1 -0
- package/dist/components/GrTabs/index.js +1 -1
- package/dist/components/GrToaster/chunks/{GrToaster-Ct-39hga.js → GrToaster-Dqja0Lf9.js} +1 -1
- package/dist/components/GrToaster/chunks/{GrToaster-Ct-39hga.js.map → GrToaster-Dqja0Lf9.js.map} +1 -1
- package/dist/components/GrToaster/index.js +1 -1
- package/dist/components/GrTooltip/chunks/{GrTooltip-xAcqs0bP.js → GrTooltip-Cn08heWz.js} +1 -1
- package/dist/components/GrTooltip/chunks/{GrTooltip-xAcqs0bP.js.map → GrTooltip-Cn08heWz.js.map} +1 -1
- package/dist/components/GrTooltip/index.js +1 -1
- package/dist/components/GrTree/chunks/{GrTree-CaYK8dGZ.js → GrTree-BR9a2pay.js} +25 -20
- package/dist/components/GrTree/chunks/GrTree-BR9a2pay.js.map +1 -0
- package/dist/components/GrTree/index.js +2 -2
- package/dist/components/GrTree/styles.css +1 -1
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DZp7CqqW.js → GrTreeSelect--muUeB0v.js} +27 -13
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect--muUeB0v.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/composables/useAnnouncer.js +1 -1
- package/dist/composables/usePortalTarget.js +1 -1
- package/dist/directives/loading.js +1 -1
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/index.js +41 -41
- package/dist/styles/themes/dark.css +6 -1
- package/dist/testing.js +199 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme-apply.js +33 -0
- package/dist/theme-apply.js.map +1 -0
- package/dist/theme.js +501 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens.js +1 -3215
- package/dist/types/src/components/GrBreadcrumbs/grBreadcrumbsStyles.d.ts +5 -2
- package/dist/types/src/components/GrCommandPalette/GrCommandPalette.vue.d.ts +6 -6
- package/dist/types/src/components/GrCommandPalette/filtering.d.ts +6 -2
- package/dist/types/src/components/GrDataTable/grDataTableStyles.d.ts +0 -1
- package/dist/types/src/components/GrRating/GrRating.vue.d.ts +9 -4
- package/dist/types/src/components/GrSortableList/grSortableListStyles.d.ts +0 -1
- package/dist/types/src/components/GrStatistic/GrStatistic.vue.d.ts +12 -9
- package/dist/types/src/components/GrStatistic/grStatisticStyles.d.ts +0 -1
- package/dist/types/src/components/GrTabs/GrTabs.vue.d.ts +6 -2
- package/dist/types/src/components/GrTree/grTreeProps.d.ts +11 -4
- package/dist/types/src/components/GrTree/safelist.d.ts +1 -1
- package/dist/types/src/components/shared/icon.d.ts +13 -0
- package/dist/types/src/testing/announcer.d.ts +10 -0
- package/dist/types/src/testing/context.d.ts +36 -0
- package/dist/types/src/testing/env.d.ts +25 -0
- package/dist/types/src/testing/geometry.d.ts +23 -0
- package/dist/types/src/testing/index.d.ts +12 -0
- package/dist/types/src/testing/pointer.d.ts +31 -0
- package/dist/types/src/theme/apply.d.ts +27 -0
- package/dist/types/src/theme/color.d.ts +35 -0
- package/dist/types/src/theme/extendTheme.d.ts +63 -0
- package/dist/types/src/theme/index.d.ts +22 -0
- package/dist/types/src/theme/roles.d.ts +16 -0
- package/dist/types/src/theme/tone.d.ts +32 -0
- package/dist/types/src/theme/validate.d.ts +16 -0
- package/dist/types/src/tokens/types.d.ts +8 -0
- package/dist/web-types.json +14 -11
- package/package.json +17 -2
- package/tokens/themes/dark.json +2 -1
- package/dist/chunks/chevron-right-BfqMVpbB.js.map +0 -1
- package/dist/chunks/config-8Pcutu1j.js.map +0 -1
- package/dist/chunks/config-BKvX0q10.js.map +0 -1
- package/dist/chunks/config-CY0_6cMi.js.map +0 -1
- package/dist/chunks/config-D2aNP7Es.js.map +0 -1
- package/dist/chunks/config-D94Z9po5.js.map +0 -1
- package/dist/chunks/config-DCFvmHEv2.js.map +0 -1
- package/dist/chunks/config-DEvsMTQE.js.map +0 -1
- package/dist/chunks/config-DpqOnJiz2.js.map +0 -1
- package/dist/chunks/config-Rw9OyW70.js.map +0 -1
- package/dist/chunks/config-gvq_hWNM.js.map +0 -1
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-CPEQxmLZ.js.map +0 -1
- package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-BCNGDS6k.js.map +0 -1
- package/dist/components/GrCommandPalette/chunks/GrCommandPalette-DMeSqkEv.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-DzaGLG3A.js.map +0 -1
- package/dist/components/GrRating/chunks/GrRating-LarIiwJL.js.map +0 -1
- package/dist/components/GrSelect/chunks/GrSelect-DAdu044K.js.map +0 -1
- package/dist/components/GrSortableList/chunks/GrSortableList-BefVfWKh.js.map +0 -1
- package/dist/components/GrStatistic/chunks/GrStatistic-J4qLs3TH.js.map +0 -1
- package/dist/components/GrTabs/chunks/GrTabs-TeXaU5Uh.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-CaYK8dGZ.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-DZp7CqqW.js.map +0 -1
- package/dist/tokens.js.map +0 -1
- package/dist/chunks/{config-8Pcutu1j.js → config-8Pcutu1j2.js} +0 -0
- package/dist/chunks/{config-BKvX0q10.js → config-BKvX0q102.js} +0 -0
- package/dist/chunks/{config-CY0_6cMi.js → config-CY0_6cMi2.js} +0 -0
- package/dist/chunks/{config-D94Z9po5.js → config-D94Z9po52.js} +0 -0
- package/dist/chunks/{config-DCFvmHEv2.js → config-DCFvmHEv.js} +0 -0
- package/dist/chunks/{config-Rw9OyW70.js → config-Rw9OyW702.js} +0 -0
- package/dist/components/GrCollapse/chunks/{GrCollapse-B2Fc6A9r.js → GrCollapse-Kk0DE8tb.js} +1 -1
|
@@ -13,16 +13,16 @@ import { t as grCheckboxGroupConfig } from "./config-BuGlNPE9.js";
|
|
|
13
13
|
import { t as grCollapseConfig } from "./config-DU2DNSRx2.js";
|
|
14
14
|
import { t as grIconConfig } from "./config-Cp0DE0GH.js";
|
|
15
15
|
import { t as grColorPickerConfig } from "./config-BsPDQ0dS.js";
|
|
16
|
-
import { t as grCommandPaletteConfig } from "./config-
|
|
16
|
+
import { t as grCommandPaletteConfig } from "./config-9PYRZlKE.js";
|
|
17
17
|
import { t as grConfigProviderConfig } from "./config-B7W9VlZ7.js";
|
|
18
18
|
import { t as grConfirmDialogConfig } from "./config-A-bBiotF.js";
|
|
19
|
-
import { t as grDataTableConfig } from "./config-
|
|
19
|
+
import { t as grDataTableConfig } from "./config-BJ7Bv_G2.js";
|
|
20
20
|
import { t as grDialogSafelist } from "./safelist-CkF4v7DC.js";
|
|
21
21
|
import { t as grDialogServiceConfig } from "./config-CjXjhphs.js";
|
|
22
|
-
import { t as grDividerConfig } from "./config-
|
|
23
|
-
import { t as grDrawerConfig } from "./config-
|
|
22
|
+
import { t as grDividerConfig } from "./config-CY0_6cMi2.js";
|
|
23
|
+
import { t as grDrawerConfig } from "./config-D94Z9po52.js";
|
|
24
24
|
import { t as grDropdownConfig } from "./config-BViooYNv.js";
|
|
25
|
-
import { t as grDropdownMenuConfig } from "./config-
|
|
25
|
+
import { t as grDropdownMenuConfig } from "./config-BKvX0q102.js";
|
|
26
26
|
import { t as grEmptyStateConfig } from "./config-DvQIb4kb.js";
|
|
27
27
|
import { t as grFileUploadConfig } from "./config-CN970ZcJ.js";
|
|
28
28
|
import { t as grFormConfig } from "./config-Droqn55j.js";
|
|
@@ -49,12 +49,12 @@ import { t as grRadioGroupConfig } from "./config-QaIc_gRa.js";
|
|
|
49
49
|
import { t as grRatingConfig } from "./config-Baj7Wvx-.js";
|
|
50
50
|
import { t as grSegmentedConfig } from "./config-B-iNaGdw.js";
|
|
51
51
|
import { t as grSelectConfig } from "./config-Cwd3yjRw.js";
|
|
52
|
-
import { t as grSidebarConfig } from "./config-
|
|
53
|
-
import { t as grSkeletonConfig } from "./config-
|
|
52
|
+
import { t as grSidebarConfig } from "./config-Rw9OyW702.js";
|
|
53
|
+
import { t as grSkeletonConfig } from "./config-8Pcutu1j2.js";
|
|
54
54
|
import { t as grSliderConfig } from "./config-T3qdQBgU2.js";
|
|
55
|
-
import { t as grSortableListConfig } from "./config-
|
|
55
|
+
import { t as grSortableListConfig } from "./config-DAX8Deh1.js";
|
|
56
56
|
import { t as grSplitterConfig } from "./config-BE6n20np2.js";
|
|
57
|
-
import { t as grStatisticConfig } from "./config-
|
|
57
|
+
import { t as grStatisticConfig } from "./config-Be9k9bOf.js";
|
|
58
58
|
import { t as grSwitchConfig } from "./config-BoNR7_PD2.js";
|
|
59
59
|
import { t as grTableConfig } from "./config-WTNhdh6T2.js";
|
|
60
60
|
import { t as grTabPanelsConfig } from "./config-eXB87DOi.js";
|
|
@@ -63,8 +63,8 @@ import { t as grTextareaConfig } from "./config-BDfTXHo12.js";
|
|
|
63
63
|
import { t as grTimelineConfig } from "./config-COpuWGr_.js";
|
|
64
64
|
import { t as grToasterConfig } from "./config-ScuvHw6k2.js";
|
|
65
65
|
import { t as grTooltipConfig } from "./config-CN2ULSQL.js";
|
|
66
|
-
import { t as grTreeConfig } from "./config-
|
|
67
|
-
import { t as grTreeSelectConfig } from "./config-
|
|
66
|
+
import { t as grTreeConfig } from "./config-CDat1wXf2.js";
|
|
67
|
+
import { t as grTreeSelectConfig } from "./config-DCFvmHEv.js";
|
|
68
68
|
import { defineGranularComponent, defineGranularProvider, resolvePackageBaseUrl } from "@feugene/unocss-preset-granular/contract";
|
|
69
69
|
//#region src/components/GrDialog/config.ts
|
|
70
70
|
var grDialogConfig = defineGranularComponent(import.meta.url, {
|
|
@@ -92,7 +92,7 @@ var theme = {
|
|
|
92
92
|
tokensCssUrl: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KOnJvb3QgewogIC8qIEZvdW5kYXRpb25zOiBuZXV0cmFsIHBhbGV0dGUgKi8KICAtLWdyLXNsYXRlLTA6ICNmZmZmZmY7CiAgLS1nci1zbGF0ZS01MDogI2Y4ZmFmYzsKICAtLWdyLXNsYXRlLTEwMDogI2YxZjVmOTsKICAtLWdyLXNsYXRlLTIwMDogI2UyZThmMDsKICAtLWdyLXNsYXRlLTMwMDogI2NiZDVlMTsKICAtLWdyLXNsYXRlLTQwMDogIzk0YTNiODsKICAtLWdyLXNsYXRlLTUwMDogIzY0NzQ4YjsKICAtLWdyLXNsYXRlLTYwMDogIzQ3NTU2OTsKICAtLWdyLXNsYXRlLTcwMDogIzMzNDE1NTsKICAtLWdyLXNsYXRlLTgwMDogIzFlMjkzYjsKICAtLWdyLXNsYXRlLTkwMDogIzBmMTcyYTsKCiAgLyogVHlwb2dyYXBoeTogZm9udCBmYW1pbGllcyAqLwogIC0tZ3ItZm9udC11aTogSW50ZXIsIFJvYm90bywgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgLS1nci1mb250LW1vbm86ICdKZXRCcmFpbnMgTW9ubycsIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlOwoKICAvKiBUeXBvZ3JhcGh5OiBmb250IHNpemVzICovCiAgLS1nci10ZXh0LTJ4czogMTBweDsKICAtLWdyLXRleHQteHM6IDEycHg7CiAgLS1nci10ZXh0LXNtOiAxNHB4OwogIC0tZ3ItdGV4dC1iYXNlOiAxNnB4OwogIC0tZ3ItdGV4dC1sZzogMThweDsKICAtLWdyLXRleHQteGw6IDIwcHg7CiAgLS1nci10ZXh0LTJ4bDogMjRweDsKICAtLWdyLXRleHQtM3hsOiAzMHB4OwogIC0tZ3ItdGV4dC00eGw6IDM2cHg7CgogIC8qCiAgICogVHlwb2dyYXBoeTogY29udHJvbCBzY2FsZQogICAqCiAgICog0KjQutCw0LvQsCDQutC10LPQu9C10Lkg0LrQvtC80L/QvtC90LXQvdGC0L7Qsiwg0LbQuNCy0YPRidC40YUg0L3QsCBgR3JDb21wb25lbnRTaXplYCDigJQg0LrQvtC90YLRgNC+0LvQvtCyINC4INCy0YHQtdCz0L4sCiAgICog0YfRgtC+INGB0YLQvtC40YIg0YEg0L3QuNC80Lgg0LIg0L7QtNC40L0g0YDRj9C0LiDQntGC0LTQtdC70YzQvdCw0Y8g0L7RgiDQutC+0L3RgtC10L3RgtC90L7QuSDRgtC40L/QvtCz0YDQsNGE0LjQutC4INC/0L4g0LTQstGD0LwKICAgKiDQv9GA0LjRh9C40L3QsNC8LiDQn9C10YDQstCw0Y86INGB0YLRg9C/0LXQvdC10LkgMTNweCDQuCAxMXB4INGC0LDQvCDQvdC10YIg0Lgg0LHRi9GC0Ywg0L3QtSDQtNC+0LvQttC90L4g4oCUINGN0YLQvgogICAqINC60L7QvNC/0YDQvtC80LjRgdGB0Ysg0L/Qu9C+0YLQvdC+0YHRgtC4INC60L7QvdGC0YDQvtC70LAsINCwINC90LUg0YHRgtGD0L/QtdC90Lgg0YLQtdC60YHRgtCwLiDQktGC0L7RgNCw0Y86INGI0LrQsNC70LAg0L3QsNC80LXRgNC10L3QvdC+CiAgICog0L/Qu9C+0YLQvdC10LUg0YfQtdGC0YvRgNGR0YUg0YHRgtGD0L/QtdC90LXQuSDRgNCw0LfQvNC10YDQsCDigJQg0LrQsNC20LTRi9C5INC60L7QvNC/0L7QvdC10L3RgiDQstGL0LHQuNGA0LDQtdGCINC40Lcg0L3QtdGRINGB0LLQvtC4CiAgICog0YfQtdGC0YvRgNC1LiDQntGB0L3QvtCy0L3QsNGPINC70LXRgdGC0L3QuNGG0LAgYHhz4oCmbGdgICgxMi8xMy8xNC8xNikg4oCUINGDIGBHcklucHV0YCwgYEdyU2VsZWN0YCwKICAgKiBgR3JUZXh0YXJlYWAsIGBHclRyZWVTZWxlY3RgLCBgR3JBdXRvY29tcGxldGVgLCBgR3JOdW1iZXJJbnB1dGAsIGBHcklucHV0VGFnYCwKICAgKiBgR3JUYWJsZWAsIGBHckxpbmtgLCBgR3JQb3BvdmVyYDsg0L3QsCDRgdGC0YPQv9C10L3RjCDQvNC10LvRjNGH0LUgKGAzeHPigKZtZGAsIDEwLzExLzEyLzE0KQogICAqINGA0LDQsdC+0YLQsNGO0YIgYEdyVG9vbHRpcGAsIGBHckRhdGFUYWJsZWAsIGBHckJhZGdlYCwgYEdyUmF0aW5nYCwgYEdyRm9ybUZpbGVgLgogICAqINCh0L7QstC/0LDQtNC10L3QuNC1INC30L3QsNGH0LXQvdC40Lkg0YEgYC0tZ3ItdGV4dC0qYCDQvdC1INC00LXQu9Cw0LXRgiDRiNC60LDQu9GLINC+0LTQvdC+0Lk6INC/0LvQvtGC0L3QvtGB0YLRjCDQutC+0L3RgtGA0L7Qu9C+0LIKICAgKiDQvNC10L3Rj9C10YLRgdGPINC+0YLQtNC10LvRjNC90L4g0L7RgiDQutC10LPQu9GPINC60L7QvdGC0LXQvdGC0L3QvtCz0L4g0YLQtdC60YHRgtCwLgogICAqLwogIC0tZ3ItY29udHJvbC10ZXh0LTN4czogMTBweDsKICAtLWdyLWNvbnRyb2wtdGV4dC0yeHM6IDExcHg7CiAgLS1nci1jb250cm9sLXRleHQteHM6IDEycHg7CiAgLS1nci1jb250cm9sLXRleHQtc206IDEzcHg7CiAgLS1nci1jb250cm9sLXRleHQtbWQ6IDE0cHg7CiAgLS1nci1jb250cm9sLXRleHQtbGc6IDE2cHg7CgogIC8qCiAgICogVHlwb2dyYXBoeTogbGluZSBoZWlnaHRzCiAgICoKICAgKiDQlNCy0LUg0YDQsNC30L3Ri9C1INCy0LXRidC4INC/0L7QtCDQvtC00L3QuNC8INC/0YDQtdGE0LjQutGB0L7QvCwg0Lgg0YDQsNC30LvQuNGH0LDQtdGCINC40YUg0YHRg9GE0YTQuNC60YEuCiAgICog0KHRgtGD0L/QtdC90LggKGB4c2AvYHNtYC9gYmFzZWApIOKAlCDQsNCx0YHQvtC70Y7RgtC90YvQtSDQt9C90LDRh9C10L3QuNGPLCDQv9Cw0YDQvdGL0LUg0L7QtNC90L7QuNC80ZHQvdC90YvQvCDRgdGC0YPQv9C10L3Rj9C8CiAgICogYC0tZ3ItdGV4dC0qYDog0YPRgtC40LvQuNGC0LAgYHRleHQtc21gINCyIHVubyDQt9Cw0LTQsNCy0LDQu9CwINC60LXQs9C70Ywg0Lgg0LzQtdC20YHRgtGA0L7Rh9C90YvQuSDRgNCw0LfQvtC8LCDQuAogICAqINC60LXQs9C70YwsINC/0LXRgNC10LLQtdC00ZHQvdC90YvQuSDQvdCwINGC0L7QutC10L0g0LIg0L7QtNC40L3QvtGH0LrRgywg0L7RgtC00LDQuyDQsdGLINC40L3RgtC10YDQstCw0Lsg0L3QsCDQvtGC0LrRg9C/IGBib2R5YAogICAqINC/0YDQuNC70L7QttC10L3QuNGPLiDQmtC+0Y3RhNGE0LjRhtC40LXQvdGC0YsgKGB0aWdodGAvYG5vcm1hbGAvYHJlbGF4ZWRgKSDigJQg0LHQtdC30YDQsNC30LzQtdGA0L3Ri9C1LCDQtNC70Y8KICAgKiDRgtC10LrRgdGC0L7QstGL0YUg0LHQu9C+0LrQvtCyLCDQs9C00LUg0LjQvdGC0LXRgNCy0LDQuyDQt9Cw0LTQsNGR0YLRgdGPINC+0YLQvdC+0YjQtdC90LjQtdC8INC6INC60LXQs9C70Y4sINCwINC90LUg0YfQuNGB0LvQvtC8LgogICAqINCh0YLRg9C/0LXQvdC4INC30LDQstC+0LTRj9GC0YHRjyDQv9C+INC80LXRgNC1INGD0L/QvtGC0YDQtdCx0LvQtdC90LjRjzog0YjQutCw0LvQsCDQsdC10Lcg0YPQv9C+0YLRgNC10LHQu9C10L3QuNGPIOKAlCDQvNGR0YDRgtCy0YvQuSDQs9GA0YPQty4KICAgKi8KICAtLWdyLWxlYWRpbmcteHM6IDFyZW07CiAgLS1nci1sZWFkaW5nLXNtOiAxLjI1cmVtOwogIC0tZ3ItbGVhZGluZy1iYXNlOiAxLjVyZW07CiAgLS1nci1sZWFkaW5nLXhsOiAxLjc1cmVtOwogIC0tZ3ItbGVhZGluZy0zeGw6IDIuMjVyZW07CiAgLS1nci1sZWFkaW5nLXRpZ2h0OiAxLjI1OwogIC0tZ3ItbGVhZGluZy1ub3JtYWw6IDEuNTsKICAtLWdyLWxlYWRpbmctcmVsYXhlZDogMS42MjU7CgogIC8qIFR5cG9ncmFwaHk6IGZvbnQgd2VpZ2h0cyAqLwogIC0tZ3ItZm9udC1yZWd1bGFyOiA0MDA7CiAgLS1nci1mb250LW1lZGl1bTogNTAwOwogIC0tZ3ItZm9udC1zZW1pYm9sZDogNjAwOwogIC0tZ3ItZm9udC1ib2xkOiA3MDA7CgogIC8qIExheW91dDogc3BhY2luZyBzY2FsZSAqLwogIC0tZ3Itc3BhY2UtMDogMHB4OwogIC0tZ3Itc3BhY2UtMTogNHB4OwogIC0tZ3Itc3BhY2UtMjogOHB4OwogIC0tZ3Itc3BhY2UtMzogMTJweDsKICAtLWdyLXNwYWNlLTQ6IDE2cHg7CiAgLS1nci1zcGFjZS01OiAyMHB4OwogIC0tZ3Itc3BhY2UtNjogMjRweDsKICAtLWdyLXNwYWNlLTg6IDMycHg7CiAgLS1nci1zcGFjZS0xMDogNDBweDsKICAtLWdyLXNwYWNlLTEyOiA0OHB4OwogIC0tZ3Itc3BhY2UtMTY6IDY0cHg7CiAgLS1nci1zcGFjZS0yMDogODBweDsKICAtLWdyLXNwYWNlLTI0OiA5NnB4OwogIC0tZ3Itc3BhY2UtMzI6IDEyOHB4OwogIC0tZ3Itc3BhY2UtNDA6IDE2MHB4OwogIC0tZ3Itc3BhY2UtNDg6IDE5MnB4OwogIC0tZ3Itc3BhY2UtNjQ6IDI1NnB4OwoKICAvKiBMYXlvdXQ6IGNvbnRhaW5lcnMgKi8KICAtLWdyLWNvbnRhaW5lci1tYXg6IDEyODBweDsKICAtLWdyLWNvbnRhaW5lci1tYXgtMnhsOiAxNDQwcHg7CiAgLS1nci1jb250YWluZXItcGFkZGluZy1tb2JpbGU6IDE2cHg7CiAgLS1nci1jb250YWluZXItcGFkZGluZy10YWJsZXQ6IDI0cHg7CiAgLS1nci1jb250YWluZXItcGFkZGluZy1kZXNrdG9wOiAzMnB4OwoKICAvKiBMYXlvdXQ6IGJyZWFrcG9pbnRzICovCiAgLS1nci1icC1zbTogNjQwcHg7CiAgLS1nci1icC1tZDogNzY4cHg7CiAgLS1nci1icC1sZzogMTAyNHB4OwogIC0tZ3ItYnAteGw6IDEyODBweDsKICAtLWdyLWJwLTJ4bDogMTUzNnB4OwoKICAvKgogICAqIEljb25vZ3JhcGh5OiBpY29uIHNpemVzCiAgICoKICAgKiDQqNC60LDQu9CwINGA0LDQt9C80LXRgNC+0LIg0LjQutC+0L3QutC4IChgR3JJY29uYCkuINCX0L3QsNGH0LXQvdC40Y8g0YHQvtCy0L/QsNC00LDRjtGCINGB0L4g0YjQutCw0LvQvtC5INC60L7QvdGC0YDQvtC70L7QsgogICAqIChgeHPigKZsZ2ApINC4INC20LjQstGD0YIg0YLQvtC60LXQvdCw0LzQuCwg0LAg0L3QtSDQu9C40YLQtdGA0LDQu9Cw0LzQuCDQsiDQutC+0LzQv9C+0L3QtdC90YLQtTog0LjQutC+0L3QutCwINC+0LHRj9C30LDQvdCwCiAgICog0LzQsNGB0YjRgtCw0LHQuNGA0L7QstCw0YLRjNGB0Y8g0LLQvNC10YHRgtC1INGBINGC0LXQvNC+0LksINCwINC90LUg0LLQvNC10YHRgtC1INGBINC/0LXRgNC10YHQsdC+0YDQutC+0Lkg0L/QsNC60LXRgtCwLgogICAqINCf0YDQvtC40LfQstC+0LvRjNC90YvQuSDRgNCw0LfQvNC10YAg0LfQsNC00LDRkdGC0YHRjyDRh9C40YHQu9C+0Lwg0L/RgNGP0LzQviDQvdCwINC60L7QvNC/0L7QvdC10L3RgtC1IOKAlCDRjdGC0L4gZXNjYXBlLWhhdGNoLAogICAqINCwINC90LUg0YfQsNGB0YLRjCDRiNC60LDQu9GLLgogICAqLwogIC0tZ3ItaWNvbi1zaXplLXhzOiAxNHB4OwogIC0tZ3ItaWNvbi1zaXplLXNtOiAxNnB4OwogIC0tZ3ItaWNvbi1zaXplLW1kOiAxOHB4OwogIC0tZ3ItaWNvbi1zaXplLWxnOiAyMHB4OwoKICAvKiBTaGFwZXM6IHJhZGlpIGFuZCBjb21wYXRpYmlsaXR5IGFsaWFzZXMgKi8KICAtLXJhZGl1czogMC41cmVtOwogIC0tZ3ItcmFkaXVzLW5vbmU6IDBweDsKICAtLWdyLXJhZGl1cy14czogM3B4OwogIC0tZ3ItcmFkaXVzLXNtOiA0cHg7CiAgLS1nci1yYWRpdXMtY29udHJvbDogNnB4OwogIC0tZ3ItcmFkaXVzLW1kOiA4cHg7CiAgLS1nci1yYWRpdXMtbGc6IDEycHg7CiAgLS1nci1yYWRpdXMteGw6IDE2cHg7CiAgLS1nci1yYWRpdXMtZnVsbDogOTk5OXB4OwoKICAvKiBFbGV2YXRpb24gKi8KICAtLWdyLXNoYWRvdy0wOiBub25lOwogIC0tZ3Itc2hhZG93LTE6IDAgMXB4IDJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpOwogIC0tZ3Itc2hhZG93LTI6IDAgOHB4IDI0cHggcmdiYSgxNSwgMjMsIDQyLCAwLjE0KTsKICAtLWdyLXNoYWRvdy0zOiAwIDE2cHggNDhweCByZ2JhKDE1LCAyMywgNDIsIDAuMjApOwoKICAvKiBNb3Rpb24gKi8KICAtLWdyLWR1cmF0aW9uLWZhc3Q6IDE1MG1zOwogIC0tZ3ItZHVyYXRpb24tYmFzZTogMjAwbXM7CiAgLS1nci1kdXJhdGlvbi1zbG93OiAzMDBtczsKICAtLWdyLWVhc2Utb3V0OiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTsKICAtLWdyLWVhc2UtaW46IGN1YmljLWJlemllcigwLjcsIDAsIDAuODQsIDApOwoKICAvKgogICAqIExheWVyaW5nOiB6LWluZGV4IHNjYWxlCiAgICoKICAgKiDQldC00LjQvdGL0Lkg0LjRgdGC0L7Rh9C90LjQuiDQuNGB0YLQuNC90Ysg0LTQu9GPINGB0LvQvtGR0LIg0LLRgdC10YUg0LrQvtC80L/QvtC90LXQvdGC0L7Qsiwg0LjRgdC/0L7Qu9GM0LfRg9GO0YnQuNGFIGBwb3NpdGlvbjogZml4ZWRgCiAgICog0L/QvtCy0LXRgNGFINC+0YHRgtCw0LvRjNC90L7Qs9C+INC60L7QvdGC0LXQvdGC0LAuINCf0YDQsNCy0LjQu9C+OiDRh9C10Lwg0LLRi9GI0LUg0LIgVUkt0YHRgtC10LrQtSDRgdC70L7QuSDQvtCx0Y/Qt9Cw0L0g0L7QutCw0LfQsNGC0YzRgdGPLAogICAqINGC0LXQvCDQsdC+0LvRjNGI0LUg0LfQvdCw0YfQtdC90LjQtS4gRmxvYXRpbmct0L/QsNC90LXQu9C4IChkcm9wZG93bi9zZWxlY3QvdHJlZS1zZWxlY3QvdG9vbHRpcCkg0YHRgtC+0Y/RggogICAqINC90LjQttC1INC80L7QtNCw0LvQvtC6LCDRh9GC0L7QsdGLINC/0L7Qv9C+0LLQtdGALCDQvtGC0LrRgNGL0YLRi9C5INCS0J3Qo9Ci0KDQmCDQvNC+0LTQsNC70LrQuCwg0L3QtSDQv9C+0YLQtdGA0Y/Qu9GB0Y8g0L/QvtC0INC90LXQuSwg0L3QvgogICAqINGB0LDQvCDRjdGC0L7RgiDQv9C+0L/QvtCy0LXRgCDQvdC1INC+0LHRj9C30LDQvSDQv9C10YDQtdC60YDRi9Cy0LDRgtGMINC80L7QtNCw0LvQutGDINGB0L3QsNGA0YPQttC4IOKAlCDQt9CwINC/0YDQtdC00LXQu9GLINGB0LLQvtC10LPQviDQtNC10YDQtdCy0LAKICAgKiBmbG9hdGluZy3QutC+0LzQv9C+0L3QtdC90YLRiyDQvdC1INCy0YvRhdC+0LTRj9GCINC/0L4g0L/QvtGB0YLRgNC+0LXQvdC40Y4gKHYtY2xpY2stb3V0c2lkZS9wb3J0YWwg0YDRj9C00L7QvCDRgSDRgtGA0LjQs9Cz0LXRgNC+0LwpLgogICAqINCi0L7RgdGC0Ysg4oCUINC10LTQuNC90YHRgtCy0LXQvdC90YvQuSDRgdC70L7QuSwg0LrQvtGC0L7RgNGL0Lkg0L7QsdGP0LfQsNC9INCx0YvRgtGMINCy0LjQtNC10L0g0L/QvtCy0LXRgNGFINCw0LHRgdC+0LvRjtGC0L3QviDQstGB0LXQs9C+LAogICAqINCy0LrQu9GO0YfQsNGPINC+0YLQutGA0YvRgtGL0LUg0LzQvtC00LDQu9C60LggKNGN0YLQviDRg9Cy0LXQtNC+0LzQu9C10L3QuNC1INGD0YDQvtCy0L3RjyDQv9GA0LjQu9C+0LbQtdC90LjRjykuCiAgICovCiAgLS1nci16LWJvdHRvbS1uYXY6IDg1MDsKICAtLWdyLXotbmF2YmFyOiA5MDA7CiAgLS1nci16LWRyb3Bkb3duOiAxMDAwOwogIC0tZ3Itei10b29sdGlwOiAxMDUwOwogIC0tZ3Itei1tb2RhbDogMTEwMDsKICAtLWdyLXotbG9hZGluZzogMTE1MDsKICAtLWdyLXotdG9hc3Q6IDEyMDA7CgogIC8qIERlcml2ZWQgaW50ZXJhY3Rpb24gZm9ybXVsYXM6IGFjdGlvbiByb2xlcyAqLwogIC0tZ3ItcHJpbWFyeS1ob3ZlcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLXByaW1hcnkpIDkyJSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLXByaW1hcnktYWN0aXZlOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3ItcHJpbWFyeSkgODQlLCB2YXIoLS1nci1mZykpOwogIC0tZ3Itc2Vjb25kYXJ5LWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc2Vjb25kYXJ5KSA5MiUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1zZWNvbmRhcnktYWN0aXZlOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc2Vjb25kYXJ5KSA4NCUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1icmQtaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1icmQpIDcwJSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLWJyZC1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1icmQpIDU1JSwgdmFyKC0tZ3ItZmcpKTsKCiAgLyogRGVyaXZlZCBpbnRlcmFjdGlvbiBmb3JtdWxhczogc3RhdHVzIHJvbGVzICovCiAgLS1nci1zdWNjZXNzLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc3VjY2VzcykgOTIlLCB2YXIoLS1nci1mZykpOwogIC0tZ3Itc3VjY2Vzcy1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1zdWNjZXNzKSA4NCUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci13YXJuaW5nLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itd2FybmluZykgOTIlLCB2YXIoLS1nci1mZykpOwogIC0tZ3Itd2FybmluZy1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci13YXJuaW5nKSA4NCUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1kYW5nZXItaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1kYW5nZXIpIDkyJSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLWRhbmdlci1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1kYW5nZXIpIDg0JSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLWluZm8taG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1pbmZvKSA5MiUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1pbmZvLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLWluZm8pIDg0JSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLXNsYXRlLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc2xhdGUpIDkyJSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLXNsYXRlLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLXNsYXRlKSA4NCUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1henVyZS1ob3ZlcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLWF6dXJlKSA5MiUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1henVyZS1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1henVyZSkgODQlLCB2YXIoLS1nci1mZykpOwp9Cg==", "" + import.meta.url).href,
|
|
93
93
|
themes: {
|
|
94
94
|
light: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KOnJvb3QgewogIC8qIFN1cmZhY2Ugcm9sZXMgKi8KICAtLWdyLWJnOiAjZjhmYWZjOwogIC0tZ3ItZmc6ICMwZjE3MmE7CiAgLS1nci1jYXJkOiAjZmZmZmZmOwogIC0tZ3ItY2FyZC1mZzogIzBmMTcyYTsKICAtLWdyLXBvcG92ZXI6ICNmZmZmZmY7CiAgLS1nci1wb3BvdmVyLWZnOiAjMGYxNzJhOwogIC0tZ3ItbXV0ZWQ6ICNmMWY1Zjk7CiAgLyoKICAgKiDQktGC0L7RgNC40YfQvdGL0Lkg0YLQtdC60YHRgiDQvtCx0Y/Qt9Cw0L0g0L/RgNC+0YXQvtC00LjRgtGMIEFBINC90LAg0KHQkNCc0J7QnCDQotCB0JzQndCe0Jwg0LjQtyDRhNC+0L3QvtCyLCDQvdCwINC60L7RgtC+0YDRi9GFCiAgICog0L7QvSDQv9C+0Y/QstC70Y/QtdGC0YHRjywg0LAg0Y3RgtC+INC90LUg0YHRgtGA0LDQvdC40YbQsCwg0LAgYC0tZ3Itc2Vjb25kYXJ5YCAoI2UyZThmMCkuINCf0YDQtdC20L3QuNC5CiAgICogIzY0NzQ4YiDQtNC10YDQttCw0LvRgdGPINGC0L7Qu9GM0LrQviDQvdCwIGAtLWdyLWJnYCAoNC41NSkg0LggYC0tZ3ItY2FyZGAgKDQuNzYpLCDQvdC+CiAgICog0L/RgNC+0LLQsNC70LjQstCw0LvRgdGPINC90LAgYC0tZ3ItbXV0ZWRgICg0LjM0KSDQuCBgLS1nci1zZWNvbmRhcnlgICgzLjg2KSDigJQg0YLQviDQtdGB0YLRjAogICAqINGA0L7QstC90L4g0YLQsNC8LCDQs9C00LUg0LLRgtC+0YDQuNGH0L3Ri9C5INGC0LXQutGB0YIg0Lgg0LbQuNCy0ZHRgjog0YfQuNC/0YssINGC0LDQsdC70LjRhtGLLCDQv9C+0LTQv9C40YHQuCDQsiDQv9Cw0L3QtdC70Y/RhS4KICAgKiAjNTU2Mjc1INC00LDRkdGCINC80LjQvdC40LzRg9C8IDUuMDIg0L/QviDQstGB0LXQvCDRh9C10YLRi9GA0ZHQvCDRhNC+0L3QsNC8LgogICAqLwogIC0tZ3ItbXV0ZWQtZmc6ICM1NTYyNzU7CiAgLS1nci1zZWNvbmRhcnk6ICNlMmU4ZjA7CiAgLS1nci1zZWNvbmRhcnktZmc6ICMxZTI5M2I7CiAgLS1nci1vdmVybGF5LWJnOiByZ2IoMTUgMjMgNDIgLyAwLjQ1KTsKICAtLWdyLWJyZDogI2UyZThmMDsKICAtLWdyLWlucHV0OiAjZTJlOGYwOwogIC0tZ3ItcmluZzogIzYzNjZmMTsKCiAgLyogU3RhdGUgcm9sZXMgKi8KICAtLWdyLWRpc2FibGVkLWJnOiAjZjFmNWY5OwogIC0tZ3ItZGlzYWJsZWQtZmc6ICM5NGEzYjg7CiAgLS1nci1kaXNhYmxlZC1icmQ6ICNlMmU4ZjA7CiAgLyoKICAgKiDQntGI0LjQsdC60LAg0LLQsNC70LjQtNCw0YbQuNC4INC4INC00LXQutC+0YDQsNGC0LjQstC90YvQuSDRgtC+0L0gYHN0YXRlPSJkYW5nZXIiYCDigJQg0YDQsNC30L3Ri9C1INCy0LXRidC4LCDRhdC+0YLRjwogICAqINCy0YvQs9C70Y/QtNGP0YIg0L7QtNC40L3QsNC60L7QstC+INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLiDQodGB0YvQu9C60LAsINCwINC90LUg0LrQvtC/0LjRjyBoZXg6INGC0LXQvNCwLCDQv9C+0LzQtdC90Y/QstGI0LDRjwogICAqINGC0L7Qu9GM0LrQviBgLS1nci1kYW5nZXJgLCDQvdC1INC+0LHRj9C30LDQvdCwINC/0L7QvNC90LjRgtGMINC/0YDQviDQstGC0L7RgNC+0Lkg0L3QsNCx0L7RgCwg0LAg0YLQtdC80LAsINC60L7RgtC+0YDQvtC5CiAgICog0L3Rg9C20LXQvSDQvtGC0LTQtdC70YzQvdGL0Lkg0YbQstC10YIg0L7RiNC40LHQutC4LCDQv9C10YDQtdC60YDQsNGI0LjQstCw0LXRgiDRgtGA0Lgg0YDQvtC70Lgg0Lgg0L3QtSDRgtGA0L7Qs9Cw0LXRgiBkYW5nZXIt0YLQvtC9LgogICAqLwogIC0tZ3ItaW52YWxpZC1icmQ6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXJpbmc6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXRleHQ6IHZhcigtLWdyLWRhbmdlci10ZXh0KTsKCiAgLyogQWN0aW9uIHJvbGVzICovCiAgLS1nci1wcmltYXJ5OiAjNGY0NmU1OwogIC0tZ3ItcHJpbWFyeS1mZzogI2ZmZmZmZjsKICAtLWdyLWFjY2VudDogI2VlZjJmZjsKICAtLWdyLWFjY2VudC1mZzogIzM3MzBhMzsKCiAgLyogU3RhdHVzIHJvbGVzICovCiAgLyoKICAgKiBgLWZnYCDigJQg0YbQstC10YIg0YLQtdC60YHRgtCwINCd0JAg0YHQv9C70L7RiNC90L7QuSDQt9Cw0LvQuNCy0LrQtSDRgtC+0L3QvtC8LiDQoyDRgdCy0LXRgtC70YvRhSDQt9Cw0LvQuNCy0L7QuiDQvtC9INC+0LHRj9C30LDQvQogICAqINCx0YvRgtGMINGC0ZHQvNC90YvQvDog0LHQtdC70YvQuSDQvdCwIGAtLWdyLXN1Y2Nlc3NgINC00LDRkdGCIDIuNTQ6MSwg0L3QsCBgLS1nci13YXJuaW5nYCAyLjgwOjEKICAgKiDQv9GA0Lgg0L/QvtGA0L7Qs9C1IEFBIDQuNSDigJQg0LAg0Y3RgtC+IHNvbGlkLdC60L3QvtC/0LrQuCDQuCDQsdC10LnQtNC20LggKGBnckJ1dHRvblN0eWxlcy50c2AsCiAgICogYGdyQmFkZ2VTdHlsZXMudHNgKS4g0KEgYC0tZ3ItZmdgINC/0L7Qu9GD0YfQsNC10LwgNy4wNCDQuCA2LjM3LCDQuCBob3Zlci9hY3RpdmUsCiAgICog0LrQvtGC0L7RgNGL0LUg0YPQstC+0LTRj9GCINC30LDQu9C40LLQutGDINCyINGC0ZHQvNC90YPRjiDRgdGC0L7RgNC+0L3Rgywg0L7RgdGC0LDRjtGC0YHRjyDQstGL0YjQtSDQv9C+0YDQvtCz0LAgKDUuMzAgLyA0Ljc5KS4KICAgKiDQkiDRgtGR0LzQvdC+0Lkg0YLQtdC80LUg0Y3RgtC4INGC0L7QutC10L3RiyDRg9C20LUg0YLRkdC80L3Ri9C1IOKAlCDRgtCw0Lwg0LfQsNC70LjQstC60Lgg0YHQstC10YLQu9C10LUg0YTQvtC90LAuCiAgICovCiAgLS1nci1zdWNjZXNzOiAjMTBiOTgxOwogIC0tZ3Itc3VjY2Vzcy1saWdodDogI2QxZmFlNTsKICAtLWdyLXN1Y2Nlc3MtZmc6ICMwZjE3MmE7CiAgLS1nci1wcmltYXJ5LXRleHQ6ICMzNzMwYTM7CiAgLS1nci1zdWNjZXNzLXRleHQ6ICMwNjVmNDY7CiAgLS1nci13YXJuaW5nOiAjZjk3MzE2OwogIC0tZ3Itd2FybmluZy1saWdodDogI2ZmZWRkNTsKICAtLWdyLXdhcm5pbmctZmc6ICMwZjE3MmE7CiAgLS1nci13YXJuaW5nLXRleHQ6ICM3YzJkMTI7CiAgLS1nci1kYW5nZXI6ICNkYzI2MjY7CiAgLS1nci1kYW5nZXItbGlnaHQ6ICNmZWUyZTI7CiAgLS1nci1kYW5nZXItZmc6ICNmZmZmZmY7CiAgLS1nci1kYW5nZXItdGV4dDogIzk5MWIxYjsKICAvKgogICAqINCh0LjQvdC40LksINCwINC90LUg0LjQvdC00LjQs9C+LiDQn9GA0LXQttC90LjQuSBgIzU4NTBlY2Ag0L7RgtC70LjRh9Cw0LvRgdGPINC+0YIgYC0tZ3ItcHJpbWFyeWAg0L3QsCDOlEUgNC4zCiAgICog0L/RgNC4INC/0L7RgNC+0LPQtSDQt9Cw0LzQtdGC0L3QvtGB0YLQuCDQvtC60L7Qu9C+IDIuMywg0LAg0YLQtdC60YHRgtC+0LLRi9C1INGA0L7Qu9C4INC+0LHQvtC40YUg0YLQvtC90L7QsiDRgdC+0LLQv9Cw0LTQsNC70LgKICAgKiDQt9C90LDRh9C10L3QuNC10Lwg0L/QvtC70L3QvtGB0YLRjNGOIOKAlCDRgdGB0YvQu9C60LAgYHRvbmU9ImluZm8iYCDQuCDRgdGB0YvQu9C60LAgYHRvbmU9InByaW1hcnkiYAogICAqINC60YDQsNGB0LjQu9C40YHRjCDQvtC00LjQvdCw0LrQvtCy0L4uINCi0L7QvSDQt9Cw0L3Rj9C7INGB0L7QsdGB0YLQstC10L3QvdGL0Lkg0YPRh9Cw0YHRgtC+0Log0L/QsNC70LjRgtGA0Ys6INC+0L0g0L7RgtC70LjRh9C40Lwg0Lgg0L7RggogICAqIGBwcmltYXJ5YCAozpRFIDIxINCyINGB0LLQtdGC0LvQvtC5INGC0LXQvNC1LCAyOSDQsiDRgtGR0LzQvdC+0LkpLCDQuCDQvtGCIGBhenVyZWAgKDQ4INC4IDIyKS4KICAgKiDQl9Cw0LzRi9GB0LXQuyDQsdGL0Lsg0YLQsNC60L7QuSDQuCDRgNCw0L3RjNGI0LUg4oCUINGC0ZHQvNC90LDRjyDRgtC10LzQsCDRg9C20LUg0L7RgtC60LDQt9GL0LLQsNC70LDRgdGMINCx0YDQsNGC0YwgaW5kaWdvLTQwMAogICAqINC40LzQtdC90L3QviDQv9C+0YLQvtC80YMsINGH0YLQviBzb2xpZC3QsdC10LnQtNC20LggcHJpbWFyeSDQuCBpbmZvINGB0YLQsNC70Lgg0LHRiyDQvdC10L7RgtC70LjRh9C40LzRiy4KICAgKi8KICAtLWdyLWluZm86ICMyNTYzZWI7CiAgLS1nci1pbmZvLWxpZ2h0OiAjZGJlYWZlOwogIC0tZ3ItaW5mby1mZzogI2ZmZmZmZjsKICAtLWdyLWluZm8tdGV4dDogIzFlNDBhZjsKICAtLWdyLXNsYXRlOiAjNDc1NTY5OwogIC0tZ3Itc2xhdGUtbGlnaHQ6ICNlMmU4ZjA7CiAgLS1nci1zbGF0ZS1mZzogI2ZmZmZmZjsKICAtLWdyLXNsYXRlLXRleHQ6ICMzMzQxNTU7CiAgLyoKICAgKiBBenVyZSDigJQg0LXQtNC40L3RgdGC0LLQtdC90L3Ri9C5INGC0L7QvSwg0LrQvtGC0L7RgNGL0Lkg0L3QtSDRh9C40L3QuNGC0YHRjyDRgdC80LXQvdC+0LkgYC1mZ2AuINCi0ZHQvNC90YvQuSDRgtC10LrRgdGCCiAgICog0L/RgNC+0YXQvtC00LjRgiDQvdCwINCx0LDQt9C1ICg2LjQ0KSwg0L3QviBob3Zlci9hY3RpdmUg0YPQstC+0LTRj9GCINC30LDQu9C40LLQutGDINCy0L3QuNC3INC4INC70L7QvNCw0Y7RgiDQtdCz0L4KICAgKiAoNC4zNiAvIDMuMDEpOyDQsdC10LvRi9C5INC20LUg0L3QtSDQv9GA0L7RhdC+0LTQuNGCINC90LAg0LHQsNC30LUgKDIuNzcpLiDQktGL0YXQvtC0INC+0LTQuNC9IOKAlCDRgdCw0LzQsAogICAqINC30LDQu9C40LLQutCwOiBza3ktNTAwIGAjMGVhNWU5YCDRgdC70LjRiNC60L7QvCDRgdCy0LXRgtC70LDRjyDQtNC70Y8g0LHQtdC70L7Qs9C+INGC0LXQutGB0YLQsC4gYCMwMDc3YjZgIOKAlAogICAqINGB0LDQvNC+0LUg0YHQstC10YLQu9C+0LUg0LfQvdCw0YfQtdC90LjQtSwg0LTQsNGO0YnQtdC1INC30LDQv9Cw0YEg0L/QviDQstGB0LXQvCDRgtGA0ZHQvCDRgdC+0YHRgtC+0Y/QvdC40Y/QvAogICAqICg0Ljg3IC8gNS40NCAvIDYuMDIpINC4INC30LDQvtC00L3QviDQv9C+0LTQvdC40LzQsNGO0YnQtdC1IGF6dXJlLdC40LrQvtC90LrRgyDQvdCwIGAtbGlnaHRgCiAgICog0L/QvtC00LvQvtC20LrQtSDRgSAyLjQyINC00L4gNC4yNC4g0J7RgtGC0LXQvdC+0Log0L7RgdGC0LDRkdGC0YHRjyDQvtGC0LvQuNGH0LjQvNGL0Lwg0L7RgiBgLS1nci1pbmZvYC4KICAgKi8KICAtLWdyLWF6dXJlOiAjMDA3N2I2OwogIC0tZ3ItYXp1cmUtbGlnaHQ6ICNlMGYyZmU7CiAgLS1nci1henVyZS1mZzogI2ZmZmZmZjsKICAtLWdyLWF6dXJlLXRleHQ6ICMwNzU5ODU7CgogIC8qCiAgICogU29saWQgZmlsbCByb2xlcwogICAqCiAgICog0KHQv9C70L7RiNC90LDRjyDQt9Cw0LvQuNCy0LrQsCDQutC90L7Qv9C+0YfQvdC+0LPQviDQstC10YHQsCDQuCDQtdGRINGC0LXQutGB0YIuCiAgICoKICAgKiDQntGCINGA0L7Qu9C4INCx0LXQtyDRgdGD0YTRhNC40LrRgdCwINC+0YLQu9C40YfQsNC10YLRgdGPINC/0L7RgNC+0LPQvtC8LiBgLS1nci17dG9uZX1gINGA0LDRgdGB0YfQuNGC0LDQvSDQvdCwIDM6MSDQugogICAqINGE0L7QvdGDINGB0YLRgNCw0L3QuNGG0Ysg4oCUINGN0YLQviDQuNC90LTQuNC60LDRgtC+0YAsINCz0YDQsNC90LjRhtCwLCDQsdC10LnQtNC2LCDigJQg0Lgg0YLQtdC60YHRgiDQvdCwINC90ZHQvCDQsdC10YDRkdGC0YHRjyDQuNC3CiAgICogYC1mZ2AsINGDINGB0LLQtdGC0LvRi9GFINC30LDQu9C40LLQvtC6INGC0ZHQvNC90YvQuS4gYC1zb2xpZGAg0YDQsNGB0YHRh9C40YLQsNC9INC90LAgNC41OjEg0L/QvtC0INCh0JLQldCi0JvQq9CZCiAgICog0YLQtdC60YHRgjogc29saWQt0LrQvdC+0L/QutC4INCy0YHQtdGFINGC0L7QvdC+0LIg0L7QsdGP0LfQsNC90Ysg0LLRi9Cz0LvRj9C00LXRgtGMINC+0LTQvdC+0Lkg0YHQtdC80YzRkdC5LCDQsCDQsdC70LXQtNC90L4tCiAgICog0LfQtdC70ZHQvdCw0Y8g0LrQvdC+0L/QutCwINGA0Y/QtNC+0Lwg0YEg0YLRkdC80L3Qvi3QutGA0LDRgdC90L7QuSDRh9C40YLQsNC10YLRgdGPINC60LDQuiDQvtGI0LjQsdC60LAg0LLRkdGA0YHRgtC60LguCiAgICoKICAgKiDQotCw0LwsINCz0LTQtSDQs9C70L7QsdCw0LvRjNC90YvQuSDRgtC+0L0g0YPQttC1INC00L7RgdGC0LDRgtC+0YfQvdC+INGC0ZHQvNC10L0sIGAtc29saWRgIOKAlCDRgdGB0YvQu9C60LAg0L3QsCDQvdC10LPQvi4KICAgKiDQodC+0LHRgdGC0LLQtdC90L3Ri9C1INC30L3QsNGH0LXQvdC40Y8g0L3Rg9C20L3RiyDRgtGA0ZHQvCDRgtC+0L3QsNC8OiDQsdC10LvRi9C5INGC0LXQutGB0YIg0LTQsNGR0YIgNS40OCAvIDYuNDUgLyA3LjcxCiAgICog0L3QsCDQt9Cw0YLQtdC80L3RkdC90L3QvtC8IHN1Y2Nlc3Mg0LggNS4xOCDQvdCwINC30LDRgtC10LzQvdGR0L3QvdC+0Lwgd2FybmluZywg0YLQvtCz0LTQsCDQutCw0Log0LPQu9C+0LHQsNC70YzQvdGL0LkKICAgKiBgLWZnYCDRgtCw0Lwg0YLRkdC80L3Ri9C5INC4INC90LAg0YLQvtC5INC20LUg0LfQsNC70LjQstC60LUg0LTQsNC7INCx0YsgMy4yNiDQuCAzLjQ1LiBBenVyZSDQvdC1INGH0LjQvdC40YLRgdGPCiAgICog0YHQvNC10L3QvtC5IGAtZmdgINCy0L7QstGB0LUgKNGB0LwuINC/0YDQuNC80LXRh9Cw0L3QuNC1INC6IGAtLWdyLWF6dXJlYCkuCiAgICoKICAgKiBob3ZlciDQuCBhY3RpdmUg0LfQsNC00LDQvdGLINC30L3QsNGH0LXQvdC40Y/QvNC4LCDQsCDQvdC1INC+0LHRidC10Lkg0YTQvtGA0LzRg9C70L7QuSDQv9C+0LTQvNC10YHQsDog0L7QvdC4INCy0YvQsdGA0LDQvdGLCiAgICog0YHRgtGD0L/QtdC90Y/QvNC4INC/0LDQu9C40YLRgNGLLCDQuCDRhNC+0YDQvNGD0LvQsCDRgdC00LLQuNC90YPQu9CwINCx0YsgYXp1cmUtYWN0aXZlINC90LAgMzIg0LXQtNC40L3QuNGG0Ysg0LrQsNC90LDQu9CwLgogICAqLwogIC0tZ3ItcHJpbWFyeS1zb2xpZDogdmFyKC0tZ3ItcHJpbWFyeSk7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWhvdmVyOiB2YXIoLS1nci1wcmltYXJ5LWhvdmVyKTsKICAtLWdyLXByaW1hcnktc29saWQtYWN0aXZlOiB2YXIoLS1nci1wcmltYXJ5LWFjdGl2ZSk7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWZnOiB2YXIoLS1nci1wcmltYXJ5LWZnKTsKICAtLWdyLXN1Y2Nlc3Mtc29saWQ6ICMwNDc4NTc7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWhvdmVyOiAjMDM2YzRkOwogIC0tZ3Itc3VjY2Vzcy1zb2xpZC1hY3RpdmU6ICMwMjVmNDQ7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLXdhcm5pbmctc29saWQ6ICNjMjQxMGM7CiAgLS1nci13YXJuaW5nLXNvbGlkLWhvdmVyOiAjYjUzYjBhOwogIC0tZ3Itd2FybmluZy1zb2xpZC1hY3RpdmU6ICM5ZjMzMDc7CiAgLS1nci13YXJuaW5nLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLWRhbmdlci1zb2xpZDogdmFyKC0tZ3ItZGFuZ2VyKTsKICAtLWdyLWRhbmdlci1zb2xpZC1ob3ZlcjogdmFyKC0tZ3ItZGFuZ2VyLWhvdmVyKTsKICAtLWdyLWRhbmdlci1zb2xpZC1hY3RpdmU6IHZhcigtLWdyLWRhbmdlci1hY3RpdmUpOwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWZnOiB2YXIoLS1nci1kYW5nZXItZmcpOwogIC0tZ3ItaW5mby1zb2xpZDogdmFyKC0tZ3ItaW5mbyk7CiAgLS1nci1pbmZvLXNvbGlkLWhvdmVyOiB2YXIoLS1nci1pbmZvLWhvdmVyKTsKICAtLWdyLWluZm8tc29saWQtYWN0aXZlOiB2YXIoLS1nci1pbmZvLWFjdGl2ZSk7CiAgLS1nci1pbmZvLXNvbGlkLWZnOiB2YXIoLS1nci1pbmZvLWZnKTsKICAtLWdyLXNsYXRlLXNvbGlkOiB2YXIoLS1nci1zbGF0ZSk7CiAgLS1nci1zbGF0ZS1zb2xpZC1ob3ZlcjogdmFyKC0tZ3Itc2xhdGUtaG92ZXIpOwogIC0tZ3Itc2xhdGUtc29saWQtYWN0aXZlOiB2YXIoLS1nci1zbGF0ZS1hY3RpdmUpOwogIC0tZ3Itc2xhdGUtc29saWQtZmc6IHZhcigtLWdyLXNsYXRlLWZnKTsKICAtLWdyLWF6dXJlLXNvbGlkOiAjMDM2OWExOwogIC0tZ3ItYXp1cmUtc29saWQtaG92ZXI6ICMwNzU5ODU7CiAgLS1nci1henVyZS1zb2xpZC1hY3RpdmU6ICMwYzRhNmU7CiAgLS1nci1henVyZS1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtMCk7CgogIC8qIERhdGEgdmlzdWFsaXphdGlvbiByb2xlcyAqLwogIC0tZ3ItY2hhcnQtMTogIzRmNDZlNTsKICAtLWdyLWNoYXJ0LTI6ICMxMGI5ODE7CiAgLS1nci1jaGFydC0zOiAjZjk3MzE2OwogIC0tZ3ItY2hhcnQtNDogIzYzNjZmMTsKICAtLWdyLWNoYXJ0LTU6ICM4YjVjZjY7CgogIC8qIE5hdmlnYXRpb24gcm9sZXMgKi8KICAtLWdyLXNpZGViYXI6ICNmZmZmZmY7CiAgLS1nci1zaWRlYmFyLWZnOiAjMGYxNzJhOwogIC0tZ3Itc2lkZWJhci1wcmltYXJ5OiAjNGY0NmU1OwogIC0tZ3Itc2lkZWJhci1wcmltYXJ5LWZnOiAjZmZmZmZmOwogIC0tZ3Itc2lkZWJhci1hY2NlbnQ6ICNmMWY1Zjk7CiAgLS1nci1zaWRlYmFyLWFjY2VudC1mZzogIzFlMjkzYjsKICAtLWdyLXNpZGViYXItYnJkOiAjZTJlOGYwOwogIC0tZ3Itc2lkZWJhci1yaW5nOiAjNjM2NmYxOwp9CgpAc3VwcG9ydHMgbm90IChjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICMwMDAgNTAlLCAjZmZmKSkgewogIDpyb290IHsKICAgIC8qIEFjdGlvbiByb2xlIGZhbGxiYWNrcyAqLwogICAgLS1nci1wcmltYXJ5LWhvdmVyOiAjNGE0MmQ2OwogICAgLS1nci1wcmltYXJ5LWFjdGl2ZTogIzQ1M2VjNzsKICAgIC0tZ3Itc2Vjb25kYXJ5LWhvdmVyOiAjZDFkN2UwOwogICAgLS1nci1zZWNvbmRhcnktYWN0aXZlOiAjYzBjN2QwOwogICAgLS1nci1icmQtaG92ZXI6ICNhM2E5YjU7CiAgICAtLWdyLWJyZC1hY3RpdmU6ICM4MzhhOTc7CgogICAgLyogU3RhdHVzIHJvbGUgZmFsbGJhY2tzICovCiAgICAtLWdyLXN1Y2Nlc3MtaG92ZXI6ICMxMGFjN2E7CiAgICAtLWdyLXN1Y2Nlc3MtYWN0aXZlOiAjMTA5ZjczOwogICAgLS1nci13YXJuaW5nLWhvdmVyOiAjZTY2YzE4OwogICAgLS1nci13YXJuaW5nLWFjdGl2ZTogI2Q0NjQxOTsKICAgIC0tZ3ItZGFuZ2VyLWhvdmVyOiAjY2MyNTI2OwogICAgLS1nci1kYW5nZXItYWN0aXZlOiAjYmIyNDI3OwogICAgLS1nci1pbmZvLWhvdmVyOiAjMjM1ZGRjOwogICAgLS1nci1pbmZvLWFjdGl2ZTogIzIxNTdjYzsKICAgIC0tZ3Itc2xhdGUtaG92ZXI6ICM0MzUwNjQ7CiAgICAtLWdyLXNsYXRlLWFjdGl2ZTogIzNlNGI1ZjsKICAgIC0tZ3ItYXp1cmUtaG92ZXI6ICMwMTZmYWI7CiAgICAtLWdyLWF6dXJlLWFjdGl2ZTogIzAyNjhhMDsKICB9Cn0K", "" + import.meta.url).href,
|
|
95
|
-
dark: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KLyoKICog0KLRkdC80L3QsNGPINGC0LXQvNCwLiDQmtCw0L3QvtC9IOKAlCDQsNGC0YDQuNCx0YPRgiBgW2RhdGEtdGhlbWU9J2RhcmsnXWAg0L3QsCBgPGh0bWw+YCAo0LXQs9C+INGB0YLQsNCy0LjRggogKiBgdXNlVGhlbWVgL2Bpbml0VGhlbWVFYXJseWApLiDQodC10LvQtdC60YLQvtGAIGAuZGFya2Ag0L7RgdGC0LDQstC70LXQvSDQtNC70Y8g0LjQvdGC0LXRgNC+0L/QsCDRgQogKiBjbGFzcy3RgdGC0YDQsNGC0LXQs9C40LXQuSBUYWlsd2luZC9Vbm9DU1M6INC/0YDQuNC70L7QttC10L3QuNC1INC80L7QttC10YIg0YPQttC1INC/0LXRgNC10LrQu9GO0YfQsNGC0Ywg0YLQtdC80YMg0LjQvC4KICovCltkYXRhLXRoZW1lPSdkYXJrJ10sCi5kYXJrIHsKICAvKiBTdXJmYWNlIHJvbGVzICovCiAgLS1nci1iZzogIzBmMTcyYTsKICAtLWdyLWZnOiAjZjhmYWZjOwogIC0tZ3ItY2FyZDogIzFlMjkzYjsKICAtLWdyLWNhcmQtZmc6ICNmOGZhZmM7CiAgLS1nci1wb3BvdmVyOiAjMWUyOTNiOwogIC0tZ3ItcG9wb3Zlci1mZzogI2Y4ZmFmYzsKICAtLWdyLW11dGVkOiAjMzM0MTU1OwogIC8qCiAgICog0KHQuNC80LzQtdGC0YDQuNGH0L3QviBsaWdodDog0LzQuNC90LjQvNGD0Lwg0L/QviDRhNC+0L3RgyBgLS1nci1tdXRlZGAvYC0tZ3Itc2Vjb25kYXJ5YCAoIzMzNDE1NSkuCiAgICog0J/RgNC10LbQvdC40LkgIzk0YTNiOCDQtNCw0LLQsNC7INGC0LDQvCA0LjA0LCAjYWFiNmM3INC00LDRkdGCIDUuMDQuCiAgICovCiAgLS1nci1tdXRlZC1mZzogI2FhYjZjNzsKICAtLWdyLXNlY29uZGFyeTogIzMzNDE1NTsKICAtLWdyLXNlY29uZGFyeS1mZzogI2YxZjVmOTsKICAtLWdyLW92ZXJsYXktYmc6IHJnYigyIDYgMjMgLyAwLjY1KTsKICAtLWdyLWJyZDogIzMzNDE1NTsKICAtLWdyLWlucHV0OiAjMzM0MTU1OwogIC0tZ3ItcmluZzogIzgxOGNmODsKCiAgLyogU3RhdGUgcm9sZXMgKi8KICAtLWdyLWRpc2FibGVkLWJnOiAjMjczNTQ4OwogIC0tZ3ItZGlzYWJsZWQtZmc6ICM2NDc0OGI7CiAgLS1nci1kaXNhYmxlZC1icmQ6ICMzMzQxNTU7CiAgLyoKICAgKiDQntGI0LjQsdC60LAg0LLQsNC70LjQtNCw0YbQuNC4INC4INC00LXQutC+0YDQsNGC0LjQstC90YvQuSDRgtC+0L0gYHN0YXRlPSJkYW5nZXIiYCDigJQg0YDQsNC30L3Ri9C1INCy0LXRidC4LCDRhdC+0YLRjwogICAqINCy0YvQs9C70Y/QtNGP0YIg0L7QtNC40L3QsNC60L7QstC+INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLiDQodGB0YvQu9C60LAsINCwINC90LUg0LrQvtC/0LjRjyBoZXg6INGC0LXQvNCwLCDQv9C+0LzQtdC90Y/QstGI0LDRjwogICAqINGC0L7Qu9GM0LrQviBgLS1nci1kYW5nZXJgLCDQvdC1INC+0LHRj9C30LDQvdCwINC/0L7QvNC90LjRgtGMINC/0YDQviDQstGC0L7RgNC+0Lkg0L3QsNCx0L7RgCwg0LAg0YLQtdC80LAsINC60L7RgtC+0YDQvtC5CiAgICog0L3Rg9C20LXQvSDQvtGC0LTQtdC70YzQvdGL0Lkg0YbQstC10YIg0L7RiNC40LHQutC4LCDQv9C10YDQtdC60YDQsNGI0LjQstCw0LXRgiDRgtGA0Lgg0YDQvtC70Lgg0Lgg0L3QtSDRgtGA0L7Qs9Cw0LXRgiBkYW5nZXIt0YLQvtC9LgogICAqLwogIC0tZ3ItaW52YWxpZC1icmQ6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXJpbmc6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXRleHQ6IHZhcigtLWdyLWRhbmdlci10ZXh0KTsKCiAgLyogQWN0aW9uIHJvbGVzICovCiAgLyoKICAgKiBQcmltYXJ5INCx0YvQuyDQtdC00LjQvdGB0YLQstC10L3QvdGL0Lwg0YLQvtC90L7QvCwg0LLRi9C/0LDQtNCw0LLRiNC40Lwg0LjQtyDQutC+0L3QstC10L3RhtC40Lgg0YLRkdC80L3QvtC5INGC0LXQvNGLCiAgICogKNGB0LLQtdGC0LvQsNGPINC30LDQu9C40LLQutCwICsg0YLRkdC80L3Ri9C5INGC0LXQutGB0YIsINC60LDQuiDRgyBzdWNjZXNzL3dhcm5pbmcvZGFuZ2VyL2luZm8vYXp1cmUpOgogICAqINC+0YHRgtCw0LLQsNC70YHRjyDRgdCy0LXRgtC70L4t0YLRkdC80L3Ri9C8INC40L3QtNC40LPQviAjNjM2NmYxINGBINCx0LXQu9GL0Lwg0YLQtdC60YHRgtC+0Lwg0Lgg0L/RgNC+0LLQsNC70LjQstCw0Lsg0YHRgNCw0LfRgwogICAqINCy0YHQtSDRgtGA0Lgg0YDQvtC70Lgg4oCUINGC0LXQutGB0YIg0L3QsCDRhNC+0L3QtSA0LjAwLCDRgtC10LrRgdGCINC90LAg0LrQsNGA0YLQvtGH0LrQtSAzLjI3LCDQsdC10LvRi9C5INC90LAKICAgKiDQt9Cw0LvQuNCy0LrQtSA0LjQ3LiDQodCy0LXRgtC70YvQuSDQuNC90LTQuNCz0L4g0YEg0YLRkdC80L3Ri9C8IGAtZmdgINC00LDRkdGCIDYuMzggLyA1LjIzIC8gNi4zOC4KICAgKiDQndC1IGluZGlnby00MDAgKCM4MThjZjgpOiDQsiDRgtGDINGB0YLQvtGA0L7QvdGDINC70LXQttC40YIgYC0tZ3ItaW5mb2AsINC4INGD0LLQtdGB0YLQuCBwcmltYXJ5CiAgICog0YLRg9C00LAg0LfQvdCw0YfQuNC70L4g0LHRiyDQstC10YDQvdGD0YLRjCDRgdC70LjRj9C90LjQtSDQtNCy0YPRhSDRgtC+0L3QvtCyLCDRgNCw0LTQuCDRgNCw0LfQstC10LTQtdC90LjRjyDQutC+0YLQvtGA0L7Qs9C+IGluZm8KICAgKiDQuCDQv9C10YDQtdC60YDQsNGI0LXQvSDQsiDRgdC40L3QuNC5LgogICAqINCa0L3QvtC/0L7QuiDQvdC1INC60LDRgdCw0LXRgtGB0Y86IEdyQnV0dG9uINC30LDQtNCw0ZHRgiDRgdCy0L7QuSBgLS1nci1idXR0b24tcHJpbWFyeS1iZ2AuCiAgICovCiAgLS1nci1wcmltYXJ5OiAjOWQ4YmZhOwogIC0tZ3ItcHJpbWFyeS1mZzogIzBmMTcyYTsKICAtLWdyLWFjY2VudDogIzFlMWI0YjsKICAtLWdyLWFjY2VudC1mZzogI2M3ZDJmZTsKCiAgLyogU3RhdHVzIHJvbGVzICovCiAgLS1nci1zdWNjZXNzOiAjMzRkMzk5OwogIC0tZ3Itc3VjY2Vzcy1saWdodDogIzA2NGUzYjsKICAtLWdyLXN1Y2Nlc3MtZmc6ICMwZjE3MmE7CiAgLS1nci1wcmltYXJ5LXRleHQ6ICNjN2QyZmU7CiAgLS1nci1zdWNjZXNzLXRleHQ6ICM2ZWU3Yjc7CiAgLS1nci13YXJuaW5nOiAjZmI5MjNjOwogIC0tZ3Itd2FybmluZy1saWdodDogIzdjMmQxMjsKICAtLWdyLXdhcm5pbmctZmc6ICMwZjE3MmE7CiAgLS1nci13YXJuaW5nLXRleHQ6ICNmZGJhNzQ7CiAgLS1nci1kYW5nZXI6ICNmODcxNzE7CiAgLS1nci1kYW5nZXItbGlnaHQ6ICM3ZjFkMWQ7CiAgLS1nci1kYW5nZXItZmc6ICMwZjE3MmE7CiAgLS1nci1kYW5nZXItdGV4dDogI2ZjYTVhNTsKICAtLWdyLWluZm86ICM2MGE1ZmE7CiAgLS1nci1pbmZvLWxpZ2h0OiAjMWUzYThhOwogIC0tZ3ItaW5mby1mZzogIzBmMTcyYTsKICAtLWdyLWluZm8tdGV4dDogI2JmZGJmZTsKICAtLWdyLXNsYXRlOiAjOTRhM2I4OwogIC0tZ3Itc2xhdGUtbGlnaHQ6ICMzMzQxNTU7CiAgLS1nci1zbGF0ZS1mZzogIzBmMTcyYTsKICAtLWdyLXNsYXRlLXRleHQ6ICNjYmQ1ZTE7CiAgLS1nci1henVyZTogIzM4YmRmODsKICAtLWdyLWF6dXJlLWxpZ2h0OiAjMGM0YTZlOwogIC0tZ3ItYXp1cmUtZmc6ICMwZjE3MmE7CiAgLS1nci1henVyZS10ZXh0OiAjYmFlNmZkOwoKICAvKgogICAqIFNvbGlkIGZpbGwgcm9sZXMKICAgKgogICAqINCh0L/Qu9C+0YjQvdCw0Y8g0LfQsNC70LjQstC60LAg0LrQvdC+0L/QvtGH0L3QvtCz0L4g0LLQtdGB0LAg0Lgg0LXRkSDRgtC10LrRgdGCLgogICAqCiAgICog0JIg0YLRkdC80L3QvtC5INGC0LXQvNC1INGB0L7QsdGB0YLQstC10L3QvdGL0LUg0LfQvdCw0YfQtdC90LjRjyDQvdGD0LbQvdGLINCy0YHQtdC8INGB0LXQvNC4INGC0L7QvdCw0Lw6INCz0LvQvtCx0LDQu9GM0L3Ri9C1CiAgICogYC0tZ3Ite3RvbmV9YCDQt9C00LXRgdGMIOKAlCDQv9Cw0YHRgtC10LvRjNC90YvQtSDQt9Cw0LvQuNCy0LrQuCDQv9C+0LQg0KLQgdCc0J3Qq9CZINGC0LXQutGB0YIsINCwINC60L3QvtC/0LrQsCDQvtCx0Y/Qt9Cw0L3QsAogICAqINC+0YHRgtCw0YLRjNGB0Y8g0L3QsNGB0YvRidC10L3QvdC+0Lkg0YHQviDRgdCy0LXRgtC70L7QuSDQv9C+0LTQv9C40YHRjNGOLgogICAqCiAgICogaG92ZXIg0LggYWN0aXZlINGD0LLQvtC00Y/RgiDQt9Cw0LvQuNCy0LrRgyDRgtC10LzQvdC10LUsINCwINC90LUg0YHQstC10YLQu9C10LU6INC+0LHRidCw0Y8g0YTQvtGA0LzRg9C70LAg0L/QvtC00LzQtdGB0LAg0LoKICAgKiBgLS1nci1mZ2Ag0LIg0YLRkdC80L3QvtC5INGC0LXQvNC1INC+0YHQstC10YLQu9GP0LvQsCDQsdGLINC60L3QvtC/0LrRgyDQv9C+
|
|
95
|
+
dark: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KLyoKICog0KLRkdC80L3QsNGPINGC0LXQvNCwLiDQmtCw0L3QvtC9IOKAlCDQsNGC0YDQuNCx0YPRgiBgW2RhdGEtdGhlbWU9J2RhcmsnXWAg0L3QsCBgPGh0bWw+YCAo0LXQs9C+INGB0YLQsNCy0LjRggogKiBgdXNlVGhlbWVgL2Bpbml0VGhlbWVFYXJseWApLiDQodC10LvQtdC60YLQvtGAIGAuZGFya2Ag0L7RgdGC0LDQstC70LXQvSDQtNC70Y8g0LjQvdGC0LXRgNC+0L/QsCDRgQogKiBjbGFzcy3RgdGC0YDQsNGC0LXQs9C40LXQuSBUYWlsd2luZC9Vbm9DU1M6INC/0YDQuNC70L7QttC10L3QuNC1INC80L7QttC10YIg0YPQttC1INC/0LXRgNC10LrQu9GO0YfQsNGC0Ywg0YLQtdC80YMg0LjQvC4KICovCltkYXRhLXRoZW1lPSdkYXJrJ10sCi5kYXJrIHsKICAvKiBTdXJmYWNlIHJvbGVzICovCiAgLS1nci1iZzogIzBmMTcyYTsKICAtLWdyLWZnOiAjZjhmYWZjOwogIC0tZ3ItY2FyZDogIzFlMjkzYjsKICAtLWdyLWNhcmQtZmc6ICNmOGZhZmM7CiAgLS1nci1wb3BvdmVyOiAjMWUyOTNiOwogIC0tZ3ItcG9wb3Zlci1mZzogI2Y4ZmFmYzsKICAtLWdyLW11dGVkOiAjMzM0MTU1OwogIC8qCiAgICog0KHQuNC80LzQtdGC0YDQuNGH0L3QviBsaWdodDog0LzQuNC90LjQvNGD0Lwg0L/QviDRhNC+0L3RgyBgLS1nci1tdXRlZGAvYC0tZ3Itc2Vjb25kYXJ5YCAoIzMzNDE1NSkuCiAgICog0J/RgNC10LbQvdC40LkgIzk0YTNiOCDQtNCw0LLQsNC7INGC0LDQvCA0LjA0LCAjYWFiNmM3INC00LDRkdGCIDUuMDQuCiAgICovCiAgLS1nci1tdXRlZC1mZzogI2FhYjZjNzsKICAtLWdyLXNlY29uZGFyeTogIzMzNDE1NTsKICAtLWdyLXNlY29uZGFyeS1mZzogI2YxZjVmOTsKICAtLWdyLW92ZXJsYXktYmc6IHJnYigyIDYgMjMgLyAwLjY1KTsKICAtLWdyLWJyZDogIzMzNDE1NTsKICAtLWdyLWlucHV0OiAjMzM0MTU1OwogIC0tZ3ItcmluZzogIzgxOGNmODsKCiAgLyogU3RhdGUgcm9sZXMgKi8KICAtLWdyLWRpc2FibGVkLWJnOiAjMjczNTQ4OwogIC0tZ3ItZGlzYWJsZWQtZmc6ICM2NDc0OGI7CiAgLS1nci1kaXNhYmxlZC1icmQ6ICMzMzQxNTU7CiAgLyoKICAgKiDQntGI0LjQsdC60LAg0LLQsNC70LjQtNCw0YbQuNC4INC4INC00LXQutC+0YDQsNGC0LjQstC90YvQuSDRgtC+0L0gYHN0YXRlPSJkYW5nZXIiYCDigJQg0YDQsNC30L3Ri9C1INCy0LXRidC4LCDRhdC+0YLRjwogICAqINCy0YvQs9C70Y/QtNGP0YIg0L7QtNC40L3QsNC60L7QstC+INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLiDQodGB0YvQu9C60LAsINCwINC90LUg0LrQvtC/0LjRjyBoZXg6INGC0LXQvNCwLCDQv9C+0LzQtdC90Y/QstGI0LDRjwogICAqINGC0L7Qu9GM0LrQviBgLS1nci1kYW5nZXJgLCDQvdC1INC+0LHRj9C30LDQvdCwINC/0L7QvNC90LjRgtGMINC/0YDQviDQstGC0L7RgNC+0Lkg0L3QsNCx0L7RgCwg0LAg0YLQtdC80LAsINC60L7RgtC+0YDQvtC5CiAgICog0L3Rg9C20LXQvSDQvtGC0LTQtdC70YzQvdGL0Lkg0YbQstC10YIg0L7RiNC40LHQutC4LCDQv9C10YDQtdC60YDQsNGI0LjQstCw0LXRgiDRgtGA0Lgg0YDQvtC70Lgg0Lgg0L3QtSDRgtGA0L7Qs9Cw0LXRgiBkYW5nZXIt0YLQvtC9LgogICAqLwogIC0tZ3ItaW52YWxpZC1icmQ6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXJpbmc6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXRleHQ6IHZhcigtLWdyLWRhbmdlci10ZXh0KTsKCiAgLyogQWN0aW9uIHJvbGVzICovCiAgLyoKICAgKiBQcmltYXJ5INCx0YvQuyDQtdC00LjQvdGB0YLQstC10L3QvdGL0Lwg0YLQvtC90L7QvCwg0LLRi9C/0LDQtNCw0LLRiNC40Lwg0LjQtyDQutC+0L3QstC10L3RhtC40Lgg0YLRkdC80L3QvtC5INGC0LXQvNGLCiAgICogKNGB0LLQtdGC0LvQsNGPINC30LDQu9C40LLQutCwICsg0YLRkdC80L3Ri9C5INGC0LXQutGB0YIsINC60LDQuiDRgyBzdWNjZXNzL3dhcm5pbmcvZGFuZ2VyL2luZm8vYXp1cmUpOgogICAqINC+0YHRgtCw0LLQsNC70YHRjyDRgdCy0LXRgtC70L4t0YLRkdC80L3Ri9C8INC40L3QtNC40LPQviAjNjM2NmYxINGBINCx0LXQu9GL0Lwg0YLQtdC60YHRgtC+0Lwg0Lgg0L/RgNC+0LLQsNC70LjQstCw0Lsg0YHRgNCw0LfRgwogICAqINCy0YHQtSDRgtGA0Lgg0YDQvtC70Lgg4oCUINGC0LXQutGB0YIg0L3QsCDRhNC+0L3QtSA0LjAwLCDRgtC10LrRgdGCINC90LAg0LrQsNGA0YLQvtGH0LrQtSAzLjI3LCDQsdC10LvRi9C5INC90LAKICAgKiDQt9Cw0LvQuNCy0LrQtSA0LjQ3LiDQodCy0LXRgtC70YvQuSDQuNC90LTQuNCz0L4g0YEg0YLRkdC80L3Ri9C8IGAtZmdgINC00LDRkdGCIDYuMzggLyA1LjIzIC8gNi4zOC4KICAgKiDQndC1IGluZGlnby00MDAgKCM4MThjZjgpOiDQsiDRgtGDINGB0YLQvtGA0L7QvdGDINC70LXQttC40YIgYC0tZ3ItaW5mb2AsINC4INGD0LLQtdGB0YLQuCBwcmltYXJ5CiAgICog0YLRg9C00LAg0LfQvdCw0YfQuNC70L4g0LHRiyDQstC10YDQvdGD0YLRjCDRgdC70LjRj9C90LjQtSDQtNCy0YPRhSDRgtC+0L3QvtCyLCDRgNCw0LTQuCDRgNCw0LfQstC10LTQtdC90LjRjyDQutC+0YLQvtGA0L7Qs9C+IGluZm8KICAgKiDQuCDQv9C10YDQtdC60YDQsNGI0LXQvSDQsiDRgdC40L3QuNC5LgogICAqINCa0L3QvtC/0L7QuiDQvdC1INC60LDRgdCw0LXRgtGB0Y86IEdyQnV0dG9uINC30LDQtNCw0ZHRgiDRgdCy0L7QuSBgLS1nci1idXR0b24tcHJpbWFyeS1iZ2AuCiAgICovCiAgLS1nci1wcmltYXJ5OiAjOWQ4YmZhOwogIC0tZ3ItcHJpbWFyeS1mZzogIzBmMTcyYTsKICAtLWdyLWFjY2VudDogIzFlMWI0YjsKICAtLWdyLWFjY2VudC1mZzogI2M3ZDJmZTsKCiAgLyogU3RhdHVzIHJvbGVzICovCiAgLS1nci1zdWNjZXNzOiAjMzRkMzk5OwogIC0tZ3Itc3VjY2Vzcy1saWdodDogIzA2NGUzYjsKICAtLWdyLXN1Y2Nlc3MtZmc6ICMwZjE3MmE7CiAgLS1nci1wcmltYXJ5LXRleHQ6ICNjN2QyZmU7CiAgLS1nci1zdWNjZXNzLXRleHQ6ICM2ZWU3Yjc7CiAgLS1nci13YXJuaW5nOiAjZmI5MjNjOwogIC0tZ3Itd2FybmluZy1saWdodDogIzdjMmQxMjsKICAtLWdyLXdhcm5pbmctZmc6ICMwZjE3MmE7CiAgLS1nci13YXJuaW5nLXRleHQ6ICNmZGJhNzQ7CiAgLS1nci1kYW5nZXI6ICNmODcxNzE7CiAgLS1nci1kYW5nZXItbGlnaHQ6ICM3ZjFkMWQ7CiAgLS1nci1kYW5nZXItZmc6ICMwZjE3MmE7CiAgLS1nci1kYW5nZXItdGV4dDogI2ZjYTVhNTsKICAtLWdyLWluZm86ICM2MGE1ZmE7CiAgLS1nci1pbmZvLWxpZ2h0OiAjMWUzYThhOwogIC0tZ3ItaW5mby1mZzogIzBmMTcyYTsKICAtLWdyLWluZm8tdGV4dDogI2JmZGJmZTsKICAtLWdyLXNsYXRlOiAjOTRhM2I4OwogIC0tZ3Itc2xhdGUtbGlnaHQ6ICMzMzQxNTU7CiAgLS1nci1zbGF0ZS1mZzogIzBmMTcyYTsKICAtLWdyLXNsYXRlLXRleHQ6ICNjYmQ1ZTE7CiAgLS1nci1henVyZTogIzM4YmRmODsKICAtLWdyLWF6dXJlLWxpZ2h0OiAjMGM0YTZlOwogIC0tZ3ItYXp1cmUtZmc6ICMwZjE3MmE7CiAgLS1nci1henVyZS10ZXh0OiAjYmFlNmZkOwoKICAvKgogICAqIFNvbGlkIGZpbGwgcm9sZXMKICAgKgogICAqINCh0L/Qu9C+0YjQvdCw0Y8g0LfQsNC70LjQstC60LAg0LrQvdC+0L/QvtGH0L3QvtCz0L4g0LLQtdGB0LAg0Lgg0LXRkSDRgtC10LrRgdGCLgogICAqCiAgICog0JIg0YLRkdC80L3QvtC5INGC0LXQvNC1INGB0L7QsdGB0YLQstC10L3QvdGL0LUg0LfQvdCw0YfQtdC90LjRjyDQvdGD0LbQvdGLINCy0YHQtdC8INGB0LXQvNC4INGC0L7QvdCw0Lw6INCz0LvQvtCx0LDQu9GM0L3Ri9C1CiAgICogYC0tZ3Ite3RvbmV9YCDQt9C00LXRgdGMIOKAlCDQv9Cw0YHRgtC10LvRjNC90YvQtSDQt9Cw0LvQuNCy0LrQuCDQv9C+0LQg0KLQgdCc0J3Qq9CZINGC0LXQutGB0YIsINCwINC60L3QvtC/0LrQsCDQvtCx0Y/Qt9Cw0L3QsAogICAqINC+0YHRgtCw0YLRjNGB0Y8g0L3QsNGB0YvRidC10L3QvdC+0Lkg0YHQviDRgdCy0LXRgtC70L7QuSDQv9C+0LTQv9C40YHRjNGOLgogICAqCiAgICogaG92ZXIg0LggYWN0aXZlINGD0LLQvtC00Y/RgiDQt9Cw0LvQuNCy0LrRgyDRgtC10LzQvdC10LUsINCwINC90LUg0YHQstC10YLQu9C10LU6INC+0LHRidCw0Y8g0YTQvtGA0LzRg9C70LAg0L/QvtC00LzQtdGB0LAg0LoKICAgKiBgLS1nci1mZ2Ag0LIg0YLRkdC80L3QvtC5INGC0LXQvNC1INC+0YHQstC10YLQu9GP0LvQsCDQsdGLINC60L3QvtC/0LrRgyDQv9C+0LQg0LrRg9GA0YHQvtGA0L7QvC4KICAgKi8KICAtLWdyLXByaW1hcnktc29saWQ6ICM1OTVjZTY7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWhvdmVyOiAjNTA1M2RkOwogIC0tZ3ItcHJpbWFyeS1zb2xpZC1hY3RpdmU6ICM0NzRhY2Y7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLXN1Y2Nlc3Mtc29saWQ6ICMwNDc4NTc7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWhvdmVyOiAjMDM2YzRkOwogIC0tZ3Itc3VjY2Vzcy1zb2xpZC1hY3RpdmU6ICMwMjVmNDQ7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS01MCk7CiAgLS1nci13YXJuaW5nLXNvbGlkOiAjYzI0MTBjOwogIC0tZ3Itd2FybmluZy1zb2xpZC1ob3ZlcjogI2I1M2IwYTsKICAtLWdyLXdhcm5pbmctc29saWQtYWN0aXZlOiAjOWYzMzA3OwogIC0tZ3Itd2FybmluZy1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItZGFuZ2VyLXNvbGlkOiAjYjkxYzFjOwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWhvdmVyOiAjYTkxOTE5OwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWFjdGl2ZTogIzkzMTUxNTsKICAtLWdyLWRhbmdlci1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItaW5mby1zb2xpZDogIzFkNGVkODsKICAtLWdyLWluZm8tc29saWQtaG92ZXI6ICMxZTQwYWY7CiAgLS1nci1pbmZvLXNvbGlkLWFjdGl2ZTogIzFlM2E4YTsKICAtLWdyLWluZm8tc29saWQtZmc6IHZhcigtLWdyLXNsYXRlLTUwKTsKICAtLWdyLXNsYXRlLXNvbGlkOiB2YXIoLS1nci1zbGF0ZS02MDApOwogIC0tZ3Itc2xhdGUtc29saWQtaG92ZXI6IHZhcigtLWdyLXNsYXRlLTcwMCk7CiAgLS1nci1zbGF0ZS1zb2xpZC1hY3RpdmU6IHZhcigtLWdyLXNsYXRlLTgwMCk7CiAgLS1nci1zbGF0ZS1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItYXp1cmUtc29saWQ6ICMwMzY5YTE7CiAgLS1nci1henVyZS1zb2xpZC1ob3ZlcjogIzA3NTk4NTsKICAtLWdyLWF6dXJlLXNvbGlkLWFjdGl2ZTogIzBjNGE2ZTsKICAtLWdyLWF6dXJlLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS01MCk7CgogIC8qIERhdGEgdmlzdWFsaXphdGlvbiByb2xlcyAqLwogIC0tZ3ItY2hhcnQtMTogIzYzNjZmMTsKICAtLWdyLWNoYXJ0LTI6ICMzNGQzOTk7CiAgLS1nci1jaGFydC0zOiAjZmI5MjNjOwogIC0tZ3ItY2hhcnQtNDogIzgxOGNmODsKICAtLWdyLWNoYXJ0LTU6ICNhNzhiZmE7CgogIC8qIE5hdmlnYXRpb24gcm9sZXMgKi8KICAtLWdyLXNpZGViYXI6ICMxZTI5M2I7CiAgLS1nci1zaWRlYmFyLWZnOiAjZjhmYWZjOwogIC8qCiAgICog0JHQtdC70YvQuSDRgtC10LrRgdGCINC90LAgIzYzNjZmMSDQtNCw0ZHRgiA0LjQ3OjEg4oCUINGC0L7RgiDQttC1INC90LXQtNC+0LvRkdGCIEFBLCDQuNC3LdC30LAg0LrQvtGC0L7RgNC+0LPQvgogICAqINC/0LXRgNC10LrRgNCw0YjQtdC9IGAtLWdyLXByaW1hcnlgICjQt9Cw0LzQtdGC0LrQsCDQstGL0YjQtSkuINCX0LTQtdGB0Ywg0LLQt9GP0YIg0LzQuNC90LjQvNCw0LvRjNC90YvQuSDRiNCw0LMsINGB0L3QuNC80LDRjtGJ0LjQuQogICAqINC90LXQtNC+0LvRkdGCINCx0LXQtyDRgdC80LXQvdGLINCy0LjQtNCwOiA0LjUyOjEg0L/RgNC4IM6URSAwLjQyINC6INC/0YDQtdC20L3QtdC80YMg0YbQstC10YLRgy4KICAgKi8KICAtLWdyLXNpZGViYXItcHJpbWFyeTogIzYzNjVmMDsKICAtLWdyLXNpZGViYXItcHJpbWFyeS1mZzogI2ZmZmZmZjsKICAtLWdyLXNpZGViYXItYWNjZW50OiAjMzM0MTU1OwogIC0tZ3Itc2lkZWJhci1hY2NlbnQtZmc6ICNmMWY1Zjk7CiAgLS1nci1zaWRlYmFyLWJyZDogIzMzNDE1NTsKICAtLWdyLXNpZGViYXItcmluZzogIzgxOGNmODsKfQoKQHN1cHBvcnRzIG5vdCAoY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjMDAwIDUwJSwgI2ZmZikpIHsKICBbZGF0YS10aGVtZT0nZGFyayddLAogIC5kYXJrIHsKICAgIC8qIEFjdGlvbiByb2xlIGZhbGxiYWNrcyAqLwogICAgLS1nci1wcmltYXJ5LWhvdmVyOiAjYTQ5NGZhOwogICAgLS1nci1wcmltYXJ5LWFjdGl2ZTogI2FjOWRmYTsKICAgIC0tZ3Itc2Vjb25kYXJ5LWhvdmVyOiAjNDM1MDYyOwogICAgLS1nci1zZWNvbmRhcnktYWN0aXZlOiAjNTM1ZjcwOwogICAgLS1nci1icmQtaG92ZXI6ICM2ZTc5ODc7CiAgICAtLWdyLWJyZC1hY3RpdmU6ICM4Yzk0YTA7CgogICAgLyogU3RhdHVzIHJvbGUgZmFsbGJhY2tzICovCiAgICAtLWdyLXN1Y2Nlc3MtaG92ZXI6ICM0NGQ2YTE7CiAgICAtLWdyLXN1Y2Nlc3MtYWN0aXZlOiAjNTNkOWE5OwogICAgLS1nci13YXJuaW5nLWhvdmVyOiAjZmI5YTRiOwogICAgLS1nci13YXJuaW5nLWFjdGl2ZTogI2ZiYTM1YjsKICAgIC0tZ3ItZGFuZ2VyLWhvdmVyOiAjZjg3YzdjOwogICAgLS1nci1kYW5nZXItYWN0aXZlOiAjZjg4Nzg3OwogICAgLS1nci1pbmZvLWhvdmVyOiAjNmNhY2ZhOwogICAgLS1nci1pbmZvLWFjdGl2ZTogIzc4YjNmYTsKICAgIC0tZ3Itc2xhdGUtaG92ZXI6ICM5Y2FhYmQ7CiAgICAtLWdyLXNsYXRlLWFjdGl2ZTogI2E0YjFjMzsKICAgIC0tZ3ItYXp1cmUtaG92ZXI6ICM0N2MyZjg7CiAgICAtLWdyLWF6dXJlLWFjdGl2ZTogIzU3YzdmOTsKICB9Cn0K", "" + import.meta.url).href
|
|
96
96
|
},
|
|
97
97
|
defaultThemes: granularityDefaultThemes
|
|
98
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"granular-provider-B9nXQCMu.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/config.ts","../../src/granular-provider/shared.ts","../../src/granular-provider/index.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grResponseErrorBannerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrResponseErrorBanner',\n dependencies: ['GrAlert', 'GrButton'],\n})\n","// `id`, `theme.*`, `packageBaseUrl` и реестр компонентов провайдера.\n//\n// Все `new URL('../styles/...', import.meta.url)` обязаны лежать именно здесь:\n// `shared.ts` в одной директории с `index.ts` / `node.ts`, поэтому\n// относительные пути совпадают. Для браузера безопасно — бандлеры\n// транслируют такие литералы в статические asset-URL.\n//\n// `apps/showcase/scripts/generate-component-api.mjs` читает список компонентов\n// из `Object.keys(granularityComponentConfigs)` через vite SSR.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n resolvePackageBaseUrl,\n} from '@feugene/unocss-preset-granular/contract'\n// <granularity:components:imports> — блок генерируется `yarn generate:registry`\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAutocompleteConfig } from '../components/GrAutocomplete/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grBreadcrumbsConfig } from '../components/GrBreadcrumbs/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grColorPickerConfig } from '../components/GrColorPicker/config'\nimport { grCommandPaletteConfig } from '../components/GrCommandPalette/config'\nimport { grConfigProviderConfig } from '../components/GrConfigProvider/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDialogServiceConfig } from '../components/GrDialogService/config'\nimport { grDividerConfig } from '../components/GrDivider/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormConfig } from '../components/GrForm/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grKbdConfig } from '../components/GrKbd/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grPopoverConfig } from '../components/GrPopover/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grProgressCircleConfig } from '../components/GrProgressCircle/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grRatingConfig } from '../components/GrRating/config'\nimport { grResponseErrorBannerConfig } from '../components/GrResponseErrorBanner/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSliderConfig } from '../components/GrSlider/config'\nimport { grSortableListConfig } from '../components/GrSortableList/config'\nimport { grSplitterConfig } from '../components/GrSplitter/config'\nimport { grStatisticConfig } from '../components/GrStatistic/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabPanelsConfig } from '../components/GrTabPanels/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grTimelineConfig } from '../components/GrTimeline/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\n// </granularity:components:imports>\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// Не заменять на `new URL('..', import.meta.url)`: Vite и rolldown распознают\n// этот литерал и подставляют `data:`-URL, после чего scan-директории пустеют.\nconst packageBaseUrl = resolvePackageBaseUrl(import.meta.url)\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Реестр публичных компонентов. Ключи совпадают с subpath-экспортом\n * `@feugene/granularity/components/<Name>`.\n */\nexport const granularityComponentConfigs = {\n // <granularity:components:registry> — блок генерируется `yarn generate:registry`\n GrAlert: grAlertConfig,\n GrAutocomplete: grAutocompleteConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrBreadcrumbs: grBreadcrumbsConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrDataTable: grDataTableConfig,\n GrDialog: grDialogConfig,\n GrDialogService: grDialogServiceConfig,\n GrDivider: grDividerConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFileUpload: grFileUploadConfig,\n GrForm: grFormConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrKbd: grKbdConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrPopover: grPopoverConfig,\n GrProgressBar: grProgressBarConfig,\n GrProgressCircle: grProgressCircleConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrRating: grRatingConfig,\n GrResponseErrorBanner: grResponseErrorBannerConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSlider: grSliderConfig,\n GrSortableList: grSortableListConfig,\n GrSplitter: grSplitterConfig,\n GrStatistic: grStatisticConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n // </granularity:components:registry>\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета.\n *\n * `overrides` — точка расширения для потребителя: дескриптор с именем из\n * базового реестра заменяет его, остальные дописываются в конец.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n","import { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,OAAO,KAAK,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;ACkFD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,OAAO,KAAK,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,ykXAAA,KAAA,OAAA,KAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,qjYAAA,KAAA,OAAA,KAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,6yRAAA,KAAA,OAAA,KAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,aAAa;CACb,UAAU;CACV,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,cAAc;CACd,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,UAAU;CACV,uBAAuB;CACvB,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;AAEhB;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;AAQA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CAMA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,aARA,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAO3F;EACA;CACF,CAAC;AACH;;;ACtNA,IAAa,sBAAsB,0BAA0B"}
|
|
1
|
+
{"version":3,"file":"granular-provider-C6uAujdJ.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/config.ts","../../src/granular-provider/shared.ts","../../src/granular-provider/index.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grResponseErrorBannerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrResponseErrorBanner',\n dependencies: ['GrAlert', 'GrButton'],\n})\n","// `id`, `theme.*`, `packageBaseUrl` и реестр компонентов провайдера.\n//\n// Все `new URL('../styles/...', import.meta.url)` обязаны лежать именно здесь:\n// `shared.ts` в одной директории с `index.ts` / `node.ts`, поэтому\n// относительные пути совпадают. Для браузера безопасно — бандлеры\n// транслируют такие литералы в статические asset-URL.\n//\n// `apps/showcase/scripts/generate-component-api.mjs` читает список компонентов\n// из `Object.keys(granularityComponentConfigs)` через vite SSR.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n resolvePackageBaseUrl,\n} from '@feugene/unocss-preset-granular/contract'\n// <granularity:components:imports> — блок генерируется `yarn generate:registry`\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAutocompleteConfig } from '../components/GrAutocomplete/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grBreadcrumbsConfig } from '../components/GrBreadcrumbs/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grColorPickerConfig } from '../components/GrColorPicker/config'\nimport { grCommandPaletteConfig } from '../components/GrCommandPalette/config'\nimport { grConfigProviderConfig } from '../components/GrConfigProvider/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDialogServiceConfig } from '../components/GrDialogService/config'\nimport { grDividerConfig } from '../components/GrDivider/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormConfig } from '../components/GrForm/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grKbdConfig } from '../components/GrKbd/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grPopoverConfig } from '../components/GrPopover/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grProgressCircleConfig } from '../components/GrProgressCircle/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grRatingConfig } from '../components/GrRating/config'\nimport { grResponseErrorBannerConfig } from '../components/GrResponseErrorBanner/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSliderConfig } from '../components/GrSlider/config'\nimport { grSortableListConfig } from '../components/GrSortableList/config'\nimport { grSplitterConfig } from '../components/GrSplitter/config'\nimport { grStatisticConfig } from '../components/GrStatistic/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabPanelsConfig } from '../components/GrTabPanels/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grTimelineConfig } from '../components/GrTimeline/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\n// </granularity:components:imports>\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// Не заменять на `new URL('..', import.meta.url)`: Vite и rolldown распознают\n// этот литерал и подставляют `data:`-URL, после чего scan-директории пустеют.\nconst packageBaseUrl = resolvePackageBaseUrl(import.meta.url)\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Реестр публичных компонентов. Ключи совпадают с subpath-экспортом\n * `@feugene/granularity/components/<Name>`.\n */\nexport const granularityComponentConfigs = {\n // <granularity:components:registry> — блок генерируется `yarn generate:registry`\n GrAlert: grAlertConfig,\n GrAutocomplete: grAutocompleteConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrBreadcrumbs: grBreadcrumbsConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrDataTable: grDataTableConfig,\n GrDialog: grDialogConfig,\n GrDialogService: grDialogServiceConfig,\n GrDivider: grDividerConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFileUpload: grFileUploadConfig,\n GrForm: grFormConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrKbd: grKbdConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrPopover: grPopoverConfig,\n GrProgressBar: grProgressBarConfig,\n GrProgressCircle: grProgressCircleConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrRating: grRatingConfig,\n GrResponseErrorBanner: grResponseErrorBannerConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSlider: grSliderConfig,\n GrSortableList: grSortableListConfig,\n GrSplitter: grSplitterConfig,\n GrStatistic: grStatisticConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n // </granularity:components:registry>\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета.\n *\n * `overrides` — точка расширения для потребителя: дескриптор с именем из\n * базового реестра заменяет его, остальные дописываются в конец.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n","import { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,OAAO,KAAK,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;ACkFD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,OAAO,KAAK,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,ykXAAA,KAAA,OAAA,KAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,qjYAAA,KAAA,OAAA,KAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,yxSAAA,KAAA,OAAA,KAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,aAAa;CACb,UAAU;CACV,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,cAAc;CACd,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,UAAU;CACV,uBAAuB;CACvB,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;AAEhB;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;AAQA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CAMA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,aARA,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAO3F;EACA;CACF,CAAC;AACH;;;ACtNA,IAAa,sBAAsB,0BAA0B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createElementBlock, createStaticVNode, markRaw, openBlock } from "vue";
|
|
2
|
+
//#region ~icons/lucide/grip-vertical
|
|
3
|
+
var _hoisted_1 = {
|
|
4
|
+
viewBox: "0 0 24 24",
|
|
5
|
+
width: "1.2em",
|
|
6
|
+
height: "1.2em"
|
|
7
|
+
};
|
|
8
|
+
function render$1(_ctx, _cache) {
|
|
9
|
+
return openBlock(), createElementBlock("svg", _hoisted_1, [..._cache[0] || (_cache[0] = [createStaticVNode("<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"><circle cx=\"9\" cy=\"12\" r=\"1\"></circle><circle cx=\"9\" cy=\"5\" r=\"1\"></circle><circle cx=\"9\" cy=\"19\" r=\"1\"></circle><circle cx=\"15\" cy=\"12\" r=\"1\"></circle><circle cx=\"15\" cy=\"5\" r=\"1\"></circle><circle cx=\"15\" cy=\"19\" r=\"1\"></circle></g>", 1)])]);
|
|
10
|
+
}
|
|
11
|
+
var grip_vertical_default = markRaw({
|
|
12
|
+
name: "lucide-grip-vertical",
|
|
13
|
+
render: render$1
|
|
14
|
+
});
|
|
15
|
+
//#endregion
|
|
16
|
+
export { grip_vertical_default as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grip-vertical-lRha2S7q.js","names":[],"sources":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { markRaw } from "vue";
|
|
2
|
+
//#region src/components/shared/icon.ts
|
|
3
|
+
/**
|
|
4
|
+
* Иконку компонент получает двумя способами, и рисуются они разными тегами.
|
|
5
|
+
*
|
|
6
|
+
* Vue-компонент пакет рисует сам — он ни от чего не зависит. Класс иконки
|
|
7
|
+
* (`i-lucide-*`) генерирует не пакет, а UnoCSS-сборка приложения: без своего
|
|
8
|
+
* `presetIcons` потребитель получит пустое место вместо картинки
|
|
9
|
+
* (`docs/installation.md`). Поэтому класс уезжает в `:class` пустого `span`,
|
|
10
|
+
* а компонент — в `:is`.
|
|
11
|
+
*/
|
|
12
|
+
function iconTag(icon, fallback = "span") {
|
|
13
|
+
if (!icon) return fallback;
|
|
14
|
+
return typeof icon === "string" ? "span" : markRaw(icon);
|
|
15
|
+
}
|
|
16
|
+
/** Класс иконки, если она задана строкой; для компонента классов нет. */
|
|
17
|
+
function iconClass(icon) {
|
|
18
|
+
return typeof icon === "string" ? icon : "";
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { iconTag as n, iconClass as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-Dag2tIMs.js","names":[],"sources":["../../src/components/shared/icon.ts"],"sourcesContent":["import type { Component } from 'vue'\nimport { markRaw } from 'vue'\n\n/**\n * Иконку компонент получает двумя способами, и рисуются они разными тегами.\n *\n * Vue-компонент пакет рисует сам — он ни от чего не зависит. Класс иконки\n * (`i-lucide-*`) генерирует не пакет, а UnoCSS-сборка приложения: без своего\n * `presetIcons` потребитель получит пустое место вместо картинки\n * (`docs/installation.md`). Поэтому класс уезжает в `:class` пустого `span`,\n * а компонент — в `:is`.\n */\nexport function iconTag(\n icon: string | Component | undefined,\n fallback: string | Component = 'span',\n): string | Component {\n if (!icon) return fallback\n\n return typeof icon === 'string' ? 'span' : markRaw(icon)\n}\n\n/** Класс иконки, если она задана строкой; для компонента классов нет. */\nexport function iconClass(icon: string | Component | undefined): string {\n return typeof icon === 'string' ? icon : ''\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,QACd,MACA,WAA+B,QACX;CACpB,IAAI,CAAC,MAAM,OAAO;CAElB,OAAO,OAAO,SAAS,WAAW,SAAS,QAAQ,IAAI;AACzD;;AAGA,SAAgB,UAAU,MAA8C;CACtE,OAAO,OAAO,SAAS,WAAW,OAAO;AAC3C"}
|
|
@@ -31,5 +31,14 @@ function ensurePortalRoot() {
|
|
|
31
31
|
document.body.appendChild(root);
|
|
32
32
|
return root;
|
|
33
33
|
}
|
|
34
|
+
/** Текущий корень портала, если он уже создан. */
|
|
35
|
+
function getPortalRoot() {
|
|
36
|
+
if (typeof document === "undefined") return null;
|
|
37
|
+
return document.getElementById(GR_PORTAL_ID);
|
|
38
|
+
}
|
|
39
|
+
/** Тестовая/служебная очистка: убирает корень из документа. */
|
|
40
|
+
function resetPortalRoot() {
|
|
41
|
+
getPortalRoot()?.remove();
|
|
42
|
+
}
|
|
34
43
|
//#endregion
|
|
35
|
-
export { ensurePortalRoot as t };
|
|
44
|
+
export { resetPortalRoot as n, ensurePortalRoot as t };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portalRoot-
|
|
1
|
+
{"version":3,"file":"portalRoot-CVhCgdG6.js","names":[],"sources":["../../src/composables/internal/portalRoot.ts"],"sourcesContent":["/**\n * Единая точка монтирования оверлеев.\n *\n * До неё каждый оверлей телепортировался в `body` сам по себе, и правило\n * `inert` держалось на договорённости «все оверлеи лежат ровно на один уровень\n * ниже `body`». Один контейнер даёт управляемую точку монтирования (своё\n * приложение в контейнере, микрофронтенд, shadow DOM), одну точку очистки и\n * порядок, совпадающий с порядком открытия.\n *\n * **У корня не должно быть ни стилей, ни классов.** `transform`, `filter`,\n * `contain`, `perspective` и `will-change` создают containing block для\n * `position: fixed`, и тогда панели `useFloating` начинают позиционироваться\n * относительно портала, а не вьюпорта — с виду это «панель прилипла не туда»,\n * и ищется такое долго.\n */\n\nexport const GR_PORTAL_ID = 'gr-portal'\n\n/**\n * Создаёт корень портала при первом обращении и возвращает его.\n *\n * `null` на сервере: DOM там трогать нечем, а телепорт всё равно выключен до\n * монтирования (см. `useTeleportEnabled`).\n */\nexport function ensurePortalRoot(): HTMLElement | null {\n if (typeof document === 'undefined') return null\n\n const existing = document.getElementById(GR_PORTAL_ID)\n if (existing) return existing\n\n const root = document.createElement('div')\n root.id = GR_PORTAL_ID\n root.setAttribute('data-gr-portal', '')\n document.body.appendChild(root)\n\n return root\n}\n\n/** Текущий корень портала, если он уже создан. */\nexport function getPortalRoot(): HTMLElement | null {\n if (typeof document === 'undefined') return null\n return document.getElementById(GR_PORTAL_ID)\n}\n\n/** Тестовая/служебная очистка: убирает корень из документа. */\nexport function resetPortalRoot(): void {\n getPortalRoot()?.remove()\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,IAAa,eAAe;;;;;;;AAQ5B,SAAgB,mBAAuC;CACrD,IAAI,OAAO,aAAa,aAAa,OAAO;CAE5C,MAAM,WAAW,SAAS,eAAe,YAAY;CACrD,IAAI,UAAU,OAAO;CAErB,MAAM,OAAO,SAAS,cAAc,KAAK;CACzC,KAAK,KAAK;CACV,KAAK,aAAa,kBAAkB,EAAE;CACtC,SAAS,KAAK,YAAY,IAAI;CAE9B,OAAO;AACT;;AAGA,SAAgB,gBAAoC;CAClD,IAAI,OAAO,aAAa,aAAa,OAAO;CAC5C,OAAO,SAAS,eAAe,YAAY;AAC7C;;AAGA,SAAgB,kBAAwB;CACtC,cAAc,CAAC,EAAE,OAAO;AAC1B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { c as useGrThemeAttrs } from "./context-BSYR7RZs.js";
|
|
2
|
-
import { t as usePortalTarget } from "./usePortalTarget-
|
|
2
|
+
import { t as usePortalTarget } from "./usePortalTarget-Cn-Wiz5d.js";
|
|
3
3
|
import { n as markInert, t as inertableOutside } from "./inert-DIHCCn_1.js";
|
|
4
4
|
import { useOverlayLayer } from "../composables/useOverlayLayer.js";
|
|
5
5
|
import { useFocusTrap } from "../composables/useFocusTrap.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModalOverlay-BTq-0ImG.js","names":[],"sources":["../../src/composables/internal/useInertOthers.ts","../../src/composables/internal/useOverlayPresence.ts","../../src/composables/internal/useScrollLock.ts","../../src/composables/internal/useModalOverlay.ts"],"sourcesContent":["import type { Ref } from 'vue'\nimport { onScopeDispose, watch } from 'vue'\n\nimport { inertableOutside, markInert } from './inert'\n\n/**\n * Пока слой активен, всё вне его ветки помечено `inert`: от корня оверлея вверх\n * до `<body>`, на каждом уровне — соседи.\n *\n * Это вторая половина модальности: `z-index` перекрывает страницу глазами,\n * `inert` — клавиатурой и скринридером.\n */\nexport function useInertOthers(root: Ref<HTMLElement | null>, active: () => boolean): void {\n let release: (() => void) | undefined\n\n function apply(): void {\n release?.()\n release = markInert(inertableOutside(root.value))\n }\n\n function clear(): void {\n release?.()\n release = undefined\n }\n\n watch(\n () => Boolean(active()) && Boolean(root.value),\n (isActive) => {\n if (isActive) apply()\n else clear()\n },\n { immediate: true, flush: 'post' },\n )\n\n onScopeDispose(clear)\n}\n","import type { Ref } from 'vue'\nimport { ref, watch } from 'vue'\n\nexport interface OverlayPresence {\n /** Смонтировано ли поддерево слоя: держится до конца leave-анимации. */\n mounted: Ref<boolean>\n /** Показан ли слой: этим переключаются `<Transition>` внутри. */\n visible: Ref<boolean>\n /** Вызывается из `@after-leave` панели. */\n onPanelAfterLeave: () => void\n}\n\n/**\n * Присутствие оверлея в DOM отдельно от его видимости.\n *\n * Штатный `<Transition>` анимирует свой элемент, но не координирует соседей:\n * убери обёртку по `v-if` — и подложка с панелью исчезнут мгновенно, без\n * leave-анимации. Поэтому присутствие поддерева и видимость слоя — два разных\n * флага: первый снимается только по концу leave-анимации панели.\n *\n * Видимость включается **в том же такте**, что и монтирование: содержимое окна\n * обязано появляться в DOM сразу после открытия — на этом стоит и код\n * потребителя, и внутренние компоненты, которые ищут в панели свои элементы.\n * Enter-анимацию это не отменяет: `<Transition appear>` проигрывает её и на\n * первом рендере ребёнка.\n */\nexport function useOverlayPresence(open: Ref<boolean>): OverlayPresence {\n const mounted = ref(open.value)\n const visible = ref(open.value)\n\n watch(open, (isOpen) => {\n if (isOpen) mounted.value = true\n visible.value = isOpen\n })\n\n function onPanelAfterLeave(): void {\n // Пока панель уезжала, слой могли открыть заново — тогда размонтировать\n // нечего и незачем.\n if (!open.value) mounted.value = false\n }\n\n return { mounted, visible, onPanelAfterLeave }\n}\n","/**\n * useScrollLock — общий **reference-counted** lock скролла `<body>` для оверлеев\n * (GrModal, GrDrawer, GrImageViewer).\n *\n * Зачем счётчик: состояние `<body>` принадлежит не оверлею, а их совокупности.\n * Держи каждый свой `savedBodyOverflow`, и закрытие A при ещё открытой B вернуло\n * бы странице прокрутку под открытым окном — закрывают не всегда в порядке\n * открытия. Поэтому состояние сохраняется один раз (переход счётчика 0→1) и\n * восстанавливается только когда закрыт последний оверлей (1→0).\n *\n * Плюс компенсация ширины скроллбара: при `overflow: hidden` скроллбар исчезает и\n * контент дёргается вправо — добавляем `padding-right` на его ширину.\n *\n * Отдельная ветка — iOS Safari: там `overflow: hidden` фон не держит, страница\n * продолжает «резинить» под открытым окном. Лечится тем же, чем лечил\n * HeadlessUI (`handleIOSLocking`): гасим `touchmove` вне скроллящихся областей\n * оверлея и возвращаем позицию прокрутки после снятия лока.\n */\n\ninterface SavedBodyStyle {\n overflow: string\n paddingRight: string\n overscrollBehavior: string\n}\n\nlet lockCount = 0\nlet saved: SavedBodyStyle | null = null\nlet savedScrollY = 0\nlet releaseTouchGuard: (() => void) | null = null\n\n/**\n * iOS определяем по платформе, а не по ширине экрана: лечение специфично для\n * движка, а не для размера. `maxTouchPoints` отличает iPadOS, который со времён\n * 13-й версии представляется десктопным Mac.\n */\nfunction isIOS(): boolean {\n if (typeof navigator === 'undefined') return false\n return /iP(?:hone|ad|od)/.test(navigator.platform)\n || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n}\n\n/** Прокручиваемая область оверлея — единственное, чему `touchmove` разрешён. */\nfunction isScrollableOverlayArea(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false\n\n for (let node: Element | null = target; node; node = node.parentElement) {\n if (!(node instanceof HTMLElement)) continue\n if (node.hasAttribute('data-gr-overlay-root')) return true\n }\n\n return false\n}\n\nfunction applyTouchGuard(): void {\n if (!isIOS()) return\n\n const onTouchMove = (event: TouchEvent): void => {\n // Внутри оверлея скролл законен (длинное окно, лента изображений), а всё\n // остальное — это и есть фон, который лок обязан держать.\n if (isScrollableOverlayArea(event.target)) return\n if (event.cancelable) event.preventDefault()\n }\n\n document.addEventListener('touchmove', onTouchMove, { passive: false })\n releaseTouchGuard = () => document.removeEventListener('touchmove', onTouchMove)\n}\n\nfunction getScrollbarWidth(): number {\n return window.innerWidth - document.documentElement.clientWidth\n}\n\nfunction applyLock(): void {\n const body = document.body\n saved = {\n overflow: body.style.overflow,\n paddingRight: body.style.paddingRight,\n overscrollBehavior: body.style.overscrollBehavior,\n }\n savedScrollY = window.scrollY\n\n // Ширину скроллбара считаем ДО `overflow: hidden` (после — `clientWidth` меняется).\n const scrollbarWidth = getScrollbarWidth()\n\n body.style.overflow = 'hidden'\n // Прокрутка, «доехавшая» до края внутри окна, не должна продолжаться фоном.\n body.style.overscrollBehavior = 'contain'\n if (scrollbarWidth > 0) {\n const currentPadding = Number.parseFloat(getComputedStyle(body).paddingRight) || 0\n body.style.paddingRight = `${currentPadding + scrollbarWidth}px`\n }\n\n applyTouchGuard()\n}\n\nfunction releaseLock(): void {\n releaseTouchGuard?.()\n releaseTouchGuard = null\n\n if (!saved) return\n document.body.style.overflow = saved.overflow\n document.body.style.paddingRight = saved.paddingRight\n document.body.style.overscrollBehavior = saved.overscrollBehavior\n saved = null\n\n // iOS сдвигает страницу, пока фон заблокирован; возвращаем её на место.\n if (isIOS() && window.scrollY !== savedScrollY) window.scrollTo(0, savedScrollY)\n}\n\n/**\n * Возвращает пару `lock`/`unlock`, идемпотентную **в пределах одного инстанса**\n * (повторный `lock()` без `unlock()` не увеличивает глобальный счётчик дважды).\n * Глобальный счётчик разделяется всеми оверлеями.\n */\nexport function useScrollLock() {\n const isClient = typeof window !== 'undefined'\n let held = false\n\n function lock(): void {\n if (!isClient || held) return\n held = true\n lockCount += 1\n if (lockCount === 1) applyLock()\n }\n\n function unlock(): void {\n if (!isClient || !held) return\n held = false\n lockCount = Math.max(0, lockCount - 1)\n if (lockCount === 0) releaseLock()\n }\n\n return { lock, unlock }\n}\n\n/** Тестовая/служебная очистка глобального состояния. */\nexport function resetScrollLock(): void {\n lockCount = 0\n if (typeof document !== 'undefined') releaseLock()\n saved = null\n}\n","import type { ComputedRef, Ref } from 'vue'\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\n\nimport { useGrThemeAttrs } from '../../components/GrConfigProvider/context'\nimport { useFocusTrap } from '../useFocusTrap'\nimport { useOverlayLayer } from '../useOverlayLayer'\nimport { usePortalTarget } from '../usePortalTarget'\nimport { useInertOthers } from './useInertOthers'\nimport { useOverlayPresence } from './useOverlayPresence'\nimport { useScrollLock } from './useScrollLock'\n\n/**\n * Модальный слой целиком: одна сборка на весь пакет.\n *\n * Модальность собиралась вручную в трёх компонентах (`GrModal`, `GrDrawer`,\n * `GrImageViewer`) из шести примитивов, и сборка повторялась дословно. Дело не\n * в объёме: в этой проводке сидят инварианты, каждый из которых при пропуске\n * даёт тихий баг доступности, а не заметную поломку. Здесь они собраны в одном\n * месте — забыть часть модального слоя больше нельзя.\n *\n * Что именно неочевидно:\n *\n * - **`restoreFocus: false` у ловушки.** Возврат фокуса принадлежит стеку\n * слоёв: у него правило строже — вернуть, только если на момент закрытия\n * фокус ещё был внутри слоя. Две системы возврата подрались бы за фокус.\n * - **`containers: layer.rootsAbove`.** Панель селекта, открытого ВНУТРИ окна,\n * телепортирована в `body` и лежит вне поддерева панели. Без этого списка\n * ловушка считала бы её «снаружи» и отбирала фокус.\n * - **Ловушка и `inert` работают, только пока слой верхний.** Иначе нижнее\n * окно ворует фокус у открытого поверх него, а `inert` гасит собственную\n * панель вместе со страницей.\n * - **Клик по подложке считается только тот, что на ней и начался.** Иначе\n * выделение текста мышью или перетаскивание, отпущенное за пределами панели,\n * закрывает слой.\n *\n * Чего композабл НЕ делает: не рисует разметку. Корневой `div`, подложка и\n * панель у трёх компонентов различаются по существу (обёртки скролла у окна,\n * сквозные клики у немодальной панели, слои хрома у просмотрщика), а классами\n * общий модуль владеть не вправе — пресет гранулярности подмешивает safelist\n * только по директориям выбранных компонентов.\n */\nexport interface UseModalOverlayOptions {\n /**\n * Модальный ли слой: блокирует страницу, держит фокус, гасит нижние окна.\n * Геттером — там, где модальность включается пропом (`GrDrawer`).\n */\n modal?: boolean | (() => boolean)\n /** Закрывать ли по Esc. Геттер — проп компонента реактивен. */\n closeOnEscape?: () => boolean\n /** Закрывать ли по клику в подложку; читается обработчиками `backdrop`. */\n closeOnBackdrop?: () => boolean\n /** Панель слоя: контейнер ловушки фокуса и её запасной приёмник. */\n panel: Ref<HTMLElement | null>\n /**\n * Свой корень слоя. У якорного оверлея (`GrPopover`) корень и панель — один\n * элемент: в портал уезжает сама панель, отдельной обёртки нет. Не задан —\n * композабл заводит корень сам, как у центрированных окон.\n */\n root?: Ref<HTMLElement | null>\n /**\n * Точечное переопределение точки монтирования (проп `teleportTo`). По\n * умолчанию — общий портал оверлеев.\n */\n teleportTo?: () => string | HTMLElement | undefined\n /**\n * Кому отдать фокус при открытии. Не задан — первому фокусируемому внутри\n * панели (правило `useFocusTrap`): просмотрщику нужна именно кнопка тулбара,\n * а окну — сама панель, и оно передаёт её явно.\n */\n initialFocus?: () => HTMLElement | null | undefined\n /**\n * Блокировать ли скролл страницы. По умолчанию — пока слой открыт и модален:\n * немодальная панель существует ровно ради работы со страницей под ней.\n */\n lockScroll?: () => boolean\n}\n\nexport interface ModalOverlay {\n /** Корень слоя: цель `ref` в шаблоне, хозяин `inert` и корень для стека слоёв. */\n rootEl: Ref<HTMLElement | null>\n /** Смонтировано ли поддерево: держится до конца leave-анимации панели. */\n isMounted: Ref<boolean>\n /** Показан ли слой: этим переключаются `<Transition>` внутри. */\n isVisible: Ref<boolean>\n /** Верхний ли это слой сейчас. */\n isTopmost: Ref<boolean>\n /** Значение атрибута `inert` для корня: слой перестал быть верхним. */\n inertAttr: ComputedRef<true | undefined>\n portalTarget: ComputedRef<string | HTMLElement>\n teleportEnabled: ComputedRef<boolean>\n /** `data-theme` на телепортированный корень: в DOM он вне обёртки провайдера. */\n themeAttrs: ComputedRef<{ 'data-theme'?: string }>\n /** Для `@after-leave` панели. Компонент оборачивает, если ему нужен эмит `closed`. */\n onPanelAfterLeave: () => void\n /**\n * Обработчики подложки вместе с guard'ом «клик начался на ней». Имена — под\n * `v-on=\"backdrop\"`: объектный синтаксис ждёт имена событий, а не пропов.\n */\n backdrop: {\n mousedown: (event: MouseEvent) => void\n click: (event: MouseEvent) => void\n }\n}\n\nexport function useModalOverlay(\n open: Ref<boolean>,\n onDismiss: () => void,\n options: UseModalOverlayOptions,\n): ModalOverlay {\n const isModal = (): boolean =>\n typeof options.modal === 'function' ? options.modal() : options.modal ?? true\n\n const rootEl = options.root ?? ref<HTMLElement | null>(null)\n const isTopmost = ref(true)\n\n const inertAttr = computed(() => (open.value && isModal() && !isTopmost.value ? true : undefined))\n\n // Телепорт включается только ПОСЛЕ монтирования: иначе первый клиентский\n // рендер не совпадёт с серверным и сломается гидрация.\n const { target: portalTarget, enabled: teleportEnabled } = usePortalTarget(options.teleportTo)\n\n // Панель уезжает в `body`, то есть вне обёртки провайдера, и `data-theme` с\n // неё не наследуется. В дереве компонентов слой остаётся внутри — `inject`\n // доходит, и тему он ставит себе сам.\n const themeAttrs = useGrThemeAttrs()\n\n const { mounted: isMounted, visible: isVisible, onPanelAfterLeave } = useOverlayPresence(open)\n\n const layer = useOverlayLayer(open, onDismiss, {\n modal: isModal,\n closeOnEscape: options.closeOnEscape,\n onTopmostChange: (value) => { isTopmost.value = value },\n root: rootEl,\n })\n\n useFocusTrap(options.panel, {\n active: () => open.value && isModal() && isTopmost.value,\n initialFocus: options.initialFocus,\n fallbackFocus: () => options.panel.value,\n containers: layer.rootsAbove,\n restoreFocus: false,\n })\n\n useInertOthers(rootEl, () => open.value && isModal() && isTopmost.value)\n\n // Общий reference-counted lock: несколько открытых оверлеев снимают блокировку\n // независимо от порядка закрытия, ширина скроллбара компенсируется.\n const { lock, unlock } = useScrollLock()\n\n watch(\n () => options.lockScroll?.() ?? (open.value && isModal()),\n (locked) => {\n if (locked) lock()\n else unlock()\n },\n { immediate: true },\n )\n\n onBeforeUnmount(unlock)\n\n let pointerDownOnBackdrop = false\n\n return {\n rootEl,\n isMounted,\n isVisible,\n isTopmost,\n inertAttr,\n portalTarget,\n teleportEnabled,\n themeAttrs,\n onPanelAfterLeave,\n backdrop: {\n mousedown(event: MouseEvent): void {\n pointerDownOnBackdrop = event.target === event.currentTarget\n },\n click(event: MouseEvent): void {\n const startedHere = pointerDownOnBackdrop\n pointerDownOnBackdrop = false\n\n if (!startedHere || event.target !== event.currentTarget) return\n if (options.closeOnBackdrop?.() === false) return\n\n onDismiss()\n },\n },\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useModalOverlay-DrQVYwwA.js","names":[],"sources":["../../src/composables/internal/useInertOthers.ts","../../src/composables/internal/useOverlayPresence.ts","../../src/composables/internal/useScrollLock.ts","../../src/composables/internal/useModalOverlay.ts"],"sourcesContent":["import type { Ref } from 'vue'\nimport { onScopeDispose, watch } from 'vue'\n\nimport { inertableOutside, markInert } from './inert'\n\n/**\n * Пока слой активен, всё вне его ветки помечено `inert`: от корня оверлея вверх\n * до `<body>`, на каждом уровне — соседи.\n *\n * Это вторая половина модальности: `z-index` перекрывает страницу глазами,\n * `inert` — клавиатурой и скринридером.\n */\nexport function useInertOthers(root: Ref<HTMLElement | null>, active: () => boolean): void {\n let release: (() => void) | undefined\n\n function apply(): void {\n release?.()\n release = markInert(inertableOutside(root.value))\n }\n\n function clear(): void {\n release?.()\n release = undefined\n }\n\n watch(\n () => Boolean(active()) && Boolean(root.value),\n (isActive) => {\n if (isActive) apply()\n else clear()\n },\n { immediate: true, flush: 'post' },\n )\n\n onScopeDispose(clear)\n}\n","import type { Ref } from 'vue'\nimport { ref, watch } from 'vue'\n\nexport interface OverlayPresence {\n /** Смонтировано ли поддерево слоя: держится до конца leave-анимации. */\n mounted: Ref<boolean>\n /** Показан ли слой: этим переключаются `<Transition>` внутри. */\n visible: Ref<boolean>\n /** Вызывается из `@after-leave` панели. */\n onPanelAfterLeave: () => void\n}\n\n/**\n * Присутствие оверлея в DOM отдельно от его видимости.\n *\n * Штатный `<Transition>` анимирует свой элемент, но не координирует соседей:\n * убери обёртку по `v-if` — и подложка с панелью исчезнут мгновенно, без\n * leave-анимации. Поэтому присутствие поддерева и видимость слоя — два разных\n * флага: первый снимается только по концу leave-анимации панели.\n *\n * Видимость включается **в том же такте**, что и монтирование: содержимое окна\n * обязано появляться в DOM сразу после открытия — на этом стоит и код\n * потребителя, и внутренние компоненты, которые ищут в панели свои элементы.\n * Enter-анимацию это не отменяет: `<Transition appear>` проигрывает её и на\n * первом рендере ребёнка.\n */\nexport function useOverlayPresence(open: Ref<boolean>): OverlayPresence {\n const mounted = ref(open.value)\n const visible = ref(open.value)\n\n watch(open, (isOpen) => {\n if (isOpen) mounted.value = true\n visible.value = isOpen\n })\n\n function onPanelAfterLeave(): void {\n // Пока панель уезжала, слой могли открыть заново — тогда размонтировать\n // нечего и незачем.\n if (!open.value) mounted.value = false\n }\n\n return { mounted, visible, onPanelAfterLeave }\n}\n","/**\n * useScrollLock — общий **reference-counted** lock скролла `<body>` для оверлеев\n * (GrModal, GrDrawer, GrImageViewer).\n *\n * Зачем счётчик: состояние `<body>` принадлежит не оверлею, а их совокупности.\n * Держи каждый свой `savedBodyOverflow`, и закрытие A при ещё открытой B вернуло\n * бы странице прокрутку под открытым окном — закрывают не всегда в порядке\n * открытия. Поэтому состояние сохраняется один раз (переход счётчика 0→1) и\n * восстанавливается только когда закрыт последний оверлей (1→0).\n *\n * Плюс компенсация ширины скроллбара: при `overflow: hidden` скроллбар исчезает и\n * контент дёргается вправо — добавляем `padding-right` на его ширину.\n *\n * Отдельная ветка — iOS Safari: там `overflow: hidden` фон не держит, страница\n * продолжает «резинить» под открытым окном. Лечится тем же, чем лечил\n * HeadlessUI (`handleIOSLocking`): гасим `touchmove` вне скроллящихся областей\n * оверлея и возвращаем позицию прокрутки после снятия лока.\n */\n\ninterface SavedBodyStyle {\n overflow: string\n paddingRight: string\n overscrollBehavior: string\n}\n\nlet lockCount = 0\nlet saved: SavedBodyStyle | null = null\nlet savedScrollY = 0\nlet releaseTouchGuard: (() => void) | null = null\n\n/**\n * iOS определяем по платформе, а не по ширине экрана: лечение специфично для\n * движка, а не для размера. `maxTouchPoints` отличает iPadOS, который со времён\n * 13-й версии представляется десктопным Mac.\n */\nfunction isIOS(): boolean {\n if (typeof navigator === 'undefined') return false\n return /iP(?:hone|ad|od)/.test(navigator.platform)\n || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n}\n\n/** Прокручиваемая область оверлея — единственное, чему `touchmove` разрешён. */\nfunction isScrollableOverlayArea(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false\n\n for (let node: Element | null = target; node; node = node.parentElement) {\n if (!(node instanceof HTMLElement)) continue\n if (node.hasAttribute('data-gr-overlay-root')) return true\n }\n\n return false\n}\n\nfunction applyTouchGuard(): void {\n if (!isIOS()) return\n\n const onTouchMove = (event: TouchEvent): void => {\n // Внутри оверлея скролл законен (длинное окно, лента изображений), а всё\n // остальное — это и есть фон, который лок обязан держать.\n if (isScrollableOverlayArea(event.target)) return\n if (event.cancelable) event.preventDefault()\n }\n\n document.addEventListener('touchmove', onTouchMove, { passive: false })\n releaseTouchGuard = () => document.removeEventListener('touchmove', onTouchMove)\n}\n\nfunction getScrollbarWidth(): number {\n return window.innerWidth - document.documentElement.clientWidth\n}\n\nfunction applyLock(): void {\n const body = document.body\n saved = {\n overflow: body.style.overflow,\n paddingRight: body.style.paddingRight,\n overscrollBehavior: body.style.overscrollBehavior,\n }\n savedScrollY = window.scrollY\n\n // Ширину скроллбара считаем ДО `overflow: hidden` (после — `clientWidth` меняется).\n const scrollbarWidth = getScrollbarWidth()\n\n body.style.overflow = 'hidden'\n // Прокрутка, «доехавшая» до края внутри окна, не должна продолжаться фоном.\n body.style.overscrollBehavior = 'contain'\n if (scrollbarWidth > 0) {\n const currentPadding = Number.parseFloat(getComputedStyle(body).paddingRight) || 0\n body.style.paddingRight = `${currentPadding + scrollbarWidth}px`\n }\n\n applyTouchGuard()\n}\n\nfunction releaseLock(): void {\n releaseTouchGuard?.()\n releaseTouchGuard = null\n\n if (!saved) return\n document.body.style.overflow = saved.overflow\n document.body.style.paddingRight = saved.paddingRight\n document.body.style.overscrollBehavior = saved.overscrollBehavior\n saved = null\n\n // iOS сдвигает страницу, пока фон заблокирован; возвращаем её на место.\n if (isIOS() && window.scrollY !== savedScrollY) window.scrollTo(0, savedScrollY)\n}\n\n/**\n * Возвращает пару `lock`/`unlock`, идемпотентную **в пределах одного инстанса**\n * (повторный `lock()` без `unlock()` не увеличивает глобальный счётчик дважды).\n * Глобальный счётчик разделяется всеми оверлеями.\n */\nexport function useScrollLock() {\n const isClient = typeof window !== 'undefined'\n let held = false\n\n function lock(): void {\n if (!isClient || held) return\n held = true\n lockCount += 1\n if (lockCount === 1) applyLock()\n }\n\n function unlock(): void {\n if (!isClient || !held) return\n held = false\n lockCount = Math.max(0, lockCount - 1)\n if (lockCount === 0) releaseLock()\n }\n\n return { lock, unlock }\n}\n\n/** Тестовая/служебная очистка глобального состояния. */\nexport function resetScrollLock(): void {\n lockCount = 0\n if (typeof document !== 'undefined') releaseLock()\n saved = null\n}\n","import type { ComputedRef, Ref } from 'vue'\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\n\nimport { useGrThemeAttrs } from '../../components/GrConfigProvider/context'\nimport { useFocusTrap } from '../useFocusTrap'\nimport { useOverlayLayer } from '../useOverlayLayer'\nimport { usePortalTarget } from '../usePortalTarget'\nimport { useInertOthers } from './useInertOthers'\nimport { useOverlayPresence } from './useOverlayPresence'\nimport { useScrollLock } from './useScrollLock'\n\n/**\n * Модальный слой целиком: одна сборка на весь пакет.\n *\n * Модальность собиралась вручную в трёх компонентах (`GrModal`, `GrDrawer`,\n * `GrImageViewer`) из шести примитивов, и сборка повторялась дословно. Дело не\n * в объёме: в этой проводке сидят инварианты, каждый из которых при пропуске\n * даёт тихий баг доступности, а не заметную поломку. Здесь они собраны в одном\n * месте — забыть часть модального слоя больше нельзя.\n *\n * Что именно неочевидно:\n *\n * - **`restoreFocus: false` у ловушки.** Возврат фокуса принадлежит стеку\n * слоёв: у него правило строже — вернуть, только если на момент закрытия\n * фокус ещё был внутри слоя. Две системы возврата подрались бы за фокус.\n * - **`containers: layer.rootsAbove`.** Панель селекта, открытого ВНУТРИ окна,\n * телепортирована в `body` и лежит вне поддерева панели. Без этого списка\n * ловушка считала бы её «снаружи» и отбирала фокус.\n * - **Ловушка и `inert` работают, только пока слой верхний.** Иначе нижнее\n * окно ворует фокус у открытого поверх него, а `inert` гасит собственную\n * панель вместе со страницей.\n * - **Клик по подложке считается только тот, что на ней и начался.** Иначе\n * выделение текста мышью или перетаскивание, отпущенное за пределами панели,\n * закрывает слой.\n *\n * Чего композабл НЕ делает: не рисует разметку. Корневой `div`, подложка и\n * панель у трёх компонентов различаются по существу (обёртки скролла у окна,\n * сквозные клики у немодальной панели, слои хрома у просмотрщика), а классами\n * общий модуль владеть не вправе — пресет гранулярности подмешивает safelist\n * только по директориям выбранных компонентов.\n */\nexport interface UseModalOverlayOptions {\n /**\n * Модальный ли слой: блокирует страницу, держит фокус, гасит нижние окна.\n * Геттером — там, где модальность включается пропом (`GrDrawer`).\n */\n modal?: boolean | (() => boolean)\n /** Закрывать ли по Esc. Геттер — проп компонента реактивен. */\n closeOnEscape?: () => boolean\n /** Закрывать ли по клику в подложку; читается обработчиками `backdrop`. */\n closeOnBackdrop?: () => boolean\n /** Панель слоя: контейнер ловушки фокуса и её запасной приёмник. */\n panel: Ref<HTMLElement | null>\n /**\n * Свой корень слоя. У якорного оверлея (`GrPopover`) корень и панель — один\n * элемент: в портал уезжает сама панель, отдельной обёртки нет. Не задан —\n * композабл заводит корень сам, как у центрированных окон.\n */\n root?: Ref<HTMLElement | null>\n /**\n * Точечное переопределение точки монтирования (проп `teleportTo`). По\n * умолчанию — общий портал оверлеев.\n */\n teleportTo?: () => string | HTMLElement | undefined\n /**\n * Кому отдать фокус при открытии. Не задан — первому фокусируемому внутри\n * панели (правило `useFocusTrap`): просмотрщику нужна именно кнопка тулбара,\n * а окну — сама панель, и оно передаёт её явно.\n */\n initialFocus?: () => HTMLElement | null | undefined\n /**\n * Блокировать ли скролл страницы. По умолчанию — пока слой открыт и модален:\n * немодальная панель существует ровно ради работы со страницей под ней.\n */\n lockScroll?: () => boolean\n}\n\nexport interface ModalOverlay {\n /** Корень слоя: цель `ref` в шаблоне, хозяин `inert` и корень для стека слоёв. */\n rootEl: Ref<HTMLElement | null>\n /** Смонтировано ли поддерево: держится до конца leave-анимации панели. */\n isMounted: Ref<boolean>\n /** Показан ли слой: этим переключаются `<Transition>` внутри. */\n isVisible: Ref<boolean>\n /** Верхний ли это слой сейчас. */\n isTopmost: Ref<boolean>\n /** Значение атрибута `inert` для корня: слой перестал быть верхним. */\n inertAttr: ComputedRef<true | undefined>\n portalTarget: ComputedRef<string | HTMLElement>\n teleportEnabled: ComputedRef<boolean>\n /** `data-theme` на телепортированный корень: в DOM он вне обёртки провайдера. */\n themeAttrs: ComputedRef<{ 'data-theme'?: string }>\n /** Для `@after-leave` панели. Компонент оборачивает, если ему нужен эмит `closed`. */\n onPanelAfterLeave: () => void\n /**\n * Обработчики подложки вместе с guard'ом «клик начался на ней». Имена — под\n * `v-on=\"backdrop\"`: объектный синтаксис ждёт имена событий, а не пропов.\n */\n backdrop: {\n mousedown: (event: MouseEvent) => void\n click: (event: MouseEvent) => void\n }\n}\n\nexport function useModalOverlay(\n open: Ref<boolean>,\n onDismiss: () => void,\n options: UseModalOverlayOptions,\n): ModalOverlay {\n const isModal = (): boolean =>\n typeof options.modal === 'function' ? options.modal() : options.modal ?? true\n\n const rootEl = options.root ?? ref<HTMLElement | null>(null)\n const isTopmost = ref(true)\n\n const inertAttr = computed(() => (open.value && isModal() && !isTopmost.value ? true : undefined))\n\n // Телепорт включается только ПОСЛЕ монтирования: иначе первый клиентский\n // рендер не совпадёт с серверным и сломается гидрация.\n const { target: portalTarget, enabled: teleportEnabled } = usePortalTarget(options.teleportTo)\n\n // Панель уезжает в `body`, то есть вне обёртки провайдера, и `data-theme` с\n // неё не наследуется. В дереве компонентов слой остаётся внутри — `inject`\n // доходит, и тему он ставит себе сам.\n const themeAttrs = useGrThemeAttrs()\n\n const { mounted: isMounted, visible: isVisible, onPanelAfterLeave } = useOverlayPresence(open)\n\n const layer = useOverlayLayer(open, onDismiss, {\n modal: isModal,\n closeOnEscape: options.closeOnEscape,\n onTopmostChange: (value) => { isTopmost.value = value },\n root: rootEl,\n })\n\n useFocusTrap(options.panel, {\n active: () => open.value && isModal() && isTopmost.value,\n initialFocus: options.initialFocus,\n fallbackFocus: () => options.panel.value,\n containers: layer.rootsAbove,\n restoreFocus: false,\n })\n\n useInertOthers(rootEl, () => open.value && isModal() && isTopmost.value)\n\n // Общий reference-counted lock: несколько открытых оверлеев снимают блокировку\n // независимо от порядка закрытия, ширина скроллбара компенсируется.\n const { lock, unlock } = useScrollLock()\n\n watch(\n () => options.lockScroll?.() ?? (open.value && isModal()),\n (locked) => {\n if (locked) lock()\n else unlock()\n },\n { immediate: true },\n )\n\n onBeforeUnmount(unlock)\n\n let pointerDownOnBackdrop = false\n\n return {\n rootEl,\n isMounted,\n isVisible,\n isTopmost,\n inertAttr,\n portalTarget,\n teleportEnabled,\n themeAttrs,\n onPanelAfterLeave,\n backdrop: {\n mousedown(event: MouseEvent): void {\n pointerDownOnBackdrop = event.target === event.currentTarget\n },\n click(event: MouseEvent): void {\n const startedHere = pointerDownOnBackdrop\n pointerDownOnBackdrop = false\n\n if (!startedHere || event.target !== event.currentTarget) return\n if (options.closeOnBackdrop?.() === false) return\n\n onDismiss()\n },\n },\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { s as useGrConfig } from "./context-BSYR7RZs.js";
|
|
2
|
-
import { t as ensurePortalRoot } from "./portalRoot-
|
|
2
|
+
import { t as ensurePortalRoot } from "./portalRoot-CVhCgdG6.js";
|
|
3
3
|
import { computed, onMounted, readonly, ref } from "vue";
|
|
4
4
|
//#region src/composables/internal/useTeleportEnabled.ts
|
|
5
5
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePortalTarget-
|
|
1
|
+
{"version":3,"file":"usePortalTarget-Cn-Wiz5d.js","names":[],"sources":["../../src/composables/internal/useTeleportEnabled.ts","../../src/composables/usePortalTarget.ts"],"sourcesContent":["import { onMounted, readonly, ref, type Ref } from 'vue'\n\n/**\n * Можно ли телепортировать содержимое прямо сейчас.\n *\n * Возвращает `false` на сервере И на первом клиентском рендере, `true` — сразу\n * после монтирования. Использовать так:\n *\n * ```vue\n * <teleport to=\"body\" :disabled=\"!teleportEnabled\">…</teleport>\n * ```\n *\n * ## Зачем, если есть `typeof window !== 'undefined'`\n *\n * Проверка окружения выглядит достаточной, но именно она и ломала гидрацию.\n * `isClient` вычисляется в `setup`, поэтому получалось так:\n *\n * - сервер: `window` нет → телепорт выключен → содержимое остаётся НА МЕСТЕ\n * (`:disabled` означает «рендерить на месте», а не «не рендерить»);\n * - клиент, первый рендер: `window` есть → телепорт включён → содержимое сразу\n * уезжает в `body`.\n *\n * Структуры не совпадают, Vue сообщает `Hydration node mismatch`. В лучшем\n * случае это лишний варнинг и осиротевшая копия панели в DOM; в худшем —\n * панель «прилипает» к контейнеру приложения и пишет в него свои стили\n * (`position: fixed` + `display: none` у закрытой панели), после чего страница\n * исчезает целиком.\n *\n * Флаг, поднимаемый в `onMounted`, снимает проблему по построению: **первый**\n * клиентский рендер повторяет серверный, а телепорт включается уже после\n * гидрации. Для компонентов без SSR это ничего не меняет: панели закрыты\n * (`v-show`/`v-if`), а `onMounted` срабатывает в том же тике.\n *\n * Стенд, на котором это воспроизводится и проверяется, — `apps/playground-ssr`.\n */\nexport function useTeleportEnabled(): Readonly<Ref<boolean>> {\n const enabled = ref(false)\n\n onMounted(() => {\n enabled.value = true\n })\n\n return readonly(enabled)\n}\n","import type { ComputedRef } from 'vue'\nimport { computed } from 'vue'\n\nimport { useGrConfig } from '../components/GrConfigProvider/context'\nimport { ensurePortalRoot } from './internal/portalRoot'\nimport { useTeleportEnabled } from './internal/useTeleportEnabled'\n\nexport interface PortalTarget {\n /** Куда телепортировать: элемент портала либо селектор из конфига. */\n target: ComputedRef<string | HTMLElement>\n /**\n * Можно ли телепортировать прямо сейчас. `false` на сервере и на первом\n * клиентском рендере — иначе разметка разъедется на гидрации.\n */\n enabled: ComputedRef<boolean>\n}\n\n/**\n * Куда монтируются оверлеи пакета.\n *\n * Приоритет: локальное переопределение компонента (`teleportTo`) →\n * `portalTarget` из `GrConfigProvider` → общий корень `#gr-portal`, который\n * создаётся при первом обращении.\n *\n * ```vue\n * const { target, enabled } = usePortalTarget(() => props.teleportTo)\n *\n * <teleport :to=\"target\" :disabled=\"!enabled\">…</teleport>\n * ```\n *\n * Композабл публичный: свой оверлей потребителя должен уезжать туда же, куда и\n * оверлеи библиотеки, — иначе он окажется вне ветки портала и будет помечен\n * `inert` вместе со страницей, как только откроется модалка.\n */\nexport function usePortalTarget(local?: () => string | HTMLElement | undefined): PortalTarget {\n const config = useGrConfig()\n const teleportEnabled = useTeleportEnabled()\n\n const target = computed<string | HTMLElement>(() => {\n const explicit = local?.() ?? config.portalTarget?.value\n if (explicit) return explicit\n\n // Корень создаётся лениво и только на клиенте; до монтирования телепорт\n // выключен, поэтому `body` здесь — недостижимый запасной вариант, а не\n // рабочая ветка.\n return ensurePortalRoot() ?? 'body'\n })\n\n return { target, enabled: computed(() => teleportEnabled.value) }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,qBAA6C;CAC3D,MAAM,UAAU,IAAI,KAAK;CAEzB,gBAAgB;EACd,QAAQ,QAAQ;CAClB,CAAC;CAED,OAAO,SAAS,OAAO;AACzB;;;;;;;;;;;;;;;;;;;;ACTA,SAAgB,gBAAgB,OAA8D;CAC5F,MAAM,SAAS,YAAY;CAC3B,MAAM,kBAAkB,mBAAmB;CAY3C,OAAO;EAAE,QAVM,eAAqC;GAClD,MAAM,WAAW,QAAQ,KAAK,OAAO,cAAc;GACnD,IAAI,UAAU,OAAO;GAKrB,OAAO,iBAAiB,KAAK;EAC/B,CAES;EAAQ,SAAS,eAAe,gBAAgB,KAAK;CAAE;AAClE"}
|