@parhelia/core 0.3.12827 → 0.3.12831

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.
@@ -1,2 +1,2 @@
1
- export declare const version = "0.3.12827";
2
- export declare const buildDate = "2026-09-03 11:58:26";
1
+ export declare const version = "0.3.12831";
2
+ export declare const buildDate = "2026-09-03 14:25:47";
package/dist/revision.js CHANGED
@@ -1,3 +1,3 @@
1
- export const version = "0.3.12827";
2
- export const buildDate = "2026-09-03 11:58:26";
1
+ export const version = "0.3.12831";
2
+ export const buildDate = "2026-09-03 14:25:47";
3
3
  //# sourceMappingURL=revision.js.map
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Copy for the sandbox tour. Kept free of React/icon imports so the Playwright
3
+ * spec can import the exact strings without pulling UI dependencies into the
4
+ * test runner.
5
+ */
6
+ export declare const SANDBOX_TOUR_COPY: {
7
+ readonly "start-tour": {
8
+ readonly label: "Your page";
9
+ readonly description: "Everything on the page is editable: click any text and start typing.";
10
+ };
11
+ readonly "insert-component": {
12
+ readonly label: "Add components";
13
+ readonly description: "Use Add component to place new sections, text, images, and other building blocks on your page.";
14
+ };
15
+ readonly "undo-redo": {
16
+ readonly label: "Undo and redo";
17
+ readonly description: "Made a change you do not want? Step backward or forward through your recent edits here.";
18
+ };
19
+ readonly "content-tree": {
20
+ readonly label: "Content tree";
21
+ readonly description: "Open the content tree to browse your site and move quickly between pages.";
22
+ };
23
+ readonly "preview-mode": {
24
+ readonly label: "Preview mode";
25
+ readonly description: "Switch to preview mode to see the page without editing controls.";
26
+ };
27
+ readonly "device-switcher": {
28
+ readonly label: "Device views";
29
+ readonly description: "Check how your page looks on desktop, tablet, and mobile screens.";
30
+ };
31
+ readonly "agent-prompt": {
32
+ readonly label: "Your AI agent";
33
+ readonly description: "Describe what you want in plain language and your agent can write, restyle, or build it for you.";
34
+ };
35
+ readonly "agents-button": {
36
+ readonly label: "Your AI agent";
37
+ readonly description: "Open the agents panel, then describe what you want in plain language.";
38
+ };
39
+ readonly help: {
40
+ readonly label: "Help";
41
+ readonly description: "Find guidance and useful resources here whenever you need a hand.";
42
+ };
43
+ readonly done: {
44
+ readonly label: "You are ready";
45
+ readonly description: "That is everything you need to start exploring. Have fun building in your sandbox!";
46
+ };
47
+ };
48
+ export type SandboxStepId = keyof typeof SANDBOX_TOUR_COPY;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Copy for the sandbox tour. Kept free of React/icon imports so the Playwright
3
+ * spec can import the exact strings without pulling UI dependencies into the
4
+ * test runner.
5
+ */
6
+ export const SANDBOX_TOUR_COPY = {
7
+ "start-tour": {
8
+ label: "Your page",
9
+ description: "Everything on the page is editable: click any text and start typing.",
10
+ },
11
+ "insert-component": {
12
+ label: "Add components",
13
+ description: "Use Add component to place new sections, text, images, and other building blocks on your page.",
14
+ },
15
+ "undo-redo": {
16
+ label: "Undo and redo",
17
+ description: "Made a change you do not want? Step backward or forward through your recent edits here.",
18
+ },
19
+ "content-tree": {
20
+ label: "Content tree",
21
+ description: "Open the content tree to browse your site and move quickly between pages.",
22
+ },
23
+ "preview-mode": {
24
+ label: "Preview mode",
25
+ description: "Switch to preview mode to see the page without editing controls.",
26
+ },
27
+ "device-switcher": {
28
+ label: "Device views",
29
+ description: "Check how your page looks on desktop, tablet, and mobile screens.",
30
+ },
31
+ "agent-prompt": {
32
+ label: "Your AI agent",
33
+ description: "Describe what you want in plain language and your agent can write, restyle, or build it for you.",
34
+ },
35
+ "agents-button": {
36
+ label: "Your AI agent",
37
+ description: "Open the agents panel, then describe what you want in plain language.",
38
+ },
39
+ help: {
40
+ label: "Help",
41
+ description: "Find guidance and useful resources here whenever you need a hand.",
42
+ },
43
+ done: {
44
+ label: "You are ready",
45
+ description: "That is everything you need to start exploring. Have fun building in your sandbox!",
46
+ },
47
+ };
48
+ //# sourceMappingURL=sandbox-tour-copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox-tour-copy.js","sourceRoot":"","sources":["../../src/tour/sandbox-tour-copy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY,EAAE;QACZ,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,sEAAsE;KACzE;IACD,kBAAkB,EAAE;QAClB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,gGAAgG;KACnG;IACD,WAAW,EAAE;QACX,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,yFAAyF;KAC5F;IACD,cAAc,EAAE;QACd,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,2EAA2E;KAC9E;IACD,cAAc,EAAE;QACd,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,kEAAkE;KACrE;IACD,iBAAiB,EAAE;QACjB,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,mEAAmE;KACtE;IACD,cAAc,EAAE;QACd,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,kGAAkG;KACrG;IACD,eAAe,EAAE;QACf,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,uEAAuE;KAC1E;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,WAAW,EACT,mEAAmE;KACtE;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,oFAAoF;KACvF;CACO,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Tour } from "../config/types";
2
+ export { SANDBOX_TOUR_COPY } from "./sandbox-tour-copy";
3
+ export declare function createSandboxTour(): Tour;
@@ -0,0 +1,210 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowLeft, ArrowRight, Check } from "lucide-react";
3
+ import { elementState, isElementVisible } from "./tour-utils";
4
+ import { SANDBOX_TOUR_COPY } from "./sandbox-tour-copy";
5
+ export { SANDBOX_TOUR_COPY } from "./sandbox-tour-copy";
6
+ const SELECTORS = {
7
+ "start-tour": '[data-testid="pageEditoriframe"]',
8
+ "insert-component": '[data-testid="insert-component-button"]',
9
+ "undo-redo": 'div:has(> [data-testid="toolbar-undo-button"])',
10
+ "content-tree": '[data-testid="content-tree-toggle-button"]',
11
+ "preview-mode": '[data-testid="preview-mode-button"]',
12
+ "device-switcher": '[data-testid="viewport-mode-switcher-button"]',
13
+ "agent-prompt": '[data-testid="agent-terminal-prompt"]',
14
+ "agents-button": '[data-testid="agents-panel-button"]',
15
+ help: '[data-testid="help-button"]',
16
+ };
17
+ /**
18
+ * The editor chrome the tour waits for before it treats an absent optional
19
+ * control as "not part of this layout". The toolbar and its siblings mount in
20
+ * the same React commit, so once these two exist the rest has settled. Waiting
21
+ * on every step selector instead would stall the first bubble for the full
22
+ * timeout whenever one control is legitimately missing (mobile, closed agents
23
+ * panel).
24
+ */
25
+ const REQUIRED_CHROME_SELECTORS = [
26
+ SELECTORS["start-tour"],
27
+ '[data-testid="genericToolbar"]',
28
+ ];
29
+ const SETTLE_TIMEOUT_MS = 3000;
30
+ export function createSandboxTour() {
31
+ let settled = false;
32
+ let settlePromise;
33
+ let settleGeneration = 0;
34
+ const resetSettleState = () => {
35
+ settled = false;
36
+ settlePromise = undefined;
37
+ settleGeneration += 1;
38
+ };
39
+ return {
40
+ dismissOnEscape: true,
41
+ pointer: "caret",
42
+ getSteps: (params) => {
43
+ const selectorShouldBeSkipped = (selector) => {
44
+ const state = elementState(selector);
45
+ return state === "hidden" || (settled && state === "absent");
46
+ };
47
+ const definitions = [
48
+ {
49
+ id: "start-tour",
50
+ focusElement: SELECTORS["start-tour"],
51
+ bubblePosition: "right",
52
+ bubbleVerticalAnchor: "center",
53
+ },
54
+ {
55
+ id: "insert-component",
56
+ focusElement: SELECTORS["insert-component"],
57
+ bubblePosition: "bottom",
58
+ skipIf: () => selectorShouldBeSkipped(SELECTORS["insert-component"]),
59
+ },
60
+ {
61
+ id: "undo-redo",
62
+ focusElement: SELECTORS["undo-redo"],
63
+ bubblePosition: "bottom",
64
+ skipIf: () => selectorShouldBeSkipped(SELECTORS["undo-redo"]),
65
+ },
66
+ {
67
+ id: "content-tree",
68
+ focusElement: SELECTORS["content-tree"],
69
+ bubblePosition: "bottom",
70
+ skipIf: () => selectorShouldBeSkipped(SELECTORS["content-tree"]),
71
+ },
72
+ {
73
+ id: "preview-mode",
74
+ focusElement: SELECTORS["preview-mode"],
75
+ bubblePosition: "bottom",
76
+ skipIf: () => selectorShouldBeSkipped(SELECTORS["preview-mode"]),
77
+ },
78
+ {
79
+ id: "device-switcher",
80
+ focusElement: SELECTORS["device-switcher"],
81
+ bubblePosition: "bottom",
82
+ skipIf: () => selectorShouldBeSkipped(SELECTORS["device-switcher"]),
83
+ },
84
+ {
85
+ id: "agent-prompt",
86
+ focusElement: SELECTORS["agent-prompt"],
87
+ bubblePosition: "left",
88
+ skipIf: () => selectorShouldBeSkipped(SELECTORS["agent-prompt"]),
89
+ },
90
+ {
91
+ id: "agents-button",
92
+ focusElement: SELECTORS["agents-button"],
93
+ bubblePosition: "bottom",
94
+ skipIf: () => isElementVisible(SELECTORS["agent-prompt"]) ||
95
+ selectorShouldBeSkipped(SELECTORS["agents-button"]),
96
+ },
97
+ {
98
+ id: "help",
99
+ focusElement: SELECTORS.help,
100
+ bubblePosition: "bottom",
101
+ skipIf: () => selectorShouldBeSkipped(SELECTORS.help),
102
+ },
103
+ { id: "done" },
104
+ ];
105
+ const startSettlePass = () => {
106
+ if (!settlePromise) {
107
+ const generation = settleGeneration;
108
+ // Defer one microtask: Tour's wait helper reads the current step, which
109
+ // is initialized immediately after getSteps returns.
110
+ settlePromise = Promise.resolve()
111
+ .then(() => Promise.all(REQUIRED_CHROME_SELECTORS.map((selector) => params.waitForElement(selector, SETTLE_TIMEOUT_MS))))
112
+ .then(() => {
113
+ if (generation === settleGeneration)
114
+ settled = true;
115
+ }, () => {
116
+ if (generation === settleGeneration)
117
+ settled = true;
118
+ });
119
+ }
120
+ return settlePromise;
121
+ };
122
+ void startSettlePass();
123
+ const stopTour = () => {
124
+ resetSettleState();
125
+ params.stopTour();
126
+ };
127
+ const isSkipped = (definition) => definition.skipIf?.(params.editContext.configuration) ?? false;
128
+ // Numbering only counts steps whose target is on screen right now (plus
129
+ // the element-less closing step). Before the chrome has settled, absent
130
+ // targets are deliberately not skipped, but counting them would make
131
+ // "n of N" shrink once they are confirmed missing.
132
+ const isCounted = (definition) => !isSkipped(definition) &&
133
+ (!definition.focusElement ||
134
+ elementState(definition.focusElement) === "visible");
135
+ const visibleDefinitions = definitions.filter(isCounted);
136
+ const findPreviousVisible = (index) => {
137
+ for (let previous = index - 1; previous >= 0; previous -= 1) {
138
+ const candidate = definitions[previous];
139
+ if (candidate && !isSkipped(candidate))
140
+ return candidate.id;
141
+ }
142
+ return undefined;
143
+ };
144
+ const steps = {};
145
+ definitions.forEach((definition, index) => {
146
+ const copy = SANDBOX_TOUR_COPY[definition.id];
147
+ const visibleIndex = visibleDefinitions.findIndex((candidate) => candidate.id === definition.id);
148
+ const nextId = definitions[index + 1]?.id ?? "done";
149
+ const previousId = findPreviousVisible(index);
150
+ const isDone = definition.id === "done";
151
+ steps[definition.id] = {
152
+ title: copy.label,
153
+ progress: {
154
+ index: visibleIndex + 1,
155
+ total: visibleDefinitions.length,
156
+ },
157
+ description: copy.description,
158
+ focusElement: definition.focusElement,
159
+ bubblePosition: definition.bubblePosition,
160
+ bubbleVerticalAnchor: definition.bubbleVerticalAnchor,
161
+ skipIf: definition.skipIf,
162
+ nextStep: nextId,
163
+ ...(definition.id === "start-tour"
164
+ ? {
165
+ prepareAction: async () => {
166
+ // Every fresh run passes through here (only a URL-restored
167
+ // run skips it), so this also clears state left behind when
168
+ // the engine's own close button or Escape ended the last run
169
+ // without going through the wrapped stopTour.
170
+ resetSettleState();
171
+ await startSettlePass();
172
+ },
173
+ }
174
+ : {}),
175
+ buttons: [
176
+ ...(previousId
177
+ ? [
178
+ {
179
+ label: (_jsxs(_Fragment, { children: [_jsx(ArrowLeft, { strokeWidth: 1, className: "inline h-4 w-4" }), "Back"] })),
180
+ onClick: () => params.nextStep(previousId),
181
+ className: "button button-secondary mt-2",
182
+ variant: "secondary",
183
+ },
184
+ ]
185
+ : []),
186
+ {
187
+ label: isDone ? (_jsxs(_Fragment, { children: [_jsx(Check, { strokeWidth: 1, className: "inline h-4 w-4" }), " Finish"] })) : (_jsxs(_Fragment, { children: [_jsx(ArrowRight, { strokeWidth: 1, className: "inline h-4 w-4" }), " Next"] })),
188
+ onClick: () => (isDone ? stopTour() : params.nextStep(nextId)),
189
+ className: "button button-primary mt-2",
190
+ variant: "primary",
191
+ },
192
+ ],
193
+ };
194
+ });
195
+ steps.error = {
196
+ title: "Oh no...",
197
+ description: "Something went wrong.",
198
+ nextStep: "done",
199
+ buttons: [
200
+ {
201
+ label: (_jsxs(_Fragment, { children: [_jsx(Check, { strokeWidth: 1, className: "inline h-4 w-4" }), " Close"] })),
202
+ onClick: stopTour,
203
+ },
204
+ ],
205
+ };
206
+ return steps;
207
+ },
208
+ };
209
+ }
210
+ //# sourceMappingURL=sandbox-tour.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox-tour.js","sourceRoot":"","sources":["../../src/tour/sandbox-tour.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /** Resolve duplicate selectors to the mounted instance the user can actually see. */
2
+ export declare function resolveTourElement(selector: string, root?: Document | Element): Element | null;
3
+ export declare function isElementVisible(selector: string): boolean;
4
+ export declare function elementState(selector: string): "absent" | "hidden" | "visible";
5
+ export type CaretSide = "top" | "bottom" | "left" | "right";
6
+ export type CaretPlacement = {
7
+ left: number;
8
+ top: number;
9
+ /** Which bubble edge carries the caret; null when the bubble overlaps the target. */
10
+ caretSide: CaretSide | null;
11
+ /** Caret centre along that edge, in px from the bubble's left/top edge. */
12
+ caretOffset: number;
13
+ };
14
+ /**
15
+ * Places a bubble of a known size next to a target and keeps it inside the
16
+ * viewport. The caret is positioned independently of the bubble's clamped
17
+ * position so it keeps pointing at the target's centre.
18
+ */
19
+ export declare function placeCaretBubble(position: string, target: DOMRect, bubble: {
20
+ width: number;
21
+ height: number;
22
+ }, viewport: {
23
+ width: number;
24
+ height: number;
25
+ }, margin?: number): CaretPlacement;
26
+ export declare function useTourEscape(enabled: boolean, onEscape: () => void): void;
@@ -0,0 +1,138 @@
1
+ import { useEffect, useRef } from "react";
2
+ function hasArea(rect) {
3
+ return rect.width > 0 && rect.height > 0;
4
+ }
5
+ function rectsIntersect(a, b) {
6
+ return (a.right > b.left && a.left < b.right && a.bottom > b.top && a.top < b.bottom);
7
+ }
8
+ function isClippingOverflow(value) {
9
+ return value === "hidden" || value === "auto" || value === "scroll";
10
+ }
11
+ function isTourElementVisible(element) {
12
+ const visibilityElement = element;
13
+ if (typeof visibilityElement.checkVisibility === "function") {
14
+ if (!visibilityElement.checkVisibility({
15
+ checkOpacity: true,
16
+ checkVisibilityCSS: true,
17
+ })) {
18
+ return false;
19
+ }
20
+ }
21
+ else {
22
+ const styles = window.getComputedStyle(element);
23
+ if (styles.display === "none" ||
24
+ styles.visibility === "hidden" ||
25
+ styles.opacity === "0") {
26
+ return false;
27
+ }
28
+ }
29
+ const rect = element.getBoundingClientRect();
30
+ if (!hasArea(rect))
31
+ return false;
32
+ let ancestor = element.parentElement;
33
+ while (ancestor) {
34
+ const styles = window.getComputedStyle(ancestor);
35
+ if (isClippingOverflow(styles.overflow) ||
36
+ isClippingOverflow(styles.overflowX) ||
37
+ isClippingOverflow(styles.overflowY)) {
38
+ const ancestorRect = ancestor.getBoundingClientRect();
39
+ if (!hasArea(ancestorRect) || !rectsIntersect(rect, ancestorRect)) {
40
+ return false;
41
+ }
42
+ }
43
+ ancestor = ancestor.parentElement;
44
+ }
45
+ return true;
46
+ }
47
+ /** Resolve duplicate selectors to the mounted instance the user can actually see. */
48
+ export function resolveTourElement(selector, root = document) {
49
+ const matches = Array.from(root.querySelectorAll(selector));
50
+ return matches.find(isTourElementVisible) ?? matches[0] ?? null;
51
+ }
52
+ export function isElementVisible(selector) {
53
+ const element = resolveTourElement(selector);
54
+ return element !== null && isTourElementVisible(element);
55
+ }
56
+ export function elementState(selector) {
57
+ const matches = document.querySelectorAll(selector);
58
+ if (matches.length === 0)
59
+ return "absent";
60
+ return Array.from(matches).some(isTourElementVisible) ? "visible" : "hidden";
61
+ }
62
+ const CARET_GAP = 14;
63
+ const CARET_EDGE_INSET = 24;
64
+ /**
65
+ * Places a bubble of a known size next to a target and keeps it inside the
66
+ * viewport. The caret is positioned independently of the bubble's clamped
67
+ * position so it keeps pointing at the target's centre.
68
+ */
69
+ export function placeCaretBubble(position, target, bubble, viewport, margin = 12) {
70
+ const clamp = (value, min, max) => Math.min(Math.max(value, min), Math.max(min, max));
71
+ const targetCenterX = target.left + target.width / 2;
72
+ const targetCenterY = target.top + target.height / 2;
73
+ const maxLeft = viewport.width - bubble.width - margin;
74
+ const maxTop = viewport.height - bubble.height - margin;
75
+ let left;
76
+ let top;
77
+ let caretSide;
78
+ switch (position) {
79
+ case "top":
80
+ case "top-left":
81
+ case "top-right":
82
+ left = clamp(targetCenterX - bubble.width / 2, margin, maxLeft);
83
+ top = clamp(target.top - CARET_GAP - bubble.height, margin, maxTop);
84
+ caretSide = "bottom";
85
+ break;
86
+ case "left":
87
+ left = clamp(target.left - CARET_GAP - bubble.width, margin, maxLeft);
88
+ top = clamp(targetCenterY - bubble.height / 2, margin, maxTop);
89
+ caretSide = "right";
90
+ break;
91
+ case "right":
92
+ left = clamp(target.left + target.width + CARET_GAP, margin, maxLeft);
93
+ top = clamp(targetCenterY - bubble.height / 2, margin, maxTop);
94
+ caretSide = "left";
95
+ break;
96
+ default:
97
+ // "bottom" and "bottom-right"
98
+ left = clamp(targetCenterX - bubble.width / 2, margin, maxLeft);
99
+ top = clamp(target.top + target.height + CARET_GAP, margin, maxTop);
100
+ caretSide = "top";
101
+ break;
102
+ }
103
+ const overlapsTarget = left < target.left + target.width &&
104
+ left + bubble.width > target.left &&
105
+ top < target.top + target.height &&
106
+ top + bubble.height > target.top;
107
+ const horizontal = caretSide === "top" || caretSide === "bottom";
108
+ const caretOffset = horizontal
109
+ ? clamp(targetCenterX - left, CARET_EDGE_INSET, bubble.width - CARET_EDGE_INSET)
110
+ : clamp(targetCenterY - top, CARET_EDGE_INSET, bubble.height - CARET_EDGE_INSET);
111
+ return {
112
+ left,
113
+ top,
114
+ caretSide: overlapsTarget ? null : caretSide,
115
+ caretOffset,
116
+ };
117
+ }
118
+ export function useTourEscape(enabled, onEscape) {
119
+ // Callers pass a fresh callback every render; keep the listener stable and
120
+ // read the latest callback through a ref instead of re-subscribing.
121
+ const onEscapeRef = useRef(onEscape);
122
+ onEscapeRef.current = onEscape;
123
+ useEffect(() => {
124
+ if (!enabled)
125
+ return;
126
+ const handleKeyDown = (event) => {
127
+ if (event.key !== "Escape")
128
+ return;
129
+ event.preventDefault();
130
+ event.stopPropagation();
131
+ event.stopImmediatePropagation();
132
+ onEscapeRef.current();
133
+ };
134
+ window.addEventListener("keydown", handleKeyDown, true);
135
+ return () => window.removeEventListener("keydown", handleKeyDown, true);
136
+ }, [enabled]);
137
+ }
138
+ //# sourceMappingURL=tour-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tour-utils.js","sourceRoot":"","sources":["../../src/tour/tour-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAS1C,SAAS,OAAO,CAAC,IAAa;IAC5B,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,CAAU,EAAE,CAAU;IAC5C,OAAO,CACL,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAC7E,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,CAAC;AACtE,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,MAAM,iBAAiB,GAAG,OAA4B,CAAC;IACvD,IAAI,OAAO,iBAAiB,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QAC5D,IACE,CAAC,iBAAiB,CAAC,eAAe,CAAC;YACjC,YAAY,EAAE,IAAI;YAClB,kBAAkB,EAAE,IAAI;SACzB,CAAC,EACF,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChD,IACE,MAAM,CAAC,OAAO,KAAK,MAAM;YACzB,MAAM,CAAC,UAAU,KAAK,QAAQ;YAC9B,MAAM,CAAC,OAAO,KAAK,GAAG,EACtB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjC,IAAI,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;IACrC,OAAO,QAAQ,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACjD,IACE,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC;YACpC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EACpC,CAAC;YACD,MAAM,YAAY,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;gBAClE,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,IAAI,GAAuB,QAAQ;IAEnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,OAAO,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO,OAAO,KAAK,IAAI,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAgB;IAEhB,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/E,CAAC;AAaD,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,MAAe,EACf,MAAyC,EACzC,QAA2C,EAC3C,MAAM,GAAG,EAAE;IAEX,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CACxD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;IACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAExD,IAAI,IAAY,CAAC;IACjB,IAAI,GAAW,CAAC;IAChB,IAAI,SAAoB,CAAC;IAEzB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,KAAK,CAAC;QACX,KAAK,UAAU,CAAC;QAChB,KAAK,WAAW;YACd,IAAI,GAAG,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAChE,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACpE,SAAS,GAAG,QAAQ,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACtE,GAAG,GAAG,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC/D,SAAS,GAAG,OAAO,CAAC;YACpB,MAAM;QACR,KAAK,OAAO;YACV,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACtE,GAAG,GAAG,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC/D,SAAS,GAAG,MAAM,CAAC;YACnB,MAAM;QACR;YACE,8BAA8B;YAC9B,IAAI,GAAG,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAChE,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACpE,SAAS,GAAG,KAAK,CAAC;YAClB,MAAM;IACV,CAAC;IAED,MAAM,cAAc,GAClB,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;QACjC,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI;QACjC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM;QAChC,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;IAEnC,MAAM,UAAU,GAAG,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,QAAQ,CAAC;IACjE,MAAM,WAAW,GAAG,UAAU;QAC5B,CAAC,CAAC,KAAK,CACH,aAAa,GAAG,IAAI,EACpB,gBAAgB,EAChB,MAAM,CAAC,KAAK,GAAG,gBAAgB,CAChC;QACH,CAAC,CAAC,KAAK,CACH,aAAa,GAAG,GAAG,EACnB,gBAAgB,EAChB,MAAM,CAAC,MAAM,GAAG,gBAAgB,CACjC,CAAC;IAEN,OAAO;QACL,IAAI;QACJ,GAAG;QACH,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QAC5C,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,QAAoB;IAClE,2EAA2E;IAC3E,oEAAoE;IACpE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,EAAE;YAC7C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO;YACnC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,wBAAwB,EAAE,CAAC;YACjC,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parhelia/core",
3
- "version": "0.3.12827",
3
+ "version": "0.3.12831",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },