@synopackageland/ui 0.20.2 → 0.20.4
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/CHANGELOG.md +26 -0
- package/LICENSES/ux-foundation.md +83 -0
- package/LICENSES/ux-grid-baserow.md +35 -0
- package/LICENSES/ux-grid-teable.md +48 -0
- package/README.md +3 -0
- package/dist/cli.js +0 -0
- package/dist/components/app/app-layout/AppLayout.vue.d.ts +31 -4
- package/dist/components/app/app-root/AppRoot.vue.d.ts +9 -0
- package/dist/components/app/aside-panel/AsidePanel.vue.d.ts +69 -0
- package/dist/components/app/aside-panel/asidePreference.d.ts +28 -0
- package/dist/components/composite/adaptive-panel/AdaptivePanel.vue.d.ts +61 -0
- package/dist/components/composite/connection-topology/ConnectionTopology.vue.d.ts +1 -1
- package/dist/components/composite/data-grid/DataGrid.vue.d.ts +3 -2
- package/dist/components/composite/data-grid/viewState.d.ts +2 -2
- package/dist/components/composite/file-picker/FilePicker.vue.d.ts +1 -1
- package/dist/components/composite/mention-list/MentionList.vue.d.ts +2 -2
- package/dist/components/composite/overflow-toolbar/OverflowToolbar.vue.d.ts +2 -2
- package/dist/components/composite/record-panel/RecordPanel.vue.d.ts +77 -0
- package/dist/components/composite/record-panel/recordPanelWidth.d.ts +54 -0
- package/dist/components/composite/summary-card/SummaryCard.vue.d.ts +1 -1
- package/dist/components/composite/tag-editor/TagEditor.vue.d.ts +2 -2
- package/dist/components/composite/tree-view/TreeView.vue.d.ts +1 -1
- package/dist/components/composite/wizard/Wizard.vue.d.ts +2 -2
- package/dist/components/composite/wizard/WizardDialog.vue.d.ts +2 -2
- package/dist/components/containers/card/Card.vue.d.ts +1 -1
- package/dist/components/containers/card/CardField.vue.d.ts +26 -0
- package/dist/components/containers/card-grid/CardCover.vue.d.ts +16 -0
- package/dist/components/containers/card-grid/CardGrid.vue.d.ts +1 -1
- package/dist/components/containers/card-grid/VirtualCardGrid.vue.d.ts +71 -0
- package/dist/components/containers/expandable-item/ExpandableItem.vue.d.ts +1 -1
- package/dist/components/containers/fieldset/Fieldset.vue.d.ts +1 -1
- package/dist/components/containers/list-detail/ListDetail.vue.d.ts +1 -1
- package/dist/components/containers/split-pane/SplitPane.vue.d.ts +1 -1
- package/dist/components/feedback/notification/Notification.vue.d.ts +1 -1
- package/dist/components/feedback/notification/NotificationProvider.vue.d.ts +1 -1
- package/dist/components/primitives/breadcrumb/Breadcrumb.vue.d.ts +2 -2
- package/dist/components/primitives/context-menu/ContextMenu.vue.d.ts +3 -0
- package/dist/components/primitives/context-menu/ContextMenuItems.vue.d.ts +4 -5
- package/dist/components/primitives/dialog/Dialog.vue.d.ts +2 -2
- package/dist/components/primitives/dropdown-menu/DropdownMenu.vue.d.ts +4 -0
- package/dist/components/primitives/dropdown-menu/DropdownMenuItems.vue.d.ts +6 -3
- package/dist/components/primitives/popover/Popover.vue.d.ts +10 -2
- package/dist/components/primitives/popover/floating.d.ts +27 -0
- package/dist/components/primitives/popover/overlay.d.ts +36 -0
- package/dist/components/primitives/segment-control/SegmentControl.vue.d.ts +4 -1
- package/dist/components/primitives/segment-control/context.d.ts +3 -0
- package/dist/components/primitives/select/Select.vue.d.ts +4 -0
- package/dist/components/primitives/select/internal/ComboboxField.vue.d.ts +1 -0
- package/dist/components/primitives/select/internal/types.d.ts +2 -0
- package/dist/components/primitives/skeleton/SectionSkeleton.vue.d.ts +25 -4
- package/dist/components/primitives/skeleton/Skeleton.vue.d.ts +3 -0
- package/dist/components/primitives/tag/Tag.vue.d.ts +2 -2
- package/dist/components/primitives/toast/ToastProvider.vue.d.ts +0 -2
- package/dist/components/primitives/toast/toast.d.ts +21 -1
- package/dist/components/primitives/tooltip/Tooltip.vue.d.ts +8 -3
- package/dist/components/primitives/tooltip/tooltipStyle.d.ts +11 -1
- package/dist/composables/backDismiss.d.ts +19 -0
- package/dist/composables/phone.d.ts +8 -0
- package/dist/composables/softKeyboard.d.ts +26 -4
- package/dist/composables/visualViewport.d.ts +31 -0
- package/dist/dnd/autoScroll.d.ts +57 -0
- package/dist/dnd/dragKit.d.ts +111 -0
- package/dist/dnd/index.d.ts +4 -0
- package/dist/dnd/layout.d.ts +57 -0
- package/dist/dnd/vue.d.ts +16 -0
- package/dist/feedback/StatusSlot.vue.d.ts +24 -0
- package/dist/feedback/showAfter.d.ts +15 -0
- package/dist/feedback/stackMotion.d.ts +13 -0
- package/dist/feedback/timing.d.ts +23 -0
- package/dist/grid/cells/draw.d.ts +57 -0
- package/dist/grid/cells/images.d.ts +5 -0
- package/dist/grid/cells/index.d.ts +7 -0
- package/dist/grid/cells/number.d.ts +5 -0
- package/dist/grid/cells/registry.d.ts +56 -0
- package/dist/grid/cells/renderers.d.ts +8 -0
- package/dist/grid/cells/status.d.ts +6 -0
- package/dist/grid/cells/types.d.ts +200 -0
- package/dist/grid/cells/use.d.ts +7 -0
- package/dist/grid/clipboard/copy.d.ts +17 -0
- package/dist/grid/clipboard/index.d.ts +4 -0
- package/dist/grid/clipboard/proposal.d.ts +35 -0
- package/dist/grid/clipboard/tsv.d.ts +14 -0
- package/dist/grid/clipboard/write.d.ts +21 -0
- package/dist/grid/contracts.d.ts +200 -0
- package/dist/grid/edit/cell-status.d.ts +33 -0
- package/dist/grid/edit/edit-session.d.ts +97 -0
- package/dist/grid/edit/use-grid-edit.d.ts +48 -0
- package/dist/grid/focus/editor-style.d.ts +67 -0
- package/dist/grid/host/GridHost.vue.d.ts +137 -0
- package/dist/grid/host/controller.d.ts +219 -0
- package/dist/grid/host/dom.d.ts +10 -0
- package/dist/grid/index.d.ts +8 -0
- package/dist/grid/range/block.d.ts +30 -0
- package/dist/grid/range/fill.d.ts +27 -0
- package/dist/grid/range/index.d.ts +2 -0
- package/dist/grid/theme.d.ts +61 -0
- package/dist/grid-core/auto-scroll.d.ts +67 -0
- package/dist/grid-core/column-resize.d.ts +43 -0
- package/dist/grid-core/config.d.ts +39 -0
- package/dist/grid-core/coordinate.d.ts +64 -0
- package/dist/grid-core/drag.d.ts +46 -0
- package/dist/grid-core/freeze.d.ts +11 -0
- package/dist/grid-core/index.d.ts +17 -0
- package/dist/grid-core/keyboard.d.ts +34 -0
- package/dist/grid-core/keys.d.ts +38 -0
- package/dist/grid-core/lru.d.ts +10 -0
- package/dist/grid-core/range.d.ts +28 -0
- package/dist/grid-core/region.d.ts +73 -0
- package/dist/grid-core/renderer/base.d.ts +92 -0
- package/dist/grid-core/renderer/layout.d.ts +129 -0
- package/dist/grid-core/selection-controller.d.ts +62 -0
- package/dist/grid-core/selection.d.ts +35 -0
- package/dist/grid-core/theme.d.ts +81 -0
- package/dist/grid-core/types.d.ts +178 -0
- package/dist/grid.js +6173 -0
- package/dist/i18n/text.d.ts +6 -0
- package/dist/index.d.ts +32 -2
- package/dist/index.js +17662 -13637
- package/dist/interaction/editSession.d.ts +49 -0
- package/dist/interaction/focus.d.ts +28 -0
- package/dist/interaction/gesture.d.ts +49 -0
- package/dist/interaction/ime.d.ts +55 -0
- package/dist/interaction/index.d.ts +6 -0
- package/dist/interaction/outside.d.ts +40 -0
- package/dist/interaction/vue.d.ts +21 -0
- package/dist/json-ai-prompt.md +1 -1
- package/dist/json-preview/preview.js +8529 -7812
- package/dist/json.js +10 -10
- package/dist/lib/adaptiveLayout.d.ts +32 -2
- package/dist/lib/deviceViewport.d.ts +2 -1
- package/dist/lib/motion.d.ts +12 -0
- package/dist/reka-runtime.json +1 -1
- package/dist/theme.css +1 -1
- package/dist/themes/dsm7-embedded-theme.css +1 -1
- package/dist/themes/dsm7-embedded.css +1 -1
- package/dist/themes/dsm7.css +1 -1
- package/dist/virtual/cardHeight.d.ts +39 -0
- package/dist/virtual/galleryColumns.d.ts +11 -0
- package/dist/virtual/layoutMotion.d.ts +30 -0
- package/docs/adaptive-layout.md +137 -16
- package/docs/callout.md +22 -1
- package/docs/list-detail.md +54 -0
- package/docs/mobile-native.md +214 -0
- package/docs/release-checks.md +23 -0
- package/docs/theme-hooks.md +28 -7
- package/docs/ux-foundation.md +133 -0
- package/docs/ux-grid.md +217 -0
- package/package.json +94 -3
package/dist/json.js
CHANGED
|
@@ -2,7 +2,7 @@ import { z as t } from "zod";
|
|
|
2
2
|
import { z as vt } from "zod";
|
|
3
3
|
import { defineCatalog as F } from "@json-render/core";
|
|
4
4
|
import { createStateStore as $t, defineCatalog as jt } from "@json-render/core";
|
|
5
|
-
import { defineRegistry as
|
|
5
|
+
import { defineRegistry as W, useBoundProp as b, JSONUIProvider as B, Renderer as M } from "@json-render/vue";
|
|
6
6
|
import { ActionProvider as Ot, JSONUIProvider as At, Renderer as kt, StateProvider as Pt, ValidationProvider as Ct, VisibilityProvider as It, defineRegistry as Rt, useActions as Kt, useBoundProp as Lt, useStateStore as Dt } from "@json-render/vue";
|
|
7
7
|
import { schema as G } from "@json-render/vue/schema";
|
|
8
8
|
import { schema as Tt } from "@json-render/vue/schema";
|
|
@@ -369,7 +369,7 @@ const J = t.lazy(() => t.object({
|
|
|
369
369
|
"Keep state in the spec and use $bindState/$bindItem for editable controls; do not invent JavaScript in props.",
|
|
370
370
|
"Use host-declared actions for side effects. Never encode fetch, timers, filesystem operations, or business logic as UI expressions.",
|
|
371
371
|
"If a domain view needs custom rendering or behavior (for example a treemap, terminal, rich download row, NAS path picker), use a host extension component instead of forcing it into generic components.",
|
|
372
|
-
|
|
372
|
+
'AppShell adapts to its actual container width: phone (<=640px), desktop window (641px and wider), and, only with wideLayout "web", the full-page web layout from 960px (its sidebar starts as a 48px rail below 1200px). Never assume browser viewport width.',
|
|
373
373
|
"For a phone-unfriendly custom view, use ResponsiveView slots: mobile alternative and default full view. Keep essential actions accessible on mobile.",
|
|
374
374
|
"Use low-level Stack/Text only when a semantic component does not already express the layout."
|
|
375
375
|
], Le = '## Self-check workflow\n\nInstall `@synopackageland/ui` first. Without a local install, use\n`npx -y -p @synopackageland/ui syno-pkg-land-ui <command>` (pin the package version for reproducibility).\n\n1. List components with `npx --no syno-pkg-land-ui catalog`; read props with `npx --no syno-pkg-land-ui describe <Component>`.\n2. Write the spec as JSON: {"root", "elements", "state"}. Seed every state path you bind or read.\n3. Run `npx --no syno-pkg-land-ui validate ui.json --json` (add --actions, --functions, --state, --messages for host-provided names).\n Fix every error at its JSON Pointer `path` using its `hint`, then validate again until it passes.\n4. Run `npx --no syno-pkg-land-ui render ui.json --out shots` to screenshot phone, DSM window and wide widths and to\n report layout overflow; fix reported elements and repeat.\n5. Hand over the spec only when validate and render both exit 0.';
|
|
@@ -616,7 +616,7 @@ const Je = {
|
|
|
616
616
|
ListItem: ({ props: e, slots: o }) => d(oe, e, o),
|
|
617
617
|
InputGroup: ({ slots: e }) => d(te, null, e),
|
|
618
618
|
Loading: ({ props: e }) => d(ee, { text: e.text })
|
|
619
|
-
}, { registry: D } =
|
|
619
|
+
}, { registry: D } = W(A, {
|
|
620
620
|
components: Je
|
|
621
621
|
}), ut = /* @__PURE__ */ H({
|
|
622
622
|
__name: "SynoJsonRenderer",
|
|
@@ -634,7 +634,7 @@ const Je = {
|
|
|
634
634
|
fallback: {}
|
|
635
635
|
},
|
|
636
636
|
setup(e) {
|
|
637
|
-
return (o, n) => (X(), Y(j(
|
|
637
|
+
return (o, n) => (X(), Y(j(B), {
|
|
638
638
|
registry: j(D),
|
|
639
639
|
store: e.store,
|
|
640
640
|
"initial-state": e.state ?? e.spec?.state ?? {},
|
|
@@ -646,7 +646,7 @@ const Je = {
|
|
|
646
646
|
"on-state-change": e.onStateChange
|
|
647
647
|
}, {
|
|
648
648
|
default: Q(() => [
|
|
649
|
-
Z(j(
|
|
649
|
+
Z(j(M), {
|
|
650
650
|
spec: e.spec,
|
|
651
651
|
registry: j(D),
|
|
652
652
|
loading: e.loading,
|
|
@@ -692,7 +692,7 @@ function Fe(e) {
|
|
|
692
692
|
if (e.code === "invalid_type") return `Expected ${e.expected}.`;
|
|
693
693
|
}
|
|
694
694
|
const v = (e, o) => `${e}: ${o.join(", ")}`;
|
|
695
|
-
class
|
|
695
|
+
class We {
|
|
696
696
|
errors = [];
|
|
697
697
|
warnings = [];
|
|
698
698
|
error(o) {
|
|
@@ -703,7 +703,7 @@ class Me {
|
|
|
703
703
|
}
|
|
704
704
|
}
|
|
705
705
|
function mt(e, o = {}) {
|
|
706
|
-
const n = o.catalog ?? A, a = n.data.components, i = new
|
|
706
|
+
const n = o.catalog ?? A, a = n.data.components, i = new We();
|
|
707
707
|
if (!m(e))
|
|
708
708
|
return i.error({ code: "invalid_spec", path: "", message: "A spec must be a JSON object.", hint: 'Return {"root": "<key>", "elements": {...}, "state": {...}}.' }), T(i);
|
|
709
709
|
const s = m(e.elements) ? e.elements : void 0;
|
|
@@ -728,7 +728,7 @@ function mt(e, o = {}) {
|
|
|
728
728
|
});
|
|
729
729
|
continue;
|
|
730
730
|
}
|
|
731
|
-
|
|
731
|
+
Be(i, p, h, a[h], f.props), Me(i, p, h, a[h], f, s);
|
|
732
732
|
}
|
|
733
733
|
const c = o.messages && q(o.messages), l = {
|
|
734
734
|
issues: i,
|
|
@@ -745,7 +745,7 @@ function mt(e, o = {}) {
|
|
|
745
745
|
};
|
|
746
746
|
return s && typeof e.root == "string" && Object.hasOwn(s, e.root) && Ge(l, e.root, s), T(i);
|
|
747
747
|
}
|
|
748
|
-
function
|
|
748
|
+
function Be(e, o, n, a, i) {
|
|
749
749
|
const s = (...l) => u("elements", o, "props", ...l);
|
|
750
750
|
if (!m(i)) {
|
|
751
751
|
e.error({ code: "invalid_props", path: s(), elementKey: o, message: '"props" must be an object.', hint: 'Use "props": {} when the component needs none.' });
|
|
@@ -793,7 +793,7 @@ function z(e, o) {
|
|
|
793
793
|
});
|
|
794
794
|
return n;
|
|
795
795
|
}
|
|
796
|
-
function
|
|
796
|
+
function Me(e, o, n, a, i, s) {
|
|
797
797
|
const r = a.slots ?? [], { children: c } = i;
|
|
798
798
|
if (c !== void 0 && !(Array.isArray(c) && c.every((l) => typeof l == "string")) ? e.error({ code: "invalid_children", path: u("elements", o, "children"), elementKey: o, message: '"children" must be an array of element keys.' }) : c?.length && !r.includes("default") && e.error({
|
|
799
799
|
code: "children_not_allowed",
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { ComputedRef, InjectionKey } from 'vue';
|
|
1
|
+
import { ComputedRef, InjectionKey, Ref } from 'vue';
|
|
2
2
|
export type AppPresentation = 'mobile' | 'window' | 'web';
|
|
3
3
|
/** Container widths, never global viewport breakpoints: DSM windows share a wide host viewport. */
|
|
4
4
|
export declare const MOBILE_LAYOUT_MAX = 640;
|
|
5
|
-
export declare const WEB_LAYOUT_MIN =
|
|
5
|
+
export declare const WEB_LAYOUT_MIN = 960;
|
|
6
|
+
/** Below this width a web layout starts with its sidebar as the rail, so a 1024 laptop keeps room for the page. */
|
|
7
|
+
export declare const WEB_RAIL_BELOW = 1200;
|
|
6
8
|
/** How a wide container is presented: a maximized DSM window stays `window` unless the app is a Portal page. */
|
|
7
9
|
export type WideLayout = 'window' | 'web';
|
|
8
10
|
export declare function appPresentationForWidth(width: number, wide?: WideLayout): AppPresentation;
|
|
@@ -11,6 +13,34 @@ export declare const APP_PRESENTATION_KEY: InjectionKey<ComputedRef<AppPresentat
|
|
|
11
13
|
export declare const WEB_SIDEBAR_DEFAULT = 248;
|
|
12
14
|
export declare const WEB_SIDEBAR_MIN = 200;
|
|
13
15
|
export declare const WEB_SIDEBAR_MAX = 360;
|
|
16
|
+
/** The collapsed sidebar and the collapsed aside are one rail width. */
|
|
17
|
+
export declare const WEB_RAIL_WIDTH = 48;
|
|
18
|
+
/** A web container this narrow shows the sidebar as the rail until the user opens it. */
|
|
19
|
+
export declare function webSidebarStartsAsRail(width: number): boolean;
|
|
20
|
+
/** The right side region (AppLayout's `aside` slot): open beside the page, the rail, or over the whole content area. */
|
|
21
|
+
export type AppAsideState = 'open' | 'collapsed' | 'expanded';
|
|
22
|
+
export declare const WEB_ASIDE_DEFAULT = 380;
|
|
23
|
+
export declare const WEB_ASIDE_MIN = 320;
|
|
24
|
+
export declare const WEB_ASIDE_MAX = 560;
|
|
25
|
+
/** An open aside that would leave the page narrower than this floats over the page instead of pushing it. */
|
|
26
|
+
export declare const ASIDE_MAIN_MIN = 480;
|
|
27
|
+
/** What AppLayout tells the content of its `aside` slot (an AsidePanel). */
|
|
28
|
+
export type AppAside = {
|
|
29
|
+
/** The state; setting it writes AppLayout's `v-model:aside`. */
|
|
30
|
+
state: Ref<AppAsideState>;
|
|
31
|
+
/** True while the open aside floats over the page instead of pushing it. */
|
|
32
|
+
overlay: ComputedRef<boolean>;
|
|
33
|
+
presentation: ComputedRef<AppPresentation>;
|
|
34
|
+
/** The region's target width as a CSS length (the rail, the open width, or the whole content area). */
|
|
35
|
+
regionWidth: ComputedRef<string>;
|
|
36
|
+
};
|
|
37
|
+
export declare const APP_ASIDE_KEY: InjectionKey<AppAside>;
|
|
38
|
+
/**
|
|
39
|
+
* The shared side-region motion: true while the sidebar or the aside changes
|
|
40
|
+
* width. Content that measures itself (a canvas grid, a chart, a column count)
|
|
41
|
+
* waits for false and then measures once, so it settles once.
|
|
42
|
+
*/
|
|
43
|
+
export declare const APP_SIDE_MOTION_KEY: InjectionKey<Readonly<Ref<boolean>>>;
|
|
14
44
|
/** True while the web sidebar shows icons only; AppSidebar keeps labels as accessible names. */
|
|
15
45
|
export declare const APP_SIDEBAR_COLLAPSED_KEY: InjectionKey<ComputedRef<boolean>>;
|
|
16
46
|
/** Where AppLayout puts its navigation: the left column (default) or a bar across the top. A phone always uses the drawer. */
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* change: a changed viewport is followed by one, once it applies. A
|
|
11
11
|
* device-width viewport already on the page gets the resize too, since the
|
|
12
12
|
* host's window loader may have set it just before the app mounted, after DSM
|
|
13
|
-
* sized the window; it
|
|
13
|
+
* sized the window; it keeps its own keys and only gains the missing
|
|
14
|
+
* `viewport-fit` and `interactive-widget`.
|
|
14
15
|
*/
|
|
15
16
|
export declare function ensureDeviceViewport(doc?: Document): () => void;
|
package/dist/lib/motion.d.ts
CHANGED
|
@@ -6,6 +6,18 @@ export declare const MOTION_OFF_SELECTOR = "[data-ui-motion=\"off\"]";
|
|
|
6
6
|
* ancestor carries `data-ui-motion="off"`.
|
|
7
7
|
*/
|
|
8
8
|
export declare function motionOff(el?: Element | null): boolean;
|
|
9
|
+
/** A duration token from the theme (dsm7.css), read by motionMs. */
|
|
10
|
+
export type MotionToken = '--ui-motion-fast' | '--ui-motion-normal' | '--ui-motion-slow' | '--ui-motion-panel' | '--ui-motion-exit' | '--ui-motion-stack' | '--ui-motion-flash' | '--ui-skeleton-pulse' | '--ui-motion-drag' | '--ui-motion-drag-settle';
|
|
11
|
+
/** A CSS time (`150ms`, `0.3s`) in milliseconds; null when it is not one. */
|
|
12
|
+
export declare function parseCssTime(value: string): number | null;
|
|
13
|
+
/**
|
|
14
|
+
* A motion token's duration in milliseconds as it resolves on `el` (the
|
|
15
|
+
* document root when none is given), so script times itself by the theme
|
|
16
|
+
* instead of repeating its numbers. 0 when motion is off for `el` (reduced
|
|
17
|
+
* motion or `data-ui-motion="off"`), when the token is not set, and outside
|
|
18
|
+
* a browser.
|
|
19
|
+
*/
|
|
20
|
+
export declare function motionMs(token: MotionToken, el?: Element | null): number;
|
|
9
21
|
/** The longest transition on `el` in milliseconds, delays included; 0 when none applies. */
|
|
10
22
|
export declare function transitionMs(el: Element): number;
|
|
11
23
|
export type InsertedKeysOptions = {
|
package/dist/reka-runtime.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"version": "2.10.5",
|
|
4
4
|
"delivery": "bundled-patched-esm",
|
|
5
5
|
"patchManifestSha256": "14f10159b60d48ac7a0686f58faf7a30e99898dc267b3c032cf2bdd6052dc52b",
|
|
6
|
-
"bundleSha256": "
|
|
6
|
+
"bundleSha256": "e4cdf02eea6ff2d6abcc00f41b867fda8df351972bf636eebb0ead64d25d969b",
|
|
7
7
|
"sourceHashes": {
|
|
8
8
|
"shared/useBodyScrollLock.js": "657592f283cb6fd25454abd284a0024af21936cb56e05b762ff0d22b6a979d32",
|
|
9
9
|
"DismissableLayer/DismissableLayer.js": "da05ca544d9822a8e2b71057e78c0e1ef59423aa3893534338fb58e1ecbd1a8d",
|