@embeddables/cli 0.15.0 → 0.15.1-beta.1

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 (143) 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 +37 -3
  4. package/.prompts/short-rule-body.md +2 -2
  5. package/README.md +52 -0
  6. package/dist/cli.js +40 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/build-workbench.d.ts +5 -0
  9. package/dist/commands/build-workbench.d.ts.map +1 -0
  10. package/dist/commands/build-workbench.js +117 -0
  11. package/dist/commands/build-workbench.js.map +1 -0
  12. package/dist/commands/dangerously-publish.d.ts +53 -0
  13. package/dist/commands/dangerously-publish.d.ts.map +1 -0
  14. package/dist/commands/dangerously-publish.js +731 -0
  15. package/dist/commands/dangerously-publish.js.map +1 -0
  16. package/dist/commands/dev.d.ts.map +1 -1
  17. package/dist/commands/dev.js +3 -0
  18. package/dist/commands/dev.js.map +1 -1
  19. package/dist/commands/inspect.d.ts.map +1 -1
  20. package/dist/commands/inspect.js +24 -16
  21. package/dist/commands/inspect.js.map +1 -1
  22. package/dist/commands/pull.d.ts.map +1 -1
  23. package/dist/commands/pull.js +20 -59
  24. package/dist/commands/pull.js.map +1 -1
  25. package/dist/commands/save.js +8 -1
  26. package/dist/commands/save.js.map +1 -1
  27. package/dist/commands/update-project-files.d.ts.map +1 -1
  28. package/dist/commands/update-project-files.js +47 -19
  29. package/dist/commands/update-project-files.js.map +1 -1
  30. package/dist/compiler/errors.d.ts +13 -0
  31. package/dist/compiler/errors.d.ts.map +1 -1
  32. package/dist/compiler/errors.js +16 -0
  33. package/dist/compiler/errors.js.map +1 -1
  34. package/dist/compiler/flatten.js +1 -0
  35. package/dist/compiler/reverse.d.ts.map +1 -1
  36. package/dist/compiler/reverse.js +9 -7
  37. package/dist/compiler/reverse.js.map +1 -1
  38. package/dist/components/primitives/OptionSelector.d.ts +1 -0
  39. package/dist/components/primitives/OptionSelector.d.ts.map +1 -1
  40. package/dist/components/primitives/OptionSelector.js.map +1 -1
  41. package/dist/constants.d.ts +8 -1
  42. package/dist/constants.d.ts.map +1 -1
  43. package/dist/constants.js +10 -3
  44. package/dist/constants.js.map +1 -1
  45. package/dist/helpers/TEMP helpers file.d.ts +1 -0
  46. package/dist/helpers/TEMP helpers file.d.ts.map +1 -0
  47. package/dist/helpers/TEMP helpers file.js +1 -0
  48. package/dist/helpers/reverseCompileWithRetry.d.ts +60 -0
  49. package/dist/helpers/reverseCompileWithRetry.d.ts.map +1 -0
  50. package/dist/helpers/reverseCompileWithRetry.js +96 -0
  51. package/dist/helpers/reverseCompileWithRetry.js.map +1 -0
  52. package/dist/proxy/injectWorkbench.d.ts +4 -0
  53. package/dist/proxy/injectWorkbench.d.ts.map +1 -1
  54. package/dist/proxy/injectWorkbench.js +5 -1
  55. package/dist/proxy/injectWorkbench.js.map +1 -1
  56. package/dist/proxy/server.d.ts +1 -0
  57. package/dist/proxy/server.d.ts.map +1 -1
  58. package/dist/proxy/server.js +12 -0
  59. package/dist/proxy/server.js.map +1 -1
  60. package/dist/types-builder.d.ts +1 -0
  61. package/dist/types-builder.d.ts.map +1 -1
  62. package/dist/workbench/FeedbackPanel.d.ts +43 -0
  63. package/dist/workbench/FeedbackPanel.d.ts.map +1 -0
  64. package/dist/workbench/FeedbackPanel.js +1146 -0
  65. package/dist/workbench/FeedbackPanel.js.map +1 -0
  66. package/dist/workbench/FieldEditorPanel.d.ts.map +1 -1
  67. package/dist/workbench/FieldEditorPanel.js +3 -2
  68. package/dist/workbench/FieldEditorPanel.js.map +1 -1
  69. package/dist/workbench/InspectorPanel.d.ts.map +1 -1
  70. package/dist/workbench/InspectorPanel.js +3 -172
  71. package/dist/workbench/InspectorPanel.js.map +1 -1
  72. package/dist/workbench/MediaLightbox.d.ts +20 -0
  73. package/dist/workbench/MediaLightbox.d.ts.map +1 -0
  74. package/dist/workbench/MediaLightbox.js +76 -0
  75. package/dist/workbench/MediaLightbox.js.map +1 -0
  76. package/dist/workbench/PageThumbnailStrip.d.ts +19 -0
  77. package/dist/workbench/PageThumbnailStrip.d.ts.map +1 -0
  78. package/dist/workbench/PageThumbnailStrip.js +304 -0
  79. package/dist/workbench/PageThumbnailStrip.js.map +1 -0
  80. package/dist/workbench/Toast.d.ts +18 -0
  81. package/dist/workbench/Toast.d.ts.map +1 -0
  82. package/dist/workbench/Toast.js +46 -0
  83. package/dist/workbench/Toast.js.map +1 -0
  84. package/dist/workbench/UserDataPanel.d.ts +2 -1
  85. package/dist/workbench/UserDataPanel.d.ts.map +1 -1
  86. package/dist/workbench/UserDataPanel.js +2 -1
  87. package/dist/workbench/UserDataPanel.js.map +1 -1
  88. package/dist/workbench/WorkbenchApp.d.ts +8 -1
  89. package/dist/workbench/WorkbenchApp.d.ts.map +1 -1
  90. package/dist/workbench/WorkbenchApp.js +32 -7
  91. package/dist/workbench/WorkbenchApp.js.map +1 -1
  92. package/dist/workbench/WorkbenchModalOverlay.d.ts +20 -0
  93. package/dist/workbench/WorkbenchModalOverlay.d.ts.map +1 -0
  94. package/dist/workbench/WorkbenchModalOverlay.js +45 -0
  95. package/dist/workbench/WorkbenchModalOverlay.js.map +1 -0
  96. package/dist/workbench/cloudflare/public/_headers +4 -0
  97. package/dist/workbench/cloudflare/public/workbench.css +2148 -0
  98. package/dist/workbench/cloudflare/public/workbench.js +709 -0
  99. package/dist/workbench/cloudflare/wrangler.jsonc +9 -0
  100. package/dist/workbench/cloudflare-worker/README.md +31 -0
  101. package/dist/workbench/cloudflare-worker/public/workbench.css +1614 -0
  102. package/dist/workbench/cloudflare-worker/public/workbench.js +77 -0
  103. package/dist/workbench/cloudflare-worker/worker.js +40 -0
  104. package/dist/workbench/cloudflare-worker/wrangler.toml +10 -0
  105. package/dist/workbench/conditionEvaluator.d.ts +6 -0
  106. package/dist/workbench/conditionEvaluator.d.ts.map +1 -0
  107. package/dist/workbench/conditionEvaluator.js +111 -0
  108. package/dist/workbench/conditionEvaluator.js.map +1 -0
  109. package/dist/workbench/feedbackSessionsStorage.d.ts +24 -0
  110. package/dist/workbench/feedbackSessionsStorage.d.ts.map +1 -0
  111. package/dist/workbench/feedbackSessionsStorage.js +80 -0
  112. package/dist/workbench/feedbackSessionsStorage.js.map +1 -0
  113. package/dist/workbench/index.d.ts +4 -0
  114. package/dist/workbench/index.d.ts.map +1 -1
  115. package/dist/workbench/index.js +42 -2
  116. package/dist/workbench/index.js.map +1 -1
  117. package/dist/workbench/pageKeyDisplay.d.ts +9 -0
  118. package/dist/workbench/pageKeyDisplay.d.ts.map +1 -0
  119. package/dist/workbench/pageKeyDisplay.js +18 -0
  120. package/dist/workbench/pageKeyDisplay.js.map +1 -0
  121. package/dist/workbench/stringUtils.d.ts +6 -0
  122. package/dist/workbench/stringUtils.d.ts.map +1 -0
  123. package/dist/workbench/stringUtils.js +24 -0
  124. package/dist/workbench/stringUtils.js.map +1 -0
  125. package/dist/workbench/supabase-browser.d.ts +11 -0
  126. package/dist/workbench/supabase-browser.d.ts.map +1 -0
  127. package/dist/workbench/supabase-browser.js +18 -0
  128. package/dist/workbench/supabase-browser.js.map +1 -0
  129. package/dist/workbench/types.d.ts +29 -0
  130. package/dist/workbench/types.d.ts.map +1 -0
  131. package/dist/workbench/types.js +2 -0
  132. package/dist/workbench/types.js.map +1 -0
  133. package/dist/workbench/useComponentSelection.d.ts +27 -0
  134. package/dist/workbench/useComponentSelection.d.ts.map +1 -0
  135. package/dist/workbench/useComponentSelection.js +203 -0
  136. package/dist/workbench/useComponentSelection.js.map +1 -0
  137. package/dist/workbench/workbench.css +2148 -0
  138. package/dist/workbench/workbench.js +709 -0
  139. package/dist/workbench/workbenchShadowPortal.d.ts +4 -0
  140. package/dist/workbench/workbenchShadowPortal.d.ts.map +1 -0
  141. package/dist/workbench/workbenchShadowPortal.js +18 -0
  142. package/dist/workbench/workbenchShadowPortal.js.map +1 -0
  143. package/package.json +6 -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,6 @@
1
+ import type { Condition } from '../types-builder.js';
2
+ export declare function doesElementPassConditions({ conditions, userData, }: {
3
+ conditions?: Condition[];
4
+ userData?: Record<string, unknown>;
5
+ }): boolean;
6
+ //# sourceMappingURL=conditionEvaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditionEvaluator.d.ts","sourceRoot":"","sources":["../../src/workbench/conditionEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,qBAAqB,CAAA;AAqBpE,wBAAgB,yBAAyB,CAAC,EACxC,UAAU,EACV,QAAQ,GACT,EAAE;IACD,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,GAAG,OAAO,CAwGV"}
@@ -0,0 +1,111 @@
1
+ const TRUE = '_true';
2
+ const FALSE = '_false';
3
+ const NO_VALUE = '_no_value';
4
+ function exists(value) {
5
+ return value !== undefined && value !== null;
6
+ }
7
+ function valueMapper(v) {
8
+ switch (v) {
9
+ case TRUE:
10
+ return [true];
11
+ case FALSE:
12
+ return [false];
13
+ default:
14
+ return [v];
15
+ }
16
+ }
17
+ export function doesElementPassConditions({ conditions, userData, }) {
18
+ if (!conditions)
19
+ return true;
20
+ if (!userData)
21
+ return false;
22
+ let conditionsList = conditions;
23
+ if (!Array.isArray(conditionsList))
24
+ conditionsList = [conditionsList];
25
+ let conditionCompliance = true;
26
+ for (let i = 0; i < conditionsList.length; i++) {
27
+ try {
28
+ const condition = conditionsList[i];
29
+ const { key, operator, values } = condition;
30
+ const seenValues = new Set((values || []).reduce((acc, v) => {
31
+ acc.push(...valueMapper(v));
32
+ return acc;
33
+ }, []));
34
+ const valuesInCondition = Array.from(seenValues);
35
+ const selectedValues = userData[key];
36
+ switch (operator) {
37
+ case '==': {
38
+ conditionCompliance = Array.isArray(selectedValues)
39
+ ? valuesInCondition.some((value) => selectedValues.includes(value) ||
40
+ (value === NO_VALUE && selectedValues.some((v) => !exists(v))))
41
+ : (valuesInCondition && valuesInCondition.includes(selectedValues)) ||
42
+ (valuesInCondition.includes(NO_VALUE) && !exists(selectedValues));
43
+ break;
44
+ }
45
+ case '!=': {
46
+ conditionCompliance = Array.isArray(selectedValues)
47
+ ? !valuesInCondition.some((value) => (selectedValues && selectedValues.includes(value)) ||
48
+ (value === NO_VALUE && selectedValues.every((v) => exists(v))))
49
+ : !valuesInCondition ||
50
+ (!valuesInCondition.includes(selectedValues) &&
51
+ (valuesInCondition.includes(NO_VALUE) ? exists(selectedValues) : true));
52
+ break;
53
+ }
54
+ case 'exists': {
55
+ conditionCompliance = Array.isArray(selectedValues)
56
+ ? Boolean(selectedValues.filter(exists).length)
57
+ : exists(selectedValues);
58
+ break;
59
+ }
60
+ case '!exists': {
61
+ conditionCompliance = Array.isArray(selectedValues)
62
+ ? selectedValues.filter(exists).length === 0
63
+ : !exists(selectedValues);
64
+ break;
65
+ }
66
+ case 'is-true': {
67
+ conditionCompliance = selectedValues === true;
68
+ break;
69
+ }
70
+ case 'is-not-true': {
71
+ conditionCompliance = selectedValues !== true;
72
+ break;
73
+ }
74
+ case 'is-false': {
75
+ conditionCompliance = selectedValues === false;
76
+ break;
77
+ }
78
+ case 'is-not-false': {
79
+ conditionCompliance = selectedValues !== false;
80
+ break;
81
+ }
82
+ case 'is-empty': {
83
+ conditionCompliance =
84
+ selectedValues === undefined ||
85
+ selectedValues === null ||
86
+ (Array.isArray(selectedValues) && selectedValues.length === 0) ||
87
+ (typeof selectedValues === 'string' && selectedValues.trim() === '');
88
+ break;
89
+ }
90
+ case 'is-not-empty': {
91
+ conditionCompliance =
92
+ selectedValues !== undefined &&
93
+ selectedValues !== null &&
94
+ ((Array.isArray(selectedValues) && selectedValues.length !== 0) ||
95
+ (typeof selectedValues === 'string' && selectedValues.trim() !== ''));
96
+ break;
97
+ }
98
+ default:
99
+ conditionCompliance = true;
100
+ }
101
+ }
102
+ catch (error) {
103
+ console.error(error);
104
+ conditionCompliance = false;
105
+ }
106
+ if (!conditionCompliance)
107
+ break;
108
+ }
109
+ return conditionCompliance;
110
+ }
111
+ //# sourceMappingURL=conditionEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditionEvaluator.js","sourceRoot":"","sources":["../../src/workbench/conditionEvaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type StoredFeedbackSessionRef = {
2
+ reviewId: string;
3
+ projectId: string;
4
+ embeddableId: string;
5
+ addedAt: string;
6
+ };
7
+ export declare function readMyFeedbackSessionRefs(): StoredFeedbackSessionRef[];
8
+ export declare function readSharedFeedbackSessionRefs(): StoredFeedbackSessionRef[];
9
+ export declare function appendMyFeedbackSession(entry: {
10
+ reviewId: string;
11
+ projectId: string;
12
+ embeddableId: string;
13
+ }): void;
14
+ /** Remove a session from the local "My" list only (does not delete remote storage). */
15
+ export declare function removeMyFeedbackSession(reviewId: string, projectId: string): void;
16
+ export declare function appendSharedFeedbackSession(entry: {
17
+ reviewId: string;
18
+ projectId: string;
19
+ embeddableId: string;
20
+ }): void;
21
+ /** Remove a session from the local "Shared with me" list only (does not delete remote storage). */
22
+ export declare function removeSharedFeedbackSession(reviewId: string, projectId: string): void;
23
+ export declare function openFeedbackSessionInPageUrl(reviewId: string, projectId: string): void;
24
+ //# sourceMappingURL=feedbackSessionsStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedbackSessionsStorage.d.ts","sourceRoot":"","sources":["../../src/workbench/feedbackSessionsStorage.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AA8CD,wBAAgB,yBAAyB,IAAI,wBAAwB,EAAE,CAEtE;AAED,wBAAgB,6BAA6B,IAAI,wBAAwB,EAAE,CAE1E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,IAAI,CAMP;AAED,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAIjF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,IAAI,CAMP;AAED,mGAAmG;AACnG,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAIrF;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAKtF"}
@@ -0,0 +1,80 @@
1
+ const LS_MY = 'embeddables:feedback:sessions:my';
2
+ const LS_SHARED = 'embeddables:feedback:sessions:shared';
3
+ function isValidRef(x) {
4
+ if (!x || typeof x !== 'object')
5
+ return false;
6
+ const o = x;
7
+ return (typeof o.reviewId === 'string' &&
8
+ typeof o.projectId === 'string' &&
9
+ typeof o.embeddableId === 'string' &&
10
+ typeof o.addedAt === 'string');
11
+ }
12
+ function readList(key) {
13
+ try {
14
+ const raw = window.localStorage.getItem(key);
15
+ if (!raw)
16
+ return [];
17
+ const parsed = JSON.parse(raw);
18
+ if (!Array.isArray(parsed))
19
+ return [];
20
+ return parsed.filter(isValidRef);
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ function writeList(key, list) {
27
+ try {
28
+ window.localStorage.setItem(key, JSON.stringify(list));
29
+ }
30
+ catch {
31
+ // ignore quota / private mode
32
+ }
33
+ }
34
+ function refKey(r) {
35
+ return `${r.reviewId}\0${r.projectId}`;
36
+ }
37
+ function upsertFront(list, entry) {
38
+ const k = refKey(entry);
39
+ const filtered = list.filter((r) => refKey(r) !== k);
40
+ return [entry, ...filtered];
41
+ }
42
+ export function readMyFeedbackSessionRefs() {
43
+ return readList(LS_MY);
44
+ }
45
+ export function readSharedFeedbackSessionRefs() {
46
+ return readList(LS_SHARED);
47
+ }
48
+ export function appendMyFeedbackSession(entry) {
49
+ const row = {
50
+ ...entry,
51
+ addedAt: new Date().toISOString(),
52
+ };
53
+ writeList(LS_MY, upsertFront(readList(LS_MY), row));
54
+ }
55
+ /** Remove a session from the local "My" list only (does not delete remote storage). */
56
+ export function removeMyFeedbackSession(reviewId, projectId) {
57
+ const k = refKey({ reviewId, projectId });
58
+ const list = readList(LS_MY).filter((r) => refKey(r) !== k);
59
+ writeList(LS_MY, list);
60
+ }
61
+ export function appendSharedFeedbackSession(entry) {
62
+ const row = {
63
+ ...entry,
64
+ addedAt: new Date().toISOString(),
65
+ };
66
+ writeList(LS_SHARED, upsertFront(readList(LS_SHARED), row));
67
+ }
68
+ /** Remove a session from the local "Shared with me" list only (does not delete remote storage). */
69
+ export function removeSharedFeedbackSession(reviewId, projectId) {
70
+ const k = refKey({ reviewId, projectId });
71
+ const list = readList(LS_SHARED).filter((r) => refKey(r) !== k);
72
+ writeList(LS_SHARED, list);
73
+ }
74
+ export function openFeedbackSessionInPageUrl(reviewId, projectId) {
75
+ const url = new URL(window.location.href);
76
+ url.searchParams.set('feedbackReview', reviewId);
77
+ url.searchParams.set('feedbackProject', projectId);
78
+ window.location.assign(url.toString());
79
+ }
80
+ //# sourceMappingURL=feedbackSessionsStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedbackSessionsStorage.js","sourceRoot":"","sources":["../../src/workbench/feedbackSessionsStorage.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,10 @@ declare global {
3
3
  __embeddables_bootstrap_workbench?: (config: {
4
4
  embeddableId: string;
5
5
  localDev?: boolean;
6
+ openFeedbackTab?: boolean;
7
+ feedbackReviewId?: string;
8
+ feedbackProjectId?: string;
9
+ projectId?: string;
6
10
  }) => void;
7
11
  }
8
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workbench/index.tsx"],"names":[],"mappings":"AAIA,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,iCAAiC,CAAC,EAAE,CAAC,MAAM,EAAE;YAC3C,YAAY,EAAE,MAAM,CAAA;YACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;SACnB,KAAK,IAAI,CAAA;KACX;CACF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workbench/index.tsx"],"names":[],"mappings":"AAKA,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,iCAAiC,CAAC,EAAE,CAAC,MAAM,EAAE;YAC3C,YAAY,EAAE,MAAM,CAAA;YACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;YAClB,eAAe,CAAC,EAAE,OAAO,CAAA;YACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;YACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;YAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;SACnB,KAAK,IAAI,CAAA;KACX;CACF"}
@@ -1,7 +1,30 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createRoot } from 'react-dom/client';
3
3
  import { WorkbenchApp } from './WorkbenchApp.js';
4
+ import { WORKBENCH_SHADOW_PORTAL_ID } from './workbenchShadowPortal.js';
4
5
  let workbenchRoot = null;
6
+ /**
7
+ * Merge `feedbackReview` / `feedbackProject` / `project` / `feedback=true` from the page URL into
8
+ * bootstrap config. The inline `onload` bootstrap only receives injected `__EMBEDDABLES_WORKBENCH`
9
+ * values, so shared links that rely on query params must be merged here or the Feedback tab and
10
+ * props are lost on the second render.
11
+ */
12
+ function mergeFeedbackParamsFromWindow(config) {
13
+ if (typeof window === 'undefined')
14
+ return config;
15
+ const params = new URLSearchParams(window.location.search);
16
+ const feedbackReviewId = config.feedbackReviewId ?? params.get('feedbackReview') ?? undefined;
17
+ const feedbackProjectId = config.feedbackProjectId ?? params.get('feedbackProject') ?? undefined;
18
+ const projectId = config.projectId ?? params.get('project') ?? undefined;
19
+ const openFeedbackTab = config.openFeedbackTab || params.get('feedback') === 'true';
20
+ return {
21
+ ...config,
22
+ feedbackReviewId,
23
+ feedbackProjectId,
24
+ projectId,
25
+ openFeedbackTab,
26
+ };
27
+ }
5
28
  // Derive CSS URL from script's URL so it works when script is loaded from a different origin (e.g. CDN)
6
29
  const scriptEl = typeof document !== 'undefined' ? document.currentScript : null;
7
30
  const WORKBENCH_CSS_URL = scriptEl?.src?.replace(/\.js(\?.*)?$/i, '.css$1') ??
@@ -30,16 +53,33 @@ async function bootstrapWorkbench(config) {
30
53
  });
31
54
  const mountPoint = document.createElement('div');
32
55
  shadowRoot.appendChild(mountPoint);
56
+ const portalMount = document.createElement('div');
57
+ portalMount.id = WORKBENCH_SHADOW_PORTAL_ID;
58
+ shadowRoot.appendChild(portalMount);
33
59
  workbenchRoot = createRoot(mountPoint);
34
60
  }
35
61
  if (workbenchRoot) {
36
- workbenchRoot.render(_jsx(WorkbenchApp, { embeddableId: config.embeddableId, localDev: config.localDev ?? false }));
62
+ const merged = mergeFeedbackParamsFromWindow(config);
63
+ // Open feedback tab when ?feedback=true or ?feedbackReview=id (URL merged above).
64
+ const initialTab = merged.openFeedbackTab || merged.feedbackReviewId
65
+ ? 'feedback'
66
+ : undefined;
67
+ // Shared feedback links include both IDs — expand the workbench so Feedback mode is visible.
68
+ const initialExpanded = !!(merged.feedbackReviewId && merged.feedbackProjectId);
69
+ workbenchRoot.render(_jsx(WorkbenchApp, { embeddableId: merged.embeddableId, localDev: merged.localDev ?? false, initialTab: initialTab, initialExpanded: initialExpanded, feedbackReviewId: merged.feedbackReviewId, feedbackProjectId: merged.feedbackProjectId, projectId: merged.projectId }));
37
70
  }
38
71
  }
39
72
  window.__embeddables_bootstrap_workbench = bootstrapWorkbench;
40
73
  // Auto-bootstrap if config is already available (fallback if onload handler doesn't fire)
41
74
  if (typeof window !== 'undefined' && window.__EMBEDDABLES_WORKBENCH?.embeddableId) {
42
75
  const config = window.__EMBEDDABLES_WORKBENCH;
43
- bootstrapWorkbench({ embeddableId: config.embeddableId, localDev: config.localDev });
76
+ bootstrapWorkbench(mergeFeedbackParamsFromWindow({
77
+ embeddableId: config.embeddableId,
78
+ localDev: config.localDev,
79
+ openFeedbackTab: config.openFeedbackTab,
80
+ feedbackReviewId: config.feedbackReviewId,
81
+ feedbackProjectId: config.feedbackProjectId,
82
+ projectId: config.projectId,
83
+ }));
44
84
  }
45
85
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workbench/index.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAWhD,IAAI,aAAa,GAAyC,IAAI,CAAA;AAE9D,wGAAwG;AACxG,MAAM,QAAQ,GACZ,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAE,QAAQ,CAAC,aAA0C,CAAC,CAAC,CAAC,IAAI,CAAA;AAC/F,MAAM,iBAAiB,GACrB,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC;IACjD,IAAI,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAA;AAEtE,KAAK,UAAU,kBAAkB,CAAC,MAAoD;IACpF,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAA;IAC3E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;QAClD,OAAM;IACR,CAAC;IAED,IAAI,UAAU,GAAG,WAAW,CAAC,UAAU,CAAA;IACvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAEvD,MAAM,MAAM,GAAG,iBAAiB,CAAA;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAC3C,IAAI,CAAC,GAAG,GAAG,YAAY,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAA;QAClB,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAE5B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,CAAA;gBACT,OAAM;YACR,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YAC7B,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;QAChC,CAAC,CAAC,CAAA;QAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAChD,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;QAElC,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,MAAM,CAClB,KAAC,YAAY,IAAC,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK,GAAI,CACxF,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,iCAAiC,GAAG,kBAAkB,CAAA;AAE7D,0FAA0F;AAC1F,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,uBAAuB,EAAE,YAAY,EAAE,CAAC;IAC3F,MAAM,MAAM,GAAI,MAAc,CAAC,uBAAuB,CAAA;IACtD,kBAAkB,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;AACtF,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workbench/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Formats a long page key for compact UI: show start and end with an ellipsis in the middle
3
+ * (e.g. `authed_heal…_micro` instead of only truncating the tail).
4
+ */
5
+ export declare function formatPageKeyMiddleEllipsis({ key, maxChars, }: {
6
+ key: string;
7
+ maxChars: number;
8
+ }): string;
9
+ //# sourceMappingURL=pageKeyDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageKeyDisplay.d.ts","sourceRoot":"","sources":["../../src/workbench/pageKeyDisplay.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,GAAG,EACH,QAAQ,GACT,EAAE;IACD,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;CACjB,GAAG,MAAM,CAYT"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Formats a long page key for compact UI: show start and end with an ellipsis in the middle
3
+ * (e.g. `authed_heal…_micro` instead of only truncating the tail).
4
+ */
5
+ export function formatPageKeyMiddleEllipsis({ key, maxChars, }) {
6
+ if (maxChars < 5) {
7
+ return key.slice(0, Math.max(0, maxChars));
8
+ }
9
+ if (key.length <= maxChars) {
10
+ return key;
11
+ }
12
+ const ellipsis = '…';
13
+ const inner = maxChars - ellipsis.length;
14
+ const leftLen = Math.ceil(inner / 2);
15
+ const rightLen = Math.floor(inner / 2);
16
+ return key.slice(0, leftLen) + ellipsis + key.slice(-rightLen);
17
+ }
18
+ //# sourceMappingURL=pageKeyDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageKeyDisplay.js","sourceRoot":"","sources":["../../src/workbench/pageKeyDisplay.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,EAC1C,GAAG,EACH,QAAQ,GAIT;IACC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC5C,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAA;IACpB,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAA;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IACtC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAA;AAChE,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Format a component type for display: PascalCase → Title Case.
3
+ * Spaced phrases (e.g. "Multiple Types") are normalized to title case per word.
4
+ */
5
+ export declare function pascalCaseToTitleCase(raw: string): string;
6
+ //# sourceMappingURL=stringUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringUtils.d.ts","sourceRoot":"","sources":["../../src/workbench/stringUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBzD"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Format a component type for display: PascalCase → Title Case.
3
+ * Spaced phrases (e.g. "Multiple Types") are normalized to title case per word.
4
+ */
5
+ export function pascalCaseToTitleCase(raw) {
6
+ const s = raw.trim();
7
+ if (!s)
8
+ return s;
9
+ if (/\s/.test(s)) {
10
+ return s
11
+ .split(/\s+/)
12
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
13
+ .join(' ');
14
+ }
15
+ const spaced = s
16
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
17
+ .replace(/([a-z\d])([A-Z])/g, '$1 $2');
18
+ return spaced
19
+ .split(/\s+/)
20
+ .filter(Boolean)
21
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
22
+ .join(' ');
23
+ }
24
+ //# sourceMappingURL=stringUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringUtils.js","sourceRoot":"","sources":["../../src/workbench/stringUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACpB,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAChB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC;aACL,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAChE,IAAI,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IACD,MAAM,MAAM,GAAG,CAAC;SACb,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;IACxC,OAAO,MAAM;SACV,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAChE,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC"}
@@ -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,29 @@
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
+ hide?: boolean;
25
+ hasConditions?: boolean;
26
+ hasExperimentConditions?: boolean;
27
+ passesConditions?: boolean;
28
+ };
29
+ //# 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;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,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"}