@embeddables/cli 0.14.4 → 0.15.0-beta.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.
Files changed (107) hide show
  1. package/.prompts/custom/build-funnel.md +3 -1
  2. package/.prompts/custom/carousel.md +159 -0
  3. package/.prompts/embeddables-cli.md +116 -42
  4. package/.prompts/short-rule-body.md +15 -0
  5. package/README.md +94 -0
  6. package/dist/auth/index.d.ts +27 -0
  7. package/dist/auth/index.d.ts.map +1 -1
  8. package/dist/auth/index.js +44 -0
  9. package/dist/auth/index.js.map +1 -1
  10. package/dist/cli.js +69 -2
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/build-workbench.d.ts +5 -0
  13. package/dist/commands/build-workbench.d.ts.map +1 -0
  14. package/dist/commands/build-workbench.js +117 -0
  15. package/dist/commands/build-workbench.js.map +1 -0
  16. package/dist/commands/dangerously-publish.d.ts +53 -0
  17. package/dist/commands/dangerously-publish.d.ts.map +1 -0
  18. package/dist/commands/dangerously-publish.js +731 -0
  19. package/dist/commands/dangerously-publish.js.map +1 -0
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +3 -253
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/login.d.ts +2 -0
  24. package/dist/commands/login.d.ts.map +1 -1
  25. package/dist/commands/login.js +41 -1
  26. package/dist/commands/login.js.map +1 -1
  27. package/dist/commands/provide-otp.d.ts +11 -0
  28. package/dist/commands/provide-otp.d.ts.map +1 -0
  29. package/dist/commands/provide-otp.js +102 -0
  30. package/dist/commands/provide-otp.js.map +1 -0
  31. package/dist/commands/update-project-files.d.ts +8 -0
  32. package/dist/commands/update-project-files.d.ts.map +1 -0
  33. package/dist/commands/update-project-files.js +245 -0
  34. package/dist/commands/update-project-files.js.map +1 -0
  35. package/dist/commands/upgrade.d.ts.map +1 -1
  36. package/dist/commands/upgrade.js +16 -0
  37. package/dist/commands/upgrade.js.map +1 -1
  38. package/dist/compiler/flatten.js +1 -0
  39. package/dist/compiler/parsePage.js +14 -9
  40. package/dist/compiler/parsePage.js.map +1 -1
  41. package/dist/compiler/reverse.d.ts.map +1 -1
  42. package/dist/compiler/reverse.js +18 -8
  43. package/dist/compiler/reverse.js.map +1 -1
  44. package/dist/components/primitives/CustomHTML.d.ts +2 -1
  45. package/dist/components/primitives/CustomHTML.d.ts.map +1 -1
  46. package/dist/components/primitives/CustomHTML.js +11 -2
  47. package/dist/components/primitives/CustomHTML.js.map +1 -1
  48. package/dist/components/primitives/OptionSelector.d.ts +1 -0
  49. package/dist/components/primitives/OptionSelector.d.ts.map +1 -1
  50. package/dist/components/primitives/OptionSelector.js.map +1 -1
  51. package/dist/constants.d.ts +1 -1
  52. package/dist/constants.d.ts.map +1 -1
  53. package/dist/constants.js +2 -3
  54. package/dist/constants.js.map +1 -1
  55. package/dist/helpers/TEMP helpers file.d.ts +1 -0
  56. package/dist/helpers/TEMP helpers file.d.ts.map +1 -0
  57. package/dist/helpers/TEMP helpers file.js +1 -0
  58. package/dist/helpers/json.d.ts.map +1 -1
  59. package/dist/helpers/json.js +132 -17
  60. package/dist/helpers/json.js.map +1 -1
  61. package/dist/prompts/branches.d.ts.map +1 -1
  62. package/dist/prompts/branches.js +2 -0
  63. package/dist/prompts/branches.js.map +1 -1
  64. package/dist/types-builder.d.ts +6 -2
  65. package/dist/types-builder.d.ts.map +1 -1
  66. package/dist/workbench/AutofillPanel.d.ts.map +1 -1
  67. package/dist/workbench/AutofillPanel.js +52 -14
  68. package/dist/workbench/AutofillPanel.js.map +1 -1
  69. package/dist/workbench/FeedbackPanel.d.ts +39 -0
  70. package/dist/workbench/FeedbackPanel.d.ts.map +1 -0
  71. package/dist/workbench/FeedbackPanel.js +279 -0
  72. package/dist/workbench/FeedbackPanel.js.map +1 -0
  73. package/dist/workbench/PageThumbnailStrip.d.ts +6 -0
  74. package/dist/workbench/PageThumbnailStrip.d.ts.map +1 -0
  75. package/dist/workbench/PageThumbnailStrip.js +124 -0
  76. package/dist/workbench/PageThumbnailStrip.js.map +1 -0
  77. package/dist/workbench/Toast.d.ts +18 -0
  78. package/dist/workbench/Toast.d.ts.map +1 -0
  79. package/dist/workbench/Toast.js +46 -0
  80. package/dist/workbench/Toast.js.map +1 -0
  81. package/dist/workbench/UserDataPanel.d.ts +2 -1
  82. package/dist/workbench/UserDataPanel.d.ts.map +1 -1
  83. package/dist/workbench/UserDataPanel.js +2 -1
  84. package/dist/workbench/UserDataPanel.js.map +1 -1
  85. package/dist/workbench/WorkbenchApp.d.ts.map +1 -1
  86. package/dist/workbench/WorkbenchApp.js +19 -3
  87. package/dist/workbench/WorkbenchApp.js.map +1 -1
  88. package/dist/workbench/cloudflare-worker/README.md +31 -0
  89. package/dist/workbench/cloudflare-worker/public/workbench.css +1614 -0
  90. package/dist/workbench/cloudflare-worker/public/workbench.js +77 -0
  91. package/dist/workbench/cloudflare-worker/worker.js +40 -0
  92. package/dist/workbench/cloudflare-worker/wrangler.toml +10 -0
  93. package/dist/workbench/supabase-browser.d.ts +11 -0
  94. package/dist/workbench/supabase-browser.d.ts.map +1 -0
  95. package/dist/workbench/supabase-browser.js +18 -0
  96. package/dist/workbench/supabase-browser.js.map +1 -0
  97. package/dist/workbench/types.d.ts +25 -0
  98. package/dist/workbench/types.d.ts.map +1 -0
  99. package/dist/workbench/types.js +2 -0
  100. package/dist/workbench/types.js.map +1 -0
  101. package/dist/workbench/useComponentSelection.d.ts +27 -0
  102. package/dist/workbench/useComponentSelection.d.ts.map +1 -0
  103. package/dist/workbench/useComponentSelection.js +203 -0
  104. package/dist/workbench/useComponentSelection.js.map +1 -0
  105. package/dist/workbench/workbench.css +1614 -0
  106. package/dist/workbench/workbench.js +77 -0
  107. package/package.json +1 -1
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Embeddables Workbench - Cloudflare Worker
3
+ *
4
+ * Serves workbench assets with CORS headers.
5
+ * Assets are served from the /public directory.
6
+ */
7
+
8
+ export default {
9
+ async fetch(request, env) {
10
+ // Handle CORS preflight
11
+ if (request.method === 'OPTIONS') {
12
+ return new Response(null, {
13
+ headers: corsHeaders(),
14
+ });
15
+ }
16
+
17
+ // Serve static assets from /public
18
+ const response = await env.ASSETS.fetch(request);
19
+
20
+ // Add CORS headers
21
+ const newHeaders = new Headers(response.headers);
22
+ Object.entries(corsHeaders()).forEach(([key, value]) => {
23
+ newHeaders.set(key, value);
24
+ });
25
+
26
+ return new Response(response.body, {
27
+ status: response.status,
28
+ headers: newHeaders,
29
+ });
30
+ },
31
+ };
32
+
33
+ function corsHeaders() {
34
+ return {
35
+ 'Access-Control-Allow-Origin': '*',
36
+ 'Access-Control-Allow-Methods': 'GET, OPTIONS',
37
+ 'Access-Control-Allow-Headers': 'Content-Type',
38
+ 'Access-Control-Max-Age': '86400',
39
+ };
40
+ }
@@ -0,0 +1,10 @@
1
+ # Embeddables Workbench - Cloudflare Worker
2
+ #
3
+ # Deploy: npx wrangler deploy
4
+
5
+ name = "embeddables-workbench"
6
+ main = "worker.js"
7
+ compatibility_date = "2024-01-01"
8
+
9
+ [assets]
10
+ directory = "./public"
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Supabase client for browser use (e.g. feedback review storage).
3
+ * Uses constants that have no Node dependencies so the workbench bundle can import safely.
4
+ */
5
+ import { SupabaseClient } from '@supabase/supabase-js';
6
+ /**
7
+ * Get a Supabase client instance for browser storage operations.
8
+ * Uses anon key; suitable for public bucket access (feedback_reviews).
9
+ */
10
+ export declare function getSupabaseBrowserClient(): SupabaseClient;
11
+ //# sourceMappingURL=supabase-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-browser.d.ts","sourceRoot":"","sources":["../../src/workbench/supabase-browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAKpE;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,cAAc,CAKzD"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Supabase client for browser use (e.g. feedback review storage).
3
+ * Uses constants that have no Node dependencies so the workbench bundle can import safely.
4
+ */
5
+ import { createClient } from '@supabase/supabase-js';
6
+ import { SUPABASE_URL, SUPABASE_ANON_KEY } from '../constants.js';
7
+ let _client = null;
8
+ /**
9
+ * Get a Supabase client instance for browser storage operations.
10
+ * Uses anon key; suitable for public bucket access (feedback_reviews).
11
+ */
12
+ export function getSupabaseBrowserClient() {
13
+ if (!_client) {
14
+ _client = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
15
+ }
16
+ return _client;
17
+ }
18
+ //# sourceMappingURL=supabase-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-browser.js","sourceRoot":"","sources":["../../src/workbench/supabase-browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEjE,IAAI,OAAO,GAA0B,IAAI,CAAA;AAEzC;;;GAGG;AACH,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shared types for Workbench components that interact with window.Savvy.
3
+ */
4
+ import type { Flow } from '../types-builder.js';
5
+ export type SavvyWindow = Window & typeof globalThis & {
6
+ Savvy?: {
7
+ getFlowJson?: (id: string) => Flow | undefined;
8
+ getUserData?: (id: string) => UserData | undefined;
9
+ getStaticHtml?: (id: string, pageId: string) => string | undefined;
10
+ goToPage?: (id: string, pageId: string) => void;
11
+ goToPrevPage?: (id: string) => void;
12
+ goToNextPage?: (id: string) => void;
13
+ };
14
+ };
15
+ export type UserData = {
16
+ current_page_id: string;
17
+ current_page_key: string;
18
+ current_page_index: number;
19
+ [key: string]: unknown;
20
+ };
21
+ export type PageInfo = {
22
+ id: string;
23
+ key: string;
24
+ };
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/workbench/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,MAAM,WAAW,GAAG,MAAM,GAC9B,OAAO,UAAU,GAAG;IAClB,KAAK,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAAA;QAC9C,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAA;QAClD,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;QAClE,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;QAC/C,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;QACnC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;KACpC,CAAA;CACF,CAAA;AAEH,MAAM,MAAM,QAAQ,GAAG;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workbench/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { Flow, FlowPage, Component } from '../types-builder.js';
2
+ /** Extract component ID from element's cid-* class. */
3
+ export declare function getComponentIdFromElement(el: HTMLElement): string | null;
4
+ /** Find the nearest ancestor with Flow-Component class. */
5
+ export declare function findFlowComponentAncestor(el: HTMLElement): HTMLElement | null;
6
+ /** Find a component by ID in flow JSON (global, page, or nested in Container). */
7
+ export declare function findComponentById(flowJson: Flow, componentId: string): Component | null;
8
+ /** Find a page by ID in flow JSON. */
9
+ export declare function findPageById(flowJson: Flow, pageId: string): FlowPage | null;
10
+ export type ComponentSelectionState = 'idle' | 'inspecting' | 'selected';
11
+ export type UseComponentSelectionResult = {
12
+ state: ComponentSelectionState;
13
+ selectedComponent: Component | null;
14
+ selectedComponentId: string | null;
15
+ error: string | null;
16
+ startInspecting: () => void;
17
+ stopInspecting: () => void;
18
+ clearSelection: () => void;
19
+ inspectAnother: () => void;
20
+ setError: (err: string | null) => void;
21
+ };
22
+ /**
23
+ * Hook that provides component selection logic for inspecting and selecting
24
+ * Flow components on the page. Used by InspectorPanel and FeedbackPanel.
25
+ */
26
+ export declare function useComponentSelection(embeddableId: string): UseComponentSelectionResult;
27
+ //# sourceMappingURL=useComponentSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComponentSelection.d.ts","sourceRoot":"","sources":["../../src/workbench/useComponentSelection.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAS/D,uDAAuD;AACvD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAOxE;AAED,2DAA2D;AAC3D,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAS7E;AAeD,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAYvF;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAK5E;AAED,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAA;AAExE,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,uBAAuB,CAAA;IAC9B,iBAAiB,EAAE,SAAS,GAAG,IAAI,CAAA;IACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CACvC,CAAA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,2BAA2B,CA2JvF"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Shared hook for component selection/inspection used by InspectorPanel and FeedbackPanel.
3
+ * Extracts getComponentIdFromElement, findFlowComponentAncestor, findComponentById,
4
+ * findPageById, and the inspecting/selection flow (overlay, click handlers).
5
+ */
6
+ import { useCallback, useEffect, useRef, useState } from 'react';
7
+ /** Extract component ID from element's cid-* class. */
8
+ export function getComponentIdFromElement(el) {
9
+ for (const cls of el.classList) {
10
+ if (cls.startsWith('cid-')) {
11
+ return cls.slice(4);
12
+ }
13
+ }
14
+ return null;
15
+ }
16
+ /** Find the nearest ancestor with Flow-Component class. */
17
+ export function findFlowComponentAncestor(el) {
18
+ let current = el;
19
+ while (current) {
20
+ if (current.classList.contains('Flow-Component')) {
21
+ return current;
22
+ }
23
+ current = current.parentElement;
24
+ }
25
+ return null;
26
+ }
27
+ /** Recursively search a component and its children (e.g. Container.components). */
28
+ function searchComponentTree(comp, componentId) {
29
+ if (comp.id === componentId)
30
+ return comp;
31
+ const children = comp.components;
32
+ if (Array.isArray(children)) {
33
+ for (const child of children) {
34
+ const found = searchComponentTree(child, componentId);
35
+ if (found)
36
+ return found;
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+ /** Find a component by ID in flow JSON (global, page, or nested in Container). */
42
+ export function findComponentById(flowJson, componentId) {
43
+ for (const comp of flowJson.components ?? []) {
44
+ const found = searchComponentTree(comp, componentId);
45
+ if (found)
46
+ return found;
47
+ }
48
+ for (const page of flowJson.pages ?? []) {
49
+ for (const comp of page.components ?? []) {
50
+ const found = searchComponentTree(comp, componentId);
51
+ if (found)
52
+ return found;
53
+ }
54
+ }
55
+ return null;
56
+ }
57
+ /** Find a page by ID in flow JSON. */
58
+ export function findPageById(flowJson, pageId) {
59
+ for (const page of flowJson.pages ?? []) {
60
+ if (page.id === pageId)
61
+ return page;
62
+ }
63
+ return null;
64
+ }
65
+ /**
66
+ * Hook that provides component selection logic for inspecting and selecting
67
+ * Flow components on the page. Used by InspectorPanel and FeedbackPanel.
68
+ */
69
+ export function useComponentSelection(embeddableId) {
70
+ const [state, setState] = useState('idle');
71
+ const [selectedComponent, setSelectedComponent] = useState(null);
72
+ const [selectedComponentId, setSelectedComponentId] = useState(null);
73
+ const [error, setError] = useState(null);
74
+ const overlayRef = useRef(null);
75
+ const hoveredElementRef = useRef(null);
76
+ const savvy = window.Savvy;
77
+ const getOverlay = useCallback(() => {
78
+ if (!overlayRef.current) {
79
+ const overlay = document.createElement('div');
80
+ // No id to avoid DOM uniqueness conflict when InspectorPanel and FeedbackPanel both mount
81
+ overlay.style.cssText = `
82
+ position: fixed;
83
+ pointer-events: none;
84
+ background: rgba(59, 130, 246, 0.15);
85
+ border: 2px solid rgba(59, 130, 246, 0.8);
86
+ border-radius: 4px;
87
+ z-index: 2147483646;
88
+ transition: all 0.1s ease-out;
89
+ display: none;
90
+ `;
91
+ document.body.appendChild(overlay);
92
+ overlayRef.current = overlay;
93
+ }
94
+ return overlayRef.current;
95
+ }, []);
96
+ const positionOverlay = useCallback((el) => {
97
+ const overlay = getOverlay();
98
+ if (!el) {
99
+ overlay.style.display = 'none';
100
+ return;
101
+ }
102
+ const rect = el.getBoundingClientRect();
103
+ overlay.style.display = 'block';
104
+ overlay.style.top = `${rect.top}px`;
105
+ overlay.style.left = `${rect.left}px`;
106
+ overlay.style.width = `${rect.width}px`;
107
+ overlay.style.height = `${rect.height}px`;
108
+ }, [getOverlay]);
109
+ const handlePointerOver = useCallback((e) => {
110
+ const target = e.target;
111
+ const flowComponent = findFlowComponentAncestor(target);
112
+ if (flowComponent && flowComponent !== hoveredElementRef.current) {
113
+ hoveredElementRef.current = flowComponent;
114
+ positionOverlay(flowComponent);
115
+ }
116
+ else if (!flowComponent && hoveredElementRef.current) {
117
+ hoveredElementRef.current = null;
118
+ positionOverlay(null);
119
+ }
120
+ }, [positionOverlay]);
121
+ const handleClick = useCallback((e) => {
122
+ const target = e.target;
123
+ const flowComponent = findFlowComponentAncestor(target);
124
+ if (!flowComponent)
125
+ return;
126
+ e.preventDefault();
127
+ e.stopPropagation();
128
+ const componentId = getComponentIdFromElement(flowComponent);
129
+ if (!componentId) {
130
+ setError('Could not find component ID (cid-*) class on element.');
131
+ return;
132
+ }
133
+ if (!savvy?.getFlowJson) {
134
+ setError('window.Savvy.getFlowJson is not available.');
135
+ return;
136
+ }
137
+ const flowJson = savvy.getFlowJson(embeddableId);
138
+ if (!flowJson) {
139
+ setError('Could not retrieve flow JSON.');
140
+ return;
141
+ }
142
+ const component = findComponentById(flowJson, componentId);
143
+ if (!component) {
144
+ setError(`Component with ID "${componentId}" not found in flow JSON.`);
145
+ return;
146
+ }
147
+ setSelectedComponentId(componentId);
148
+ setSelectedComponent(component);
149
+ setError(null);
150
+ setState('selected');
151
+ positionOverlay(null);
152
+ hoveredElementRef.current = null;
153
+ }, [embeddableId, positionOverlay, savvy]);
154
+ const startInspecting = useCallback(() => {
155
+ setError(null);
156
+ setState('inspecting');
157
+ }, []);
158
+ const stopInspecting = useCallback(() => {
159
+ setState('idle');
160
+ positionOverlay(null);
161
+ hoveredElementRef.current = null;
162
+ }, [positionOverlay]);
163
+ const clearSelection = useCallback(() => {
164
+ setSelectedComponent(null);
165
+ setSelectedComponentId(null);
166
+ setState('idle');
167
+ }, []);
168
+ const inspectAnother = useCallback(() => {
169
+ setError(null);
170
+ setState('inspecting');
171
+ }, []);
172
+ useEffect(() => {
173
+ if (state === 'inspecting') {
174
+ document.addEventListener('pointerover', handlePointerOver, true);
175
+ document.addEventListener('click', handleClick, true);
176
+ return () => {
177
+ document.removeEventListener('pointerover', handlePointerOver, true);
178
+ document.removeEventListener('click', handleClick, true);
179
+ positionOverlay(null);
180
+ };
181
+ }
182
+ }, [state, handlePointerOver, handleClick, positionOverlay]);
183
+ useEffect(() => {
184
+ return () => {
185
+ if (overlayRef.current) {
186
+ overlayRef.current.remove();
187
+ overlayRef.current = null;
188
+ }
189
+ };
190
+ }, []);
191
+ return {
192
+ state,
193
+ selectedComponent,
194
+ selectedComponentId,
195
+ error,
196
+ startInspecting,
197
+ stopInspecting,
198
+ clearSelection,
199
+ inspectAnother,
200
+ setError,
201
+ };
202
+ }
203
+ //# sourceMappingURL=useComponentSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComponentSelection.js","sourceRoot":"","sources":["../../src/workbench/useComponentSelection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAUhE,uDAAuD;AACvD,MAAM,UAAU,yBAAyB,CAAC,EAAe;IACvD,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,yBAAyB,CAAC,EAAe;IACvD,IAAI,OAAO,GAAuB,EAAE,CAAA;IACpC,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjD,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,aAAa,CAAA;IACjC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,mFAAmF;AACnF,SAAS,mBAAmB,CAAC,IAAe,EAAE,WAAmB;IAC/D,IAAI,IAAI,CAAC,EAAE,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,QAAQ,GAAI,IAAqC,CAAC,UAAU,CAAA;IAClE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;YACrD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,QAAc,EAAE,WAAmB;IACnE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACpD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;YACpD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,YAAY,CAAC,QAAc,EAAE,MAAc;IACzD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAgBD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAAoB;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAA0B,MAAM,CAAC,CAAA;IACnE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAA;IAClF,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACnF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAA;IACtD,MAAM,iBAAiB,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAA;IAE1D,MAAM,KAAK,GAAI,MAAsB,CAAC,KAAK,CAAA;IAE3C,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YAC7C,0FAA0F;YAC1F,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;OASvB,CAAA;YACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;QAC9B,CAAC;QACD,OAAO,UAAU,CAAC,OAAO,CAAA;IAC3B,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,EAAsB,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;QAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAA;YAC9B,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAA;QACvC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;QAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;QACnC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,CAAA;QACrC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,CAAA;QACvC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAA;IAC3C,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAA;IAED,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,CAAe,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAA;QACtC,MAAM,aAAa,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACvD,IAAI,aAAa,IAAI,aAAa,KAAK,iBAAiB,CAAC,OAAO,EAAE,CAAC;YACjE,iBAAiB,CAAC,OAAO,GAAG,aAAa,CAAA;YACzC,eAAe,CAAC,aAAa,CAAC,CAAA;QAChC,CAAC;aAAM,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;YACvD,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAA;YAChC,eAAe,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;IACH,CAAC,EACD,CAAC,eAAe,CAAC,CAClB,CAAA;IAED,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,CAAa,EAAE,EAAE;QAChB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAA;QACtC,MAAM,aAAa,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;QACvD,IAAI,CAAC,aAAa;YAAE,OAAM;QAE1B,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,CAAC,CAAC,eAAe,EAAE,CAAA;QAEnB,MAAM,WAAW,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAA;QAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,QAAQ,CAAC,uDAAuD,CAAC,CAAA;YACjE,OAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;YACxB,QAAQ,CAAC,4CAA4C,CAAC,CAAA;YACtD,OAAM;QACR,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,+BAA+B,CAAC,CAAA;YACzC,OAAM;QACR,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;QAC1D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,QAAQ,CAAC,sBAAsB,WAAW,2BAA2B,CAAC,CAAA;YACtE,OAAM;QACR,CAAC;QAED,sBAAsB,CAAC,WAAW,CAAC,CAAA;QACnC,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAC/B,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,QAAQ,CAAC,UAAU,CAAC,CAAA;QACpB,eAAe,CAAC,IAAI,CAAC,CAAA;QACrB,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAA;IAClC,CAAC,EACD,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,CAAC,CACvC,CAAA;IAED,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,QAAQ,CAAC,YAAY,CAAC,CAAA;IACxB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChB,eAAe,CAAC,IAAI,CAAC,CAAA;QACrB,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAA;IAClC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAA;IAErB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAC1B,sBAAsB,CAAC,IAAI,CAAC,CAAA;QAC5B,QAAQ,CAAC,MAAM,CAAC,CAAA;IAClB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,QAAQ,CAAC,YAAY,CAAC,CAAA;IACxB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC3B,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAA;YACjE,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;YACrD,OAAO,GAAG,EAAE;gBACV,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAA;gBACpE,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;gBACxD,eAAe,CAAC,IAAI,CAAC,CAAA;YACvB,CAAC,CAAA;QACH,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAA;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA;gBAC3B,UAAU,CAAC,OAAO,GAAG,IAAI,CAAA;YAC3B,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO;QACL,KAAK;QACL,iBAAiB;QACjB,mBAAmB;QACnB,KAAK;QACL,eAAe;QACf,cAAc;QACd,cAAc;QACd,cAAc;QACd,QAAQ;KACT,CAAA;AACH,CAAC"}