@superblocksteam/library 2.0.55 → 2.0.56-next.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.
- package/dist/{build-manifest-BNJahcH4.js → build-manifest-DZwcz6uX.js} +1 -1
- package/dist/{build-manifest-BNJahcH4.js.map → build-manifest-DZwcz6uX.js.map} +1 -1
- package/dist/{devtools-consolidated-BJ2tPWBk.js → devtools-consolidated-Dm9AFGZs.js} +2 -2
- package/dist/{devtools-consolidated-BJ2tPWBk.js.map → devtools-consolidated-Dm9AFGZs.js.map} +1 -1
- package/dist/{early-console-buffer-Bd5jqqBJ.js → early-console-buffer-SSPd-jq2.js} +1 -1
- package/dist/{early-console-buffer-Bd5jqqBJ.js.map → early-console-buffer-SSPd-jq2.js.map} +1 -1
- package/dist/jsx-dev-runtime/index.d.ts +14 -0
- package/dist/jsx-dev-runtime/index.d.ts.map +1 -0
- package/dist/jsx-dev-runtime/index.js +329 -0
- package/dist/jsx-dev-runtime/index.js.map +1 -0
- package/dist/jsx-runtime/index.d.ts +7 -0
- package/dist/jsx-runtime/index.d.ts.map +1 -0
- package/dist/jsx-runtime/index.js +10 -0
- package/dist/jsx-runtime/index.js.map +1 -0
- package/dist/{index.css → lib/index.css} +17 -11
- package/dist/lib/index.css.map +1 -0
- package/dist/lib/index.d.ts +786 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +5007 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/{logs-BA3qqo2m.js → logs-CgCPS9qr.js} +2 -2
- package/dist/{logs-BA3qqo2m.js.map → logs-CgCPS9qr.js.map} +1 -1
- package/dist/{utils-xmrGF_mk.js → utils-AzBGeVXo.js} +1 -1
- package/dist/{utils-xmrGF_mk.js.map → utils-AzBGeVXo.js.map} +1 -1
- package/dist/utils-DR35eYvX.js +3 -0
- package/dist/widget-wrapper-naming-DxFT8zmk.js +3068 -0
- package/dist/widget-wrapper-naming-DxFT8zmk.js.map +1 -0
- package/package.json +27 -14
- package/dist/index.css.map +0 -1
- package/dist/index.d.ts +0 -1339
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -11471
- package/dist/index.js.map +0 -1
- package/dist/root-store-Cc3dO2jP.js +0 -4721
- package/dist/root-store-Cc3dO2jP.js.map +0 -1
- package/dist/root-store-xviorlO5.js +0 -4
- package/dist/utils-BVE4VhSk.js +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-manifest-
|
|
1
|
+
{"version":3,"file":"build-manifest-DZwcz6uX.js","names":[],"sources":["../src/lib/user-facing/build-manifest.js"],"sourcesContent":["// This is a placeholder file that is replaced with the actual build manifest during the build process\n// This stub will be used primarily in tests and for the dev server\nexport default {};\n"],"mappings":";AAEA,6BAAe,EAAE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useCallback, useEffect } from "react";
|
|
2
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
2
|
import { makeAutoObservable, toJS } from "mobx";
|
|
3
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { observer } from "mobx-react-lite";
|
|
5
5
|
import { createPortal } from "react-dom";
|
|
6
6
|
import { JsonView } from "react-json-view-lite";
|
|
@@ -209,4 +209,4 @@ function initializeCustomDevTools() {
|
|
|
209
209
|
|
|
210
210
|
//#endregion
|
|
211
211
|
export { CustomDevTools, initializeCustomDevTools, setRegisteredStores };
|
|
212
|
-
//# sourceMappingURL=devtools-consolidated-
|
|
212
|
+
//# sourceMappingURL=devtools-consolidated-Dm9AFGZs.js.map
|
package/dist/{devtools-consolidated-BJ2tPWBk.js.map → devtools-consolidated-Dm9AFGZs.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools-consolidated-BJ2tPWBk.js","names":["result: any","registeredStores: Record<string, any>","overlayStyles: React.CSSProperties","panelStyles: React.CSSProperties","headerStyles: React.CSSProperties","closeButtonStyles: React.CSSProperties","contentStyles: React.CSSProperties","DevToolsPanelContent: React.FC","CustomDevTools: React.FC"],"sources":["../src/lib/internal-details/lib/devtools/serialize-store-data.tsx","../src/lib/internal-details/lib/devtools/devtools-consolidated.tsx"],"sourcesContent":["import { toJS } from \"mobx\";\n\nexport function serializeStoreData(\n stores_: Record<string, any>,\n): Record<string, any> {\n try {\n const stores = toJS(stores_);\n const seen = new Set();\n function serialize(obj: any): any {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (seen.has(obj)) {\n return \"[Already Seen]\";\n }\n\n // Create new path for this branch of recursion\n seen.add(obj);\n\n if (Array.isArray(obj)) {\n return obj.map(serialize);\n }\n\n const result: any = {};\n\n for (const key of Object.keys(obj)) {\n if (typeof obj[key] === \"function\") {\n result[key] = \"[Function]\";\n }\n\n try {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n if (descriptor && descriptor.get) {\n try {\n result[key] = serialize(obj[key]);\n } catch {\n result[key] = \"[Getter Error]\";\n }\n } else {\n result[key] = serialize(obj[key]);\n }\n } catch {\n result[key] = \"[Access Error]\";\n }\n }\n\n // Add type information\n if (obj.constructor && obj.constructor.name !== \"Object\") {\n result.__type__ = obj.constructor.name;\n }\n\n return result;\n }\n\n return serialize(stores);\n } catch (error) {\n return {\n error: `Error serializing data: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n };\n }\n}\n","import { makeAutoObservable } from \"mobx\";\nimport { observer } from \"mobx-react-lite\";\nimport React, { useCallback, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { JsonView } from \"react-json-view-lite\";\nimport \"react-json-view-lite/dist/index.css\";\nimport { serializeStoreData } from \"./serialize-store-data.js\";\n\n// ============================================================================\n// STATE MANAGEMENT\n// ============================================================================\n\nclass DevToolsState {\n isVisible = false;\n\n constructor() {\n makeAutoObservable(this);\n }\n\n show() {\n this.isVisible = true;\n }\n\n hide() {\n this.isVisible = false;\n }\n\n toggle() {\n this.isVisible = !this.isVisible;\n }\n}\n\nconst devToolsState = new DevToolsState();\n\n// ============================================================================\n// KEYBOARD SHORTCUT MANAGER\n// ============================================================================\n\nclass KeyboardShortcutManager {\n private isListening = false;\n private shortcutKeys = {\n key: \"KeyD\",\n ctrlKey: true,\n shiftKey: true,\n altKey: false,\n };\n\n constructor() {\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n const { ctrlKey, shiftKey, altKey, metaKey } = event;\n const isModifierMatch = (ctrlKey || metaKey) && shiftKey && !altKey;\n const isKeyMatch = event.code === this.shortcutKeys.key;\n if (isModifierMatch && isKeyMatch) {\n event.preventDefault();\n event.stopPropagation();\n devToolsState.toggle();\n }\n }\n\n private handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && devToolsState.isVisible) {\n event.preventDefault();\n devToolsState.hide();\n }\n };\n\n startListening() {\n if (this.isListening) return;\n\n this.isListening = true;\n document.addEventListener(\"keydown\", this.handleKeyDown, true);\n document.addEventListener(\"keydown\", this.handleEscapeKey, true);\n }\n\n stopListening() {\n if (!this.isListening) return;\n\n this.isListening = false;\n document.removeEventListener(\"keydown\", this.handleKeyDown, true);\n document.removeEventListener(\"keydown\", this.handleEscapeKey, true);\n }\n\n updateShortcut(options: Partial<typeof this.shortcutKeys>) {\n this.shortcutKeys = { ...this.shortcutKeys, ...options };\n }\n}\n\nconst keyboardShortcutManager = new KeyboardShortcutManager();\n\n// ============================================================================\n// STORE ACCESS\n// ============================================================================\n\n// This will be populated by the registerStores function\nlet registeredStores: Record<string, any> = {};\n\nexport function setRegisteredStores(stores: Record<string, any>) {\n registeredStores = stores;\n}\n\nfunction getRegisteredStores() {\n return registeredStores;\n}\n\n// ============================================================================\n// DEVTOOLS PANEL COMPONENT\n// ============================================================================\n\nconst overlayStyles: React.CSSProperties = {\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n zIndex: 9999,\n};\n\nconst panelStyles: React.CSSProperties = {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"90vw\",\n height: \"90vh\",\n backgroundColor: \"#fff\",\n zIndex: 10000,\n display: \"flex\",\n flexDirection: \"column\",\n borderRadius: 12,\n};\n\nconst headerStyles: React.CSSProperties = {\n padding: 12,\n borderBottom: \"1px solid #ccc\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n};\n\nconst closeButtonStyles: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n};\n\nconst contentStyles: React.CSSProperties = {\n padding: 8,\n display: \"flex\",\n flex: 1,\n overflow: \"auto\",\n flexDirection: \"column\",\n};\n\nconst DevToolsPanelContent: React.FC = observer(() => {\n const stores = getRegisteredStores();\n const storeNames = Object.keys(stores);\n\n const serializedData = serializeStoreData(stores);\n const onClose = useCallback(() => {\n devToolsState.hide();\n }, []);\n\n return createPortal(\n <>\n <div style={overlayStyles} onClick={onClose} />\n <div style={panelStyles}>\n <div style={headerStyles}>\n <h3>\n MobX DevTools ({storeNames.length} store\n {storeNames.length !== 1 ? \"s\" : \"\"})\n </h3>\n <button\n style={closeButtonStyles}\n onClick={onClose}\n title=\"Close (ESC)\"\n >\n ×\n </button>\n </div>\n {storeNames.length === 0 ? (\n <div>No stores registered yet.</div>\n ) : (\n <div style={contentStyles}>\n <JsonView\n data={serializedData}\n clickToExpandNode={true}\n shouldExpandNode={(level) => level < 2}\n />\n </div>\n )}\n </div>\n </>,\n document.body,\n );\n});\n\n// ============================================================================\n// PROVIDER COMPONENT\n// ============================================================================\n\nexport const CustomDevTools: React.FC = observer(() => {\n useEffect(() => {\n if (devToolsState.isVisible) {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n devToolsState.hide();\n }\n };\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }\n }, []);\n\n if (!devToolsState.isVisible) {\n return null;\n }\n\n return <DevToolsPanelContent />;\n});\n\n// ============================================================================\n// INITIALIZATION\n// ============================================================================\n\nexport function initializeCustomDevTools() {\n keyboardShortcutManager.startListening();\n console.log(\n \"[CustomDevTools] Initialized - Press Ctrl+Shift+D (or Cmd+Shift+D) to open\",\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"devtools-consolidated-Dm9AFGZs.js","names":["result: any","registeredStores: Record<string, any>","overlayStyles: React.CSSProperties","panelStyles: React.CSSProperties","headerStyles: React.CSSProperties","closeButtonStyles: React.CSSProperties","contentStyles: React.CSSProperties","DevToolsPanelContent: React.FC","CustomDevTools: React.FC"],"sources":["../src/lib/internal-details/lib/devtools/serialize-store-data.tsx","../src/lib/internal-details/lib/devtools/devtools-consolidated.tsx"],"sourcesContent":["import { toJS } from \"mobx\";\n\nexport function serializeStoreData(\n stores_: Record<string, any>,\n): Record<string, any> {\n try {\n const stores = toJS(stores_);\n const seen = new Set();\n function serialize(obj: any): any {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (seen.has(obj)) {\n return \"[Already Seen]\";\n }\n\n // Create new path for this branch of recursion\n seen.add(obj);\n\n if (Array.isArray(obj)) {\n return obj.map(serialize);\n }\n\n const result: any = {};\n\n for (const key of Object.keys(obj)) {\n if (typeof obj[key] === \"function\") {\n result[key] = \"[Function]\";\n }\n\n try {\n const descriptor = Object.getOwnPropertyDescriptor(obj, key);\n if (descriptor && descriptor.get) {\n try {\n result[key] = serialize(obj[key]);\n } catch {\n result[key] = \"[Getter Error]\";\n }\n } else {\n result[key] = serialize(obj[key]);\n }\n } catch {\n result[key] = \"[Access Error]\";\n }\n }\n\n // Add type information\n if (obj.constructor && obj.constructor.name !== \"Object\") {\n result.__type__ = obj.constructor.name;\n }\n\n return result;\n }\n\n return serialize(stores);\n } catch (error) {\n return {\n error: `Error serializing data: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n };\n }\n}\n","import { makeAutoObservable } from \"mobx\";\nimport { observer } from \"mobx-react-lite\";\nimport React, { useCallback, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { JsonView } from \"react-json-view-lite\";\nimport \"react-json-view-lite/dist/index.css\";\nimport { serializeStoreData } from \"./serialize-store-data.js\";\n\n// ============================================================================\n// STATE MANAGEMENT\n// ============================================================================\n\nclass DevToolsState {\n isVisible = false;\n\n constructor() {\n makeAutoObservable(this);\n }\n\n show() {\n this.isVisible = true;\n }\n\n hide() {\n this.isVisible = false;\n }\n\n toggle() {\n this.isVisible = !this.isVisible;\n }\n}\n\nconst devToolsState = new DevToolsState();\n\n// ============================================================================\n// KEYBOARD SHORTCUT MANAGER\n// ============================================================================\n\nclass KeyboardShortcutManager {\n private isListening = false;\n private shortcutKeys = {\n key: \"KeyD\",\n ctrlKey: true,\n shiftKey: true,\n altKey: false,\n };\n\n constructor() {\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n const { ctrlKey, shiftKey, altKey, metaKey } = event;\n const isModifierMatch = (ctrlKey || metaKey) && shiftKey && !altKey;\n const isKeyMatch = event.code === this.shortcutKeys.key;\n if (isModifierMatch && isKeyMatch) {\n event.preventDefault();\n event.stopPropagation();\n devToolsState.toggle();\n }\n }\n\n private handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && devToolsState.isVisible) {\n event.preventDefault();\n devToolsState.hide();\n }\n };\n\n startListening() {\n if (this.isListening) return;\n\n this.isListening = true;\n document.addEventListener(\"keydown\", this.handleKeyDown, true);\n document.addEventListener(\"keydown\", this.handleEscapeKey, true);\n }\n\n stopListening() {\n if (!this.isListening) return;\n\n this.isListening = false;\n document.removeEventListener(\"keydown\", this.handleKeyDown, true);\n document.removeEventListener(\"keydown\", this.handleEscapeKey, true);\n }\n\n updateShortcut(options: Partial<typeof this.shortcutKeys>) {\n this.shortcutKeys = { ...this.shortcutKeys, ...options };\n }\n}\n\nconst keyboardShortcutManager = new KeyboardShortcutManager();\n\n// ============================================================================\n// STORE ACCESS\n// ============================================================================\n\n// This will be populated by the registerStores function\nlet registeredStores: Record<string, any> = {};\n\nexport function setRegisteredStores(stores: Record<string, any>) {\n registeredStores = stores;\n}\n\nfunction getRegisteredStores() {\n return registeredStores;\n}\n\n// ============================================================================\n// DEVTOOLS PANEL COMPONENT\n// ============================================================================\n\nconst overlayStyles: React.CSSProperties = {\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n zIndex: 9999,\n};\n\nconst panelStyles: React.CSSProperties = {\n position: \"fixed\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"90vw\",\n height: \"90vh\",\n backgroundColor: \"#fff\",\n zIndex: 10000,\n display: \"flex\",\n flexDirection: \"column\",\n borderRadius: 12,\n};\n\nconst headerStyles: React.CSSProperties = {\n padding: 12,\n borderBottom: \"1px solid #ccc\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n};\n\nconst closeButtonStyles: React.CSSProperties = {\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n};\n\nconst contentStyles: React.CSSProperties = {\n padding: 8,\n display: \"flex\",\n flex: 1,\n overflow: \"auto\",\n flexDirection: \"column\",\n};\n\nconst DevToolsPanelContent: React.FC = observer(() => {\n const stores = getRegisteredStores();\n const storeNames = Object.keys(stores);\n\n const serializedData = serializeStoreData(stores);\n const onClose = useCallback(() => {\n devToolsState.hide();\n }, []);\n\n return createPortal(\n <>\n <div style={overlayStyles} onClick={onClose} />\n <div style={panelStyles}>\n <div style={headerStyles}>\n <h3>\n MobX DevTools ({storeNames.length} store\n {storeNames.length !== 1 ? \"s\" : \"\"})\n </h3>\n <button\n style={closeButtonStyles}\n onClick={onClose}\n title=\"Close (ESC)\"\n >\n ×\n </button>\n </div>\n {storeNames.length === 0 ? (\n <div>No stores registered yet.</div>\n ) : (\n <div style={contentStyles}>\n <JsonView\n data={serializedData}\n clickToExpandNode={true}\n shouldExpandNode={(level) => level < 2}\n />\n </div>\n )}\n </div>\n </>,\n document.body,\n );\n});\n\n// ============================================================================\n// PROVIDER COMPONENT\n// ============================================================================\n\nexport const CustomDevTools: React.FC = observer(() => {\n useEffect(() => {\n if (devToolsState.isVisible) {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n devToolsState.hide();\n }\n };\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }\n }, []);\n\n if (!devToolsState.isVisible) {\n return null;\n }\n\n return <DevToolsPanelContent />;\n});\n\n// ============================================================================\n// INITIALIZATION\n// ============================================================================\n\nexport function initializeCustomDevTools() {\n keyboardShortcutManager.startListening();\n console.log(\n \"[CustomDevTools] Initialized - Press Ctrl+Shift+D (or Cmd+Shift+D) to open\",\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"early-console-buffer-
|
|
1
|
+
{"version":3,"file":"early-console-buffer-SSPd-jq2.js","names":[],"sources":["../src/lib/tracing/early-console-buffer.ts"],"sourcesContent":["import { SeverityNumber } from \"@opentelemetry/api-logs\";\nimport type { Logger as OTelLogger } from \"@opentelemetry/api-logs\";\n\ninterface LogEntry {\n level: \"log\" | \"info\" | \"warn\" | \"error\" | \"debug\";\n args: any[];\n timestamp: number;\n}\n\nclass LibraryEarlyConsoleBuffer {\n private static instance: LibraryEarlyConsoleBuffer;\n private buffer: LogEntry[] = [];\n private maxBufferSize = 1000;\n private originalMethods: Record<string, (...args: any[]) => void> = {};\n private otelLogger?: OTelLogger = undefined;\n private isPatched = false;\n\n static getInstance(): LibraryEarlyConsoleBuffer {\n if (!LibraryEarlyConsoleBuffer.instance) {\n LibraryEarlyConsoleBuffer.instance = new LibraryEarlyConsoleBuffer();\n }\n return LibraryEarlyConsoleBuffer.instance;\n }\n\n // Patch console methods immediately with buffering\n patchEarly(): void {\n if (this.isPatched) return;\n\n // Store original methods\n this.originalMethods.log = console.log.bind(console);\n this.originalMethods.info = console.info.bind(console);\n this.originalMethods.debug = console.debug.bind(console);\n this.originalMethods.warn = console.warn.bind(console);\n this.originalMethods.error = console.error.bind(console);\n\n // Replace with buffering versions\n this.patchMethod(\"log\");\n this.patchMethod(\"info\");\n this.patchMethod(\"debug\");\n this.patchMethod(\"warn\");\n this.patchMethod(\"error\");\n\n this.isPatched = true;\n }\n\n private patchMethod(level: string): void {\n const originalMethod = this.originalMethods[level];\n\n (console as any)[level] = (...args: any[]) => {\n // Always call original method for dev experience\n originalMethod(...args);\n\n // Buffer for OpenTelemetry\n this.bufferLog(level as any, args);\n\n // Send to OpenTelemetry if available\n if (this.otelLogger) {\n this.sendToOpenTelemetry(level as any, args);\n }\n };\n }\n\n private bufferLog(level: LogEntry[\"level\"], args: any[]): void {\n if (this.buffer.length >= this.maxBufferSize) {\n this.buffer.shift(); // Remove oldest entry\n }\n\n this.buffer.push({\n level,\n args,\n timestamp: Date.now(),\n });\n }\n\n enableOpenTelemetry(otelLogger: OTelLogger): void {\n console.info(\"[EarlyConsoleBuffer] Enabling OpenTelemetry integration\");\n this.otelLogger = otelLogger;\n this.flushBuffer();\n }\n\n private flushBuffer(): void {\n if (!this.otelLogger) return;\n\n const bufferCount = this.buffer.length;\n if (bufferCount === 0) {\n console.info(\"[EarlyConsoleBuffer] No buffered logs to flush\");\n return;\n }\n\n console.info(\n `[EarlyConsoleBuffer] Flushing ${bufferCount} buffered logs to OpenTelemetry`,\n );\n\n this.buffer.forEach((entry) => {\n this.sendToOpenTelemetry(entry.level, entry.args, entry.timestamp, true); // true = from buffer\n });\n\n this.buffer = []; // Clear buffer\n console.info(\n `[EarlyConsoleBuffer] Successfully sent ${bufferCount} buffered logs to OpenTelemetry logger`,\n );\n }\n\n private sendToOpenTelemetry(\n level: LogEntry[\"level\"],\n args: any[],\n timestamp?: number,\n fromBuffer?: boolean,\n ): void {\n if (!this.otelLogger) return;\n\n const severityMap = {\n debug: SeverityNumber.DEBUG,\n log: SeverityNumber.INFO,\n info: SeverityNumber.INFO,\n warn: SeverityNumber.WARN,\n error: SeverityNumber.ERROR,\n };\n\n // Only add 'source' attribute if this log came from the buffer flush\n const attributes = {\n ...(fromBuffer && { source: \"early-console-buffer\" }),\n };\n\n this.otelLogger.emit({\n severityNumber: severityMap[level],\n severityText: level,\n body: this.formatConsoleArgs(args),\n timestamp: timestamp,\n attributes,\n });\n }\n\n private formatConsoleArgs(args: any[]): string {\n return args\n .map((arg) => {\n if (typeof arg === \"string\") return arg;\n if (arg === null) return \"null\";\n if (arg === undefined) return \"undefined\";\n if (typeof arg === \"object\") {\n try {\n return JSON.stringify(arg, null, 2);\n } catch {\n return \"[object Object]\";\n }\n }\n return String(arg);\n })\n .join(\" \");\n }\n\n // Method to check if we have buffered logs (for testing/debugging)\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n // Method to check if console is patched (for testing/debugging)\n isConsolePatched(): boolean {\n return this.isPatched;\n }\n\n // Method to check if OpenTelemetry is enabled (for testing/debugging)\n isOpenTelemetryEnabled(): boolean {\n return this.otelLogger !== undefined;\n }\n}\n\nexport default LibraryEarlyConsoleBuffer;\n"],"mappings":";;;AASA,IAAM,4BAAN,MAAM,0BAA0B;CAC9B,OAAe;CACf,AAAQ,SAAqB,EAAE;CAC/B,AAAQ,gBAAgB;CACxB,AAAQ,kBAA4D,EAAE;CACtE,AAAQ,aAA0B;CAClC,AAAQ,YAAY;CAEpB,OAAO,cAAyC;AAC9C,MAAI,CAAC,0BAA0B,SAC7B,2BAA0B,WAAW,IAAI,2BAA2B;AAEtE,SAAO,0BAA0B;;CAInC,aAAmB;AACjB,MAAI,KAAK,UAAW;AAGpB,OAAK,gBAAgB,MAAM,QAAQ,IAAI,KAAK,QAAQ;AACpD,OAAK,gBAAgB,OAAO,QAAQ,KAAK,KAAK,QAAQ;AACtD,OAAK,gBAAgB,QAAQ,QAAQ,MAAM,KAAK,QAAQ;AACxD,OAAK,gBAAgB,OAAO,QAAQ,KAAK,KAAK,QAAQ;AACtD,OAAK,gBAAgB,QAAQ,QAAQ,MAAM,KAAK,QAAQ;AAGxD,OAAK,YAAY,MAAM;AACvB,OAAK,YAAY,OAAO;AACxB,OAAK,YAAY,QAAQ;AACzB,OAAK,YAAY,OAAO;AACxB,OAAK,YAAY,QAAQ;AAEzB,OAAK,YAAY;;CAGnB,AAAQ,YAAY,OAAqB;EACvC,MAAM,iBAAiB,KAAK,gBAAgB;AAE5C,EAAC,QAAgB,UAAU,GAAG,SAAgB;AAE5C,kBAAe,GAAG,KAAK;AAGvB,QAAK,UAAU,OAAc,KAAK;AAGlC,OAAI,KAAK,WACP,MAAK,oBAAoB,OAAc,KAAK;;;CAKlD,AAAQ,UAAU,OAA0B,MAAmB;AAC7D,MAAI,KAAK,OAAO,UAAU,KAAK,cAC7B,MAAK,OAAO,OAAO;AAGrB,OAAK,OAAO,KAAK;GACf;GACA;GACA,WAAW,KAAK,KAAK;GACtB,CAAC;;CAGJ,oBAAoB,YAA8B;AAChD,UAAQ,KAAK,0DAA0D;AACvE,OAAK,aAAa;AAClB,OAAK,aAAa;;CAGpB,AAAQ,cAAoB;AAC1B,MAAI,CAAC,KAAK,WAAY;EAEtB,MAAM,cAAc,KAAK,OAAO;AAChC,MAAI,gBAAgB,GAAG;AACrB,WAAQ,KAAK,iDAAiD;AAC9D;;AAGF,UAAQ,KACN,iCAAiC,YAAY,iCAC9C;AAED,OAAK,OAAO,SAAS,UAAU;AAC7B,QAAK,oBAAoB,MAAM,OAAO,MAAM,MAAM,MAAM,WAAW,KAAK;IACxE;AAEF,OAAK,SAAS,EAAE;AAChB,UAAQ,KACN,0CAA0C,YAAY,wCACvD;;CAGH,AAAQ,oBACN,OACA,MACA,WACA,YACM;AACN,MAAI,CAAC,KAAK,WAAY;EAEtB,MAAM,cAAc;GAClB,OAAO,eAAe;GACtB,KAAK,eAAe;GACpB,MAAM,eAAe;GACrB,MAAM,eAAe;GACrB,OAAO,eAAe;GACvB;EAGD,MAAM,aAAa,EACjB,GAAI,cAAc,EAAE,QAAQ,wBAAwB,EACrD;AAED,OAAK,WAAW,KAAK;GACnB,gBAAgB,YAAY;GAC5B,cAAc;GACd,MAAM,KAAK,kBAAkB,KAAK;GACvB;GACX;GACD,CAAC;;CAGJ,AAAQ,kBAAkB,MAAqB;AAC7C,SAAO,KACJ,KAAK,QAAQ;AACZ,OAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,OAAI,QAAQ,KAAM,QAAO;AACzB,OAAI,QAAQ,OAAW,QAAO;AAC9B,OAAI,OAAO,QAAQ,SACjB,KAAI;AACF,WAAO,KAAK,UAAU,KAAK,MAAM,EAAE;WAC7B;AACN,WAAO;;AAGX,UAAO,OAAO,IAAI;IAClB,CACD,KAAK,IAAI;;CAId,gBAAwB;AACtB,SAAO,KAAK,OAAO;;CAIrB,mBAA4B;AAC1B,SAAO,KAAK;;CAId,yBAAkC;AAChC,SAAO,KAAK,eAAe;;;AAI/B,mCAAe"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/jsx-dev-runtime/jsx-dev-runtime.d.ts
|
|
2
|
+
declare global {
|
|
3
|
+
interface Window {
|
|
4
|
+
__SUPERBLOCKS_EDIT_MODE__?: boolean;
|
|
5
|
+
_SB_VIEW_MODE?: string;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
declare function jsxDEV(type: any, props: any, key: any, isStaticChildren: any, source: any, self: any): any;
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region src/jsx-dev-runtime/index.d.ts
|
|
11
|
+
declare const Fragment: any;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { Fragment, jsxDEV };
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/jsx-dev-runtime/jsx-dev-runtime.ts","../../src/jsx-dev-runtime/index.ts"],"sourcesContent":[],"mappings":";;;IAiEgB,yBAAM,CAAA,EAAA,OAAA;;;;AC/DT,iBD+DG,MAAA,CC/D4C,IAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,gBAAA,EAAA,GAAA,EAAA,MAAA,EAAA,GAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA,GAAA;;;cAA/C"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { C as generateId, L as isEditMode$1, M as colors, N as editorBridge, g as root_store_default, m as SecondaryButton, r as FixWithClarkButton, t as getWidgetAnchorName } from "../widget-wrapper-naming-DxFT8zmk.js";
|
|
2
|
+
import "../utils-AzBGeVXo.js";
|
|
3
|
+
import * as ReactJsxDevRuntime from "react/jsx-dev-runtime";
|
|
4
|
+
import { NO_SELECT_ATTRIBUTE, SELECTOR_ID_ATTRIBUTE, SOURCE_ID_ATTRIBUTE } from "@superblocksteam/library-shared";
|
|
5
|
+
import React, { Component, useEffect, useMemo, useRef } from "react";
|
|
6
|
+
import { reaction } from "mobx";
|
|
7
|
+
import styled, { keyframes } from "styled-components";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { Observer } from "mobx-react-lite";
|
|
10
|
+
import polyfill from "@oddbird/css-anchor-positioning/fn";
|
|
11
|
+
|
|
12
|
+
//#region src/lib/internal-details/css-constants.ts
|
|
13
|
+
const CSS_CLASSES = {
|
|
14
|
+
SUSPENSE_FALLBACK: "sb-suspense-fallback",
|
|
15
|
+
ANCHOR_NAME: "sb-anchor-name"
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/lib/internal-details/lib/suspense/suspense-fallback.tsx
|
|
20
|
+
const shimmerAnimation = keyframes`
|
|
21
|
+
0% {
|
|
22
|
+
background-position: -200px 0;
|
|
23
|
+
}
|
|
24
|
+
100% {
|
|
25
|
+
background-position: calc(200px + 100%) 0;
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
const ShimmerDiv = styled.div`
|
|
29
|
+
min-height: 12px;
|
|
30
|
+
min-width: 12px;
|
|
31
|
+
background-color: ${(props) => props.$backgroundColor};
|
|
32
|
+
border-radius: ${(props) => props.$borderRadius};
|
|
33
|
+
position: relative;
|
|
34
|
+
overflow: hidden;
|
|
35
|
+
background: linear-gradient(
|
|
36
|
+
90deg,
|
|
37
|
+
${(props) => props.$backgroundColor} 25%,
|
|
38
|
+
${(props) => props.$shimmerHighlight} 50%,
|
|
39
|
+
${(props) => props.$backgroundColor} 75%
|
|
40
|
+
);
|
|
41
|
+
background-size: max(100%, 200px) 100%;
|
|
42
|
+
animation: ${shimmerAnimation} 5s infinite linear;
|
|
43
|
+
`;
|
|
44
|
+
/**
|
|
45
|
+
* Default fallback component displayed while components are suspended.
|
|
46
|
+
*/
|
|
47
|
+
function SuspenseFallback({ style, className, noBorderRadius }) {
|
|
48
|
+
const backgroundColor = "#f8f9fa";
|
|
49
|
+
const shimmerHighlight = "#ffffff";
|
|
50
|
+
const borderRadius = noBorderRadius ? "0px" : "4px";
|
|
51
|
+
const classes = useMemo(() => [CSS_CLASSES.ANCHOR_NAME, className].filter(Boolean).join(" "), [className]);
|
|
52
|
+
return /* @__PURE__ */ jsx(ShimmerDiv, {
|
|
53
|
+
$backgroundColor: backgroundColor,
|
|
54
|
+
$shimmerHighlight: shimmerHighlight,
|
|
55
|
+
$borderRadius: borderRadius,
|
|
56
|
+
style: style?.(),
|
|
57
|
+
className: classes,
|
|
58
|
+
"data-test": "suspense-fallback"
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/lib/user-facing/component-base/error-boundary.tsx
|
|
64
|
+
const ErrorBoundaryContainer = styled.div`
|
|
65
|
+
background: white;
|
|
66
|
+
padding: 10px;
|
|
67
|
+
display: flex;
|
|
68
|
+
flex-direction: column;
|
|
69
|
+
gap: 8px;
|
|
70
|
+
border: 1px solid ${colors.GREY_100};
|
|
71
|
+
border-left: 3px solid ${colors.RED_500};
|
|
72
|
+
border-radius: 4px;
|
|
73
|
+
width: 100%;
|
|
74
|
+
color: ${colors.GREY_700};
|
|
75
|
+
`;
|
|
76
|
+
const ErrorDetailsContainer = styled.div`
|
|
77
|
+
display: flex;
|
|
78
|
+
flex-direction: column;
|
|
79
|
+
gap: 8px;
|
|
80
|
+
`;
|
|
81
|
+
const ErrorActionsContainer = styled.div`
|
|
82
|
+
display: flex;
|
|
83
|
+
justify-content: flex-end;
|
|
84
|
+
align-items: center;
|
|
85
|
+
gap: 8px;
|
|
86
|
+
`;
|
|
87
|
+
var ErrorBoundary = class extends Component {
|
|
88
|
+
state = {
|
|
89
|
+
id: generateId(),
|
|
90
|
+
hasError: false
|
|
91
|
+
};
|
|
92
|
+
disposeAutoReset;
|
|
93
|
+
static getDerivedStateFromError(e) {
|
|
94
|
+
const error = e instanceof Error ? e : new Error(typeof e === "object" && e !== null ? JSON.stringify(e) : String(e));
|
|
95
|
+
return {
|
|
96
|
+
id: generateId(),
|
|
97
|
+
hasError: true,
|
|
98
|
+
error
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
componentDidCatch(error, errorInfo) {
|
|
102
|
+
console.error("Uncaught error:", error, errorInfo);
|
|
103
|
+
if (isEditMode$1()) root_store_default.editStore?.ai.handleRuntimeError({
|
|
104
|
+
id: this.state.id,
|
|
105
|
+
error: String(error),
|
|
106
|
+
errorInfo,
|
|
107
|
+
identifier: this.props.identifier
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
reset = () => {
|
|
111
|
+
if (isEditMode$1()) root_store_default.editStore?.ai.clearRuntimeError(this.state.id);
|
|
112
|
+
this.setState({
|
|
113
|
+
hasError: false,
|
|
114
|
+
error: void 0
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
componentWillUnmount() {
|
|
118
|
+
if (this.state.hasError && isEditMode$1()) root_store_default.editStore?.ai.clearRuntimeError(this.state.id);
|
|
119
|
+
this.disposeAutoReset?.();
|
|
120
|
+
}
|
|
121
|
+
handleFixWithClarkInitiated = () => {
|
|
122
|
+
const ai = root_store_default.editStore?.ai;
|
|
123
|
+
if (!ai) return;
|
|
124
|
+
this.disposeAutoReset?.();
|
|
125
|
+
this.disposeAutoReset = void 0;
|
|
126
|
+
let sawStart = ai.getIsEditing();
|
|
127
|
+
this.disposeAutoReset = reaction(() => ai.getIsEditing(), (isEditing) => {
|
|
128
|
+
if (!sawStart && isEditing) sawStart = true;
|
|
129
|
+
if (sawStart && !isEditing) {
|
|
130
|
+
this.reset();
|
|
131
|
+
this.disposeAutoReset?.();
|
|
132
|
+
this.disposeAutoReset = void 0;
|
|
133
|
+
}
|
|
134
|
+
}, {
|
|
135
|
+
fireImmediately: true,
|
|
136
|
+
name: "error-boundary-ai-auto-reset"
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
handleFixWithAi() {
|
|
140
|
+
const { identifier } = this.props;
|
|
141
|
+
if (identifier) editorBridge.addComponentToAiContext(identifier.sourceId, identifier.selectorId);
|
|
142
|
+
let prompt = `Fix this error: `;
|
|
143
|
+
if (this.state.error?.stack) {
|
|
144
|
+
const lines = this.state.error.stack.split("\n");
|
|
145
|
+
const nodeModulesIndex = lines.findIndex((line) => line.includes("node_modules"));
|
|
146
|
+
const relevantLines = nodeModulesIndex > -1 ? lines.slice(0, nodeModulesIndex) : lines;
|
|
147
|
+
prompt += relevantLines.slice(0, 5).join("\n");
|
|
148
|
+
} else prompt += this.state.error?.toString();
|
|
149
|
+
editorBridge.aiGenerate(prompt);
|
|
150
|
+
}
|
|
151
|
+
render() {
|
|
152
|
+
if (this.state.hasError) return /* @__PURE__ */ jsx(Observer, { children: () => {
|
|
153
|
+
if (root_store_default.editStore?.ai.getIsEditing() ?? false) return /* @__PURE__ */ jsx(SuspenseFallback, {});
|
|
154
|
+
return /* @__PURE__ */ jsxs(ErrorBoundaryContainer, { children: [/* @__PURE__ */ jsxs(ErrorDetailsContainer, { children: [/* @__PURE__ */ jsx("h3", { children: this.props.header || "Something went wrong." }), /* @__PURE__ */ jsxs("details", {
|
|
155
|
+
style: { fontSize: "0.8em" },
|
|
156
|
+
children: [/* @__PURE__ */ jsx("summary", {
|
|
157
|
+
style: { paddingLeft: "0.25rem" },
|
|
158
|
+
children: "Error details"
|
|
159
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
160
|
+
style: {
|
|
161
|
+
marginTop: "0.5rem",
|
|
162
|
+
maxWidth: "100%",
|
|
163
|
+
overflowX: "auto",
|
|
164
|
+
scrollbarWidth: "thin"
|
|
165
|
+
},
|
|
166
|
+
children: /* @__PURE__ */ jsx("pre", {
|
|
167
|
+
style: { color: "gray" },
|
|
168
|
+
children: /* @__PURE__ */ jsx("code", { children: this.state.error?.stack ? this.state.error.stack : this.state.error?.toString() })
|
|
169
|
+
})
|
|
170
|
+
})]
|
|
171
|
+
})] }), /* @__PURE__ */ jsxs(ErrorActionsContainer, { children: [isEditMode$1() && /* @__PURE__ */ jsx(FixWithClarkButton, {
|
|
172
|
+
onClick: this.handleFixWithClarkInitiated,
|
|
173
|
+
error: this.state.error,
|
|
174
|
+
identifier: this.props.identifier
|
|
175
|
+
}), /* @__PURE__ */ jsx(SecondaryButton, {
|
|
176
|
+
onClick: this.reset,
|
|
177
|
+
children: "Try again"
|
|
178
|
+
})] })] });
|
|
179
|
+
} });
|
|
180
|
+
return this.props.children;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
var error_boundary_default = ErrorBoundary;
|
|
184
|
+
|
|
185
|
+
//#endregion
|
|
186
|
+
//#region src/edit-mode/edit-wrapper.tsx
|
|
187
|
+
if (typeof window !== "undefined" && typeof document.documentElement !== "undefined" && !("anchorName" in document.documentElement.style)) polyfill();
|
|
188
|
+
const createAnchorNameStyle = (props) => {
|
|
189
|
+
return { "--anchor-name": getWidgetAnchorName(props.selectorId) };
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region src/edit-mode/instance-tracker.ts
|
|
194
|
+
/**
|
|
195
|
+
* Tracks and recycles instance numbers for each sourceId to generate stable, unique selector IDs.
|
|
196
|
+
* When components unmount, their instance numbers are released and can be reused.
|
|
197
|
+
*/
|
|
198
|
+
var InstanceTracker = class {
|
|
199
|
+
sourceIdToUsedInstances = /* @__PURE__ */ new Map();
|
|
200
|
+
getNextAvailableInstance(sourceId) {
|
|
201
|
+
const usedInstances = this.sourceIdToUsedInstances.get(sourceId) ?? /* @__PURE__ */ new Set();
|
|
202
|
+
let instance = 0;
|
|
203
|
+
while (usedInstances.has(instance)) instance++;
|
|
204
|
+
usedInstances.add(instance);
|
|
205
|
+
this.sourceIdToUsedInstances.set(sourceId, usedInstances);
|
|
206
|
+
return instance;
|
|
207
|
+
}
|
|
208
|
+
releaseInstance(sourceId, instance) {
|
|
209
|
+
const usedInstances = this.sourceIdToUsedInstances.get(sourceId);
|
|
210
|
+
if (usedInstances) {
|
|
211
|
+
usedInstances.delete(instance);
|
|
212
|
+
if (usedInstances.size === 0) this.sourceIdToUsedInstances.delete(sourceId);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
const instanceTracker = new InstanceTracker();
|
|
217
|
+
|
|
218
|
+
//#endregion
|
|
219
|
+
//#region src/edit-mode/jsx-wrapper.tsx
|
|
220
|
+
const JSXContext = React.createContext({ selectorId: "S-<unknown>" });
|
|
221
|
+
const makeWrappedComponent = (type) => {
|
|
222
|
+
const isTag = typeof type === "string";
|
|
223
|
+
const isRegisteredSbComponent = root_store_default.componentRegistry.hasComponent(type);
|
|
224
|
+
const Component$1 = React.forwardRef((props, ref) => {
|
|
225
|
+
const { selectorId: parentSelectorId } = useJSXContext();
|
|
226
|
+
const sourceId = props[SOURCE_ID_ATTRIBUTE];
|
|
227
|
+
const noSelect = props[NO_SELECT_ATTRIBUTE];
|
|
228
|
+
const instanceNumberRef = useRef();
|
|
229
|
+
const selectorId = useRef("S-<unknown>");
|
|
230
|
+
if (selectorId.current === "S-<unknown>") {
|
|
231
|
+
instanceNumberRef.current = instanceTracker.getNextAvailableInstance(sourceId);
|
|
232
|
+
selectorId.current = `S-x-${sourceId}-${instanceNumberRef.current}`;
|
|
233
|
+
}
|
|
234
|
+
useEffect(() => {
|
|
235
|
+
root_store_default.editStore?.runtimeTrackingStore.registerComponent(selectorId.current, {
|
|
236
|
+
sourceId,
|
|
237
|
+
type,
|
|
238
|
+
parentSelectorId,
|
|
239
|
+
isSbComponent: isRegisteredSbComponent,
|
|
240
|
+
isHtmlElement: isTag,
|
|
241
|
+
noSelect
|
|
242
|
+
});
|
|
243
|
+
return () => {
|
|
244
|
+
root_store_default.editStore?.runtimeTrackingStore.unregisterComponent(selectorId.current);
|
|
245
|
+
if (instanceNumberRef.current !== void 0) instanceTracker.releaseInstance(sourceId, instanceNumberRef.current);
|
|
246
|
+
};
|
|
247
|
+
}, []);
|
|
248
|
+
useEffect(() => {
|
|
249
|
+
root_store_default.editStore?.runtimeTrackingStore.updatePropsForComponent(selectorId.current, props);
|
|
250
|
+
}, [props]);
|
|
251
|
+
const jsxContext = useMemo(() => ({ selectorId: selectorId.current }), []);
|
|
252
|
+
const selectorProps = { [SELECTOR_ID_ATTRIBUTE]: selectorId.current };
|
|
253
|
+
if (parentSelectorId) selectorProps["data-sb-parent-selector-id"] = parentSelectorId;
|
|
254
|
+
const style = useMemo(() => {
|
|
255
|
+
return {
|
|
256
|
+
...props.style,
|
|
257
|
+
...createAnchorNameStyle({ selectorId: selectorId.current })
|
|
258
|
+
};
|
|
259
|
+
}, [props.style]);
|
|
260
|
+
const element = React.createElement(type, {
|
|
261
|
+
ref,
|
|
262
|
+
...props,
|
|
263
|
+
...selectorProps,
|
|
264
|
+
className: ["sb-anchor-name", props.className].filter(Boolean).join(" "),
|
|
265
|
+
style
|
|
266
|
+
});
|
|
267
|
+
if (!root_store_default.editStore?.isInitialized) return element;
|
|
268
|
+
return /* @__PURE__ */ jsx(JSXContext.Provider, {
|
|
269
|
+
value: jsxContext,
|
|
270
|
+
children: /* @__PURE__ */ jsx(error_boundary_default, { children: element })
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
try {
|
|
274
|
+
Component$1.displayName = typeof type === "string" ? type : type.displayName || type.name || "Component";
|
|
275
|
+
} catch (e) {
|
|
276
|
+
console.error("Error setting displayName", e);
|
|
277
|
+
}
|
|
278
|
+
return Component$1;
|
|
279
|
+
};
|
|
280
|
+
const useJSXContext = () => {
|
|
281
|
+
return React.useContext(JSXContext);
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
//#endregion
|
|
285
|
+
//#region src/jsx-dev-runtime/jsx-dev-runtime.ts
|
|
286
|
+
const reactJsxDEV = ReactJsxDevRuntime.jsxDEV;
|
|
287
|
+
function isEditMode() {
|
|
288
|
+
if (typeof window === "undefined") return false;
|
|
289
|
+
if (window.__SUPERBLOCKS_EDIT_MODE__ !== void 0) return window.__SUPERBLOCKS_EDIT_MODE__;
|
|
290
|
+
if (window._SB_VIEW_MODE === "dev") {
|
|
291
|
+
window.__SUPERBLOCKS_EDIT_MODE__ = true;
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
const isEdit = false;
|
|
295
|
+
window.__SUPERBLOCKS_EDIT_MODE__ = isEdit;
|
|
296
|
+
return isEdit;
|
|
297
|
+
}
|
|
298
|
+
const objTypeCache = /* @__PURE__ */ new WeakMap();
|
|
299
|
+
const stringTypeCache = /* @__PURE__ */ new Map();
|
|
300
|
+
function getOrSetCachedWrappedComponent(type) {
|
|
301
|
+
const typeIsObject = (typeof type === "object" || typeof type === "function") && type !== null;
|
|
302
|
+
const cachedType = typeIsObject ? objTypeCache.get(type) : stringTypeCache.get(type);
|
|
303
|
+
if (cachedType) return cachedType;
|
|
304
|
+
const newComponent = makeWrappedComponent(type);
|
|
305
|
+
if (typeIsObject) objTypeCache.set(type, newComponent);
|
|
306
|
+
else stringTypeCache.set(type, newComponent);
|
|
307
|
+
return newComponent;
|
|
308
|
+
}
|
|
309
|
+
const shouldWrapTagType = (type) => {
|
|
310
|
+
if (typeof type === "string") return root_store_default.componentRegistry.hasComponent(type);
|
|
311
|
+
return type != null && (typeof type === "object" || typeof type === "function");
|
|
312
|
+
};
|
|
313
|
+
function jsxDEV(type, props, key, isStaticChildren, source, self) {
|
|
314
|
+
const sourceId = props?.[SOURCE_ID_ATTRIBUTE];
|
|
315
|
+
try {
|
|
316
|
+
if (sourceId && isEditMode() && shouldWrapTagType(type)) return reactJsxDEV(getOrSetCachedWrappedComponent(type), props, `${key}-${sourceId}`, isStaticChildren, source, self);
|
|
317
|
+
} catch (e) {
|
|
318
|
+
console.error("Error during JSX wrap", e);
|
|
319
|
+
}
|
|
320
|
+
return reactJsxDEV(type, props, key, isStaticChildren, source, self);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
//#endregion
|
|
324
|
+
//#region src/jsx-dev-runtime/index.ts
|
|
325
|
+
const Fragment = ReactJsxDevRuntime.Fragment;
|
|
326
|
+
|
|
327
|
+
//#endregion
|
|
328
|
+
export { Fragment, jsxDEV };
|
|
329
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["isEditMode","rootStore","rootStore","Component","selectorProps: Record<string, string>","ErrorBoundary","rootStore"],"sources":["../../src/lib/internal-details/css-constants.ts","../../src/lib/internal-details/lib/suspense/suspense-fallback.tsx","../../src/lib/user-facing/component-base/error-boundary.tsx","../../src/edit-mode/edit-wrapper.tsx","../../src/edit-mode/instance-tracker.ts","../../src/edit-mode/jsx-wrapper.tsx","../../src/jsx-dev-runtime/jsx-dev-runtime.ts","../../src/jsx-dev-runtime/index.ts"],"sourcesContent":["export const CSS_CLASSES = {\n SUSPENSE_FALLBACK: \"sb-suspense-fallback\",\n ANCHOR_NAME: \"sb-anchor-name\",\n} as const;\n","import { useMemo, type CSSProperties, type ReactNode } from \"react\";\nimport styled, { keyframes } from \"styled-components\";\nimport { CSS_CLASSES } from \"../../css-constants.js\";\n\ninterface Props {\n children?: ReactNode;\n className?: string;\n style?: () => CSSProperties;\n noBorderRadius?: boolean;\n}\n\nconst shimmerAnimation = keyframes`\n 0% {\n background-position: -200px 0;\n }\n 100% {\n background-position: calc(200px + 100%) 0;\n }\n`;\n\nconst ShimmerDiv = styled.div<{\n $backgroundColor: string;\n $shimmerHighlight: string;\n $borderRadius: string;\n}>`\n min-height: 12px;\n min-width: 12px;\n background-color: ${(props) => props.$backgroundColor};\n border-radius: ${(props) => props.$borderRadius};\n position: relative;\n overflow: hidden;\n background: linear-gradient(\n 90deg,\n ${(props) => props.$backgroundColor} 25%,\n ${(props) => props.$shimmerHighlight} 50%,\n ${(props) => props.$backgroundColor} 75%\n );\n background-size: max(100%, 200px) 100%;\n animation: ${shimmerAnimation} 5s infinite linear;\n`;\n\n/**\n * Default fallback component displayed while components are suspended.\n */\nexport function SuspenseFallback({ style, className, noBorderRadius }: Props) {\n const backgroundColor = \"#f8f9fa\";\n const shimmerHighlight = \"#ffffff\";\n const borderRadius = noBorderRadius ? \"0px\" : \"4px\";\n\n const classes = useMemo(\n () => [CSS_CLASSES.ANCHOR_NAME, className].filter(Boolean).join(\" \"),\n [className],\n );\n\n return (\n <ShimmerDiv\n $backgroundColor={backgroundColor}\n $shimmerHighlight={shimmerHighlight}\n $borderRadius={borderRadius}\n style={style?.()}\n className={classes}\n data-test=\"suspense-fallback\"\n />\n );\n}\n","import { reaction, type IReactionDisposer } from \"mobx\";\nimport { Observer } from \"mobx-react-lite\";\nimport React, { Component } from \"react\";\nimport styled from \"styled-components\";\nimport { editorBridge } from \"../../../edit-mode/superblocks-editor-bridge.js\";\nimport { SecondaryButton } from \"../../internal-details/internal-components/common.js\";\nimport { FixWithClarkButton } from \"../../internal-details/internal-components/fix-with-clark-button.jsx\";\nimport { isEditMode } from \"../../internal-details/is-edit-mode.js\";\nimport rootStore from \"../../internal-details/lib/root-store.js\";\nimport { SuspenseFallback } from \"../../internal-details/lib/suspense/suspense-fallback.js\";\nimport { generateId } from \"../../utils/generate-id.js\";\nimport { colors } from \"../styling/colors.js\";\nimport type { IdentifierInfo } from \"../../internal-details/types.js\";\n\nimport type { ErrorInfo, ReactNode } from \"react\";\n\nconst ErrorBoundaryContainer = styled.div`\n background: white;\n padding: 10px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n border: 1px solid ${colors.GREY_100};\n border-left: 3px solid ${colors.RED_500};\n border-radius: 4px;\n width: 100%;\n color: ${colors.GREY_700};\n`;\n\nconst ErrorDetailsContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n`;\n\nconst ErrorActionsContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n`;\n\ninterface Props {\n children: ReactNode;\n header?: string;\n identifier?: IdentifierInfo;\n}\n\ninterface State {\n id: string;\n hasError: boolean;\n error?: Error;\n}\n\nclass ErrorBoundary extends Component<Props, State> {\n state: State = {\n id: generateId(),\n hasError: false,\n };\n\n private disposeAutoReset?: IReactionDisposer;\n\n static getDerivedStateFromError(e: Error): State {\n const error =\n e instanceof Error\n ? e\n : new Error(\n typeof e === \"object\" && e !== null ? JSON.stringify(e) : String(e),\n );\n return {\n id: generateId(),\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"Uncaught error:\", error, errorInfo);\n if (isEditMode()) {\n rootStore.editStore?.ai.handleRuntimeError({\n id: this.state.id,\n error: String(error),\n errorInfo,\n identifier: this.props.identifier,\n });\n }\n }\n\n reset = () => {\n if (isEditMode()) {\n rootStore.editStore?.ai.clearRuntimeError(this.state.id);\n }\n this.setState({ hasError: false, error: undefined });\n };\n\n componentWillUnmount() {\n // Clear runtime error if component unmounts while in error state\n if (this.state.hasError && isEditMode()) {\n rootStore.editStore?.ai.clearRuntimeError(this.state.id);\n }\n // Clean up auto-reset watcher if still pending\n this.disposeAutoReset?.();\n }\n\n handleFixWithClarkInitiated = () => {\n const ai = rootStore.editStore?.ai;\n if (!ai) return;\n\n // Clean up any existing watcher\n this.disposeAutoReset?.();\n this.disposeAutoReset = undefined;\n\n // Set up one-shot watcher for AI completion\n let sawStart = ai.getIsEditing();\n this.disposeAutoReset = reaction(\n () => ai.getIsEditing(),\n (isEditing) => {\n if (!sawStart && isEditing) {\n sawStart = true;\n }\n if (sawStart && !isEditing) {\n this.reset();\n this.disposeAutoReset?.();\n this.disposeAutoReset = undefined;\n }\n },\n { fireImmediately: true, name: \"error-boundary-ai-auto-reset\" },\n );\n };\n\n handleFixWithAi() {\n const { identifier } = this.props;\n\n if (identifier) {\n editorBridge.addComponentToAiContext(\n identifier.sourceId,\n identifier.selectorId,\n );\n }\n\n let prompt = `Fix this error: `;\n\n if (this.state.error?.stack) {\n const lines = this.state.error.stack.split(\"\\n\");\n const nodeModulesIndex = lines.findIndex((line) =>\n line.includes(\"node_modules\"),\n );\n const relevantLines =\n nodeModulesIndex > -1 ? lines.slice(0, nodeModulesIndex) : lines;\n\n prompt += relevantLines.slice(0, 5).join(\"\\n\");\n } else {\n prompt += this.state.error?.toString();\n }\n\n editorBridge.aiGenerate(prompt);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <Observer>\n {() => {\n // Check if AI is currently generating\n const isAIGenerating =\n rootStore.editStore?.ai.getIsEditing() ?? false;\n\n if (isAIGenerating) {\n // During AI generation, show shimmer loader\n // Error is already reported to AI in componentDidCatch\n return <SuspenseFallback />;\n }\n\n // When AI is not generating, show full error UI\n return (\n <ErrorBoundaryContainer>\n <ErrorDetailsContainer>\n <h3>{this.props.header || \"Something went wrong.\"}</h3>\n <details style={{ fontSize: \"0.8em\" }}>\n <summary style={{ paddingLeft: \"0.25rem\" }}>\n Error details\n </summary>\n <div\n style={{\n marginTop: \"0.5rem\",\n maxWidth: \"100%\",\n overflowX: \"auto\",\n scrollbarWidth: \"thin\",\n }}\n >\n <pre\n style={{\n color: \"gray\",\n }}\n >\n <code>\n {this.state.error?.stack\n ? this.state.error.stack\n : this.state.error?.toString()}\n </code>\n </pre>\n </div>\n </details>\n </ErrorDetailsContainer>\n <ErrorActionsContainer>\n {isEditMode() && (\n <FixWithClarkButton\n onClick={this.handleFixWithClarkInitiated}\n error={this.state.error}\n identifier={this.props.identifier}\n />\n )}\n <SecondaryButton onClick={this.reset}>\n Try again\n </SecondaryButton>\n </ErrorActionsContainer>\n </ErrorBoundaryContainer>\n );\n }}\n </Observer>\n );\n }\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n","import polyfill from \"@oddbird/css-anchor-positioning/fn\";\n\nimport { getWidgetAnchorName } from \"../lib/utils/widget-wrapper-naming.js\";\n\nimport type { SbSelector } from \"@superblocksteam/library-shared/types\";\nimport type React from \"react\";\nimport type { CSSProperties } from \"react\";\n\nif (\n typeof window !== \"undefined\" &&\n typeof document.documentElement !== \"undefined\" &&\n !(\"anchorName\" in document.documentElement.style)\n) {\n polyfill();\n}\n\n// The variable --anchor-name is used in the CSS to set the anchor name for the widget\n// on the actual widget element.\nexport const createAnchorNameStyle = (props: {\n selectorId: SbSelector;\n}): React.CSSProperties | undefined => {\n return {\n \"--anchor-name\": getWidgetAnchorName(props.selectorId),\n } as CSSProperties;\n};\n","/**\n * Tracks and recycles instance numbers for each sourceId to generate stable, unique selector IDs.\n * When components unmount, their instance numbers are released and can be reused.\n */\nclass InstanceTracker {\n private sourceIdToUsedInstances = new Map<string, Set<number>>();\n\n getNextAvailableInstance(sourceId: string): number {\n const usedInstances =\n this.sourceIdToUsedInstances.get(sourceId) ?? new Set();\n\n // Find the smallest unused instance number\n let instance = 0;\n while (usedInstances.has(instance)) {\n instance++;\n }\n\n usedInstances.add(instance);\n this.sourceIdToUsedInstances.set(sourceId, usedInstances);\n\n return instance;\n }\n\n releaseInstance(sourceId: string, instance: number): void {\n const usedInstances = this.sourceIdToUsedInstances.get(sourceId);\n if (usedInstances) {\n usedInstances.delete(instance);\n if (usedInstances.size === 0) {\n this.sourceIdToUsedInstances.delete(sourceId);\n }\n }\n }\n}\n\nexport const instanceTracker = new InstanceTracker();\n","import {\n NO_SELECT_ATTRIBUTE,\n SELECTOR_ID_ATTRIBUTE,\n SOURCE_ID_ATTRIBUTE,\n} from \"@superblocksteam/library-shared\";\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport rootStore from \"../lib/internal-details/lib/root-store.js\";\nimport ErrorBoundary from \"../lib/user-facing/component-base/error-boundary.js\";\nimport { createAnchorNameStyle } from \"./edit-wrapper.js\";\nimport { instanceTracker } from \"./instance-tracker.js\";\nimport type { SbSelector } from \"@superblocksteam/library-shared/types\";\n\nexport type JSXContextType = {\n selectorId: SbSelector;\n};\n\nexport const JSXContext = React.createContext<JSXContextType>({\n selectorId: \"S-<unknown>\" satisfies SbSelector,\n});\n\nexport const makeWrappedComponent = (type: any) => {\n const isTag = typeof type === \"string\";\n const isRegisteredSbComponent =\n rootStore.componentRegistry.hasComponent(type);\n\n const Component = React.forwardRef((props: any, ref: any) => {\n const { selectorId: parentSelectorId } = useJSXContext();\n\n const sourceId = props[SOURCE_ID_ATTRIBUTE];\n const noSelect = props[NO_SELECT_ATTRIBUTE];\n\n const instanceNumberRef = useRef<number>();\n const selectorId = useRef<SbSelector>(\"S-<unknown>\" satisfies SbSelector);\n if (selectorId.current === \"S-<unknown>\") {\n instanceNumberRef.current =\n instanceTracker.getNextAvailableInstance(sourceId);\n selectorId.current =\n `S-x-${sourceId}-${instanceNumberRef.current}` as SbSelector;\n }\n\n useEffect(() => {\n rootStore.editStore?.runtimeTrackingStore.registerComponent(\n selectorId.current,\n {\n sourceId,\n type,\n parentSelectorId,\n isSbComponent: isRegisteredSbComponent,\n isHtmlElement: isTag,\n noSelect,\n },\n );\n return () => {\n rootStore.editStore?.runtimeTrackingStore.unregisterComponent(\n selectorId.current,\n );\n if (instanceNumberRef.current !== undefined) {\n instanceTracker.releaseInstance(sourceId, instanceNumberRef.current);\n }\n };\n // These deps should NOT change during the component lifecycle\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n rootStore.editStore?.runtimeTrackingStore.updatePropsForComponent(\n selectorId.current,\n props,\n );\n }, [props]);\n\n const jsxContext = useMemo(\n () =>\n ({\n selectorId: selectorId.current,\n }) satisfies JSXContextType,\n [],\n );\n\n const selectorProps: Record<string, string> = {\n [SELECTOR_ID_ATTRIBUTE]: selectorId.current,\n };\n\n if (parentSelectorId) {\n selectorProps[\"data-sb-parent-selector-id\"] = parentSelectorId;\n }\n\n const style = useMemo(() => {\n return {\n ...props.style,\n ...createAnchorNameStyle({\n selectorId: selectorId.current,\n }),\n };\n }, [props.style]);\n\n const element = React.createElement(type, {\n ref,\n ...props,\n ...selectorProps,\n className: [\"sb-anchor-name\", props.className].filter(Boolean).join(\" \"),\n style,\n });\n\n if (!rootStore.editStore?.isInitialized) {\n return element;\n }\n\n return (\n <JSXContext.Provider value={jsxContext}>\n <ErrorBoundary>{element}</ErrorBoundary>\n </JSXContext.Provider>\n );\n });\n try {\n Component.displayName =\n typeof type === \"string\"\n ? type\n : type.displayName || type.name || \"Component\";\n } catch (e) {\n console.error(\"Error setting displayName\", e);\n }\n\n return Component;\n};\n\nconst useJSXContext = () => {\n return React.useContext(JSXContext);\n};\n","import { SOURCE_ID_ATTRIBUTE } from \"@superblocksteam/library-shared\";\nimport * as ReactJsxDevRuntime from \"react/jsx-dev-runtime\";\nimport { makeWrappedComponent } from \"../edit-mode/jsx-wrapper.js\";\nimport rootStore from \"../lib/internal-details/lib/root-store.js\";\n\nconst reactJsxDEV = (ReactJsxDevRuntime as any).jsxDEV;\n\ndeclare global {\n interface Window {\n __SUPERBLOCKS_EDIT_MODE__?: boolean;\n _SB_VIEW_MODE?: string;\n }\n}\n\nfunction isEditMode(): boolean {\n if (typeof window === \"undefined\") return false;\n\n if (window.__SUPERBLOCKS_EDIT_MODE__ !== undefined) {\n return window.__SUPERBLOCKS_EDIT_MODE__;\n }\n\n const viewMode = window._SB_VIEW_MODE;\n if (viewMode === \"dev\") {\n window.__SUPERBLOCKS_EDIT_MODE__ = true;\n return true;\n }\n\n const envMode = import.meta.env?.MODE;\n const isEdit = envMode === \"local-dev\";\n window.__SUPERBLOCKS_EDIT_MODE__ = isEdit;\n return isEdit;\n}\n\nconst objTypeCache = new WeakMap<any, any>();\nconst stringTypeCache = new Map<string, any>();\n\ntype SupportedElementType = React.ElementType | string;\n\nfunction getOrSetCachedWrappedComponent(type: SupportedElementType) {\n const typeIsObject =\n (typeof type === \"object\" || typeof type === \"function\") && type !== null;\n const cachedType = typeIsObject\n ? objTypeCache.get(type)\n : stringTypeCache.get(type);\n if (cachedType) {\n return cachedType;\n }\n const newComponent = makeWrappedComponent(type);\n if (typeIsObject) {\n objTypeCache.set(type, newComponent);\n } else {\n stringTypeCache.set(type, newComponent);\n }\n return newComponent;\n}\n\nconst shouldWrapTagType = (type: unknown): type is SupportedElementType => {\n if (typeof type === \"string\") {\n return rootStore.componentRegistry.hasComponent(type);\n }\n return (\n type != null && (typeof type === \"object\" || typeof type === \"function\")\n );\n};\n\nexport function jsxDEV(\n type: any,\n props: any,\n key: any,\n isStaticChildren: any,\n source: any,\n self: any,\n) {\n const sourceId = props?.[SOURCE_ID_ATTRIBUTE];\n try {\n if (sourceId && isEditMode() && shouldWrapTagType(type)) {\n const CachedWrappedComponent = getOrSetCachedWrappedComponent(\n type satisfies SupportedElementType,\n );\n\n return reactJsxDEV(\n CachedWrappedComponent,\n props,\n `${key}-${sourceId}`,\n isStaticChildren,\n source,\n self,\n );\n }\n } catch (e) {\n console.error(\"Error during JSX wrap\", e);\n }\n return reactJsxDEV(type, props, key, isStaticChildren, source, self);\n}\n","import * as ReactJsxDevRuntime from \"react/jsx-dev-runtime\";\n\nexport const Fragment = (ReactJsxDevRuntime as any).Fragment;\nexport { jsxDEV } from \"./jsx-dev-runtime.js\";\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/jsx-runtime/index.ts"],"sourcesContent":[],"mappings":";cAEa;AAAA,cACA,IADkC,EAAA,GAAA;AAClC,cACA,QADoC,EAAA,GAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as ReactJsxRuntime from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/jsx-runtime/index.ts
|
|
4
|
+
const jsx = ReactJsxRuntime.jsx;
|
|
5
|
+
const jsxs = ReactJsxRuntime.jsxs;
|
|
6
|
+
const Fragment = ReactJsxRuntime.Fragment;
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
export { Fragment, jsx, jsxs };
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/jsx-runtime/index.ts"],"sourcesContent":["import * as ReactJsxRuntime from \"react/jsx-runtime\";\n\nexport const jsx = (ReactJsxRuntime as any).jsx;\nexport const jsxs = (ReactJsxRuntime as any).jsxs;\nexport const Fragment = (ReactJsxRuntime as any).Fragment;\n"],"mappings":";;;AAEA,MAAa,MAAO,gBAAwB;AAC5C,MAAa,OAAQ,gBAAwB;AAC7C,MAAa,WAAY,gBAAwB"}
|
|
@@ -62,11 +62,6 @@
|
|
|
62
62
|
border: 1px solid #0087e0;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
&.sb-edit-error {
|
|
66
|
-
border: 1px solid #f45252;
|
|
67
|
-
background: rgba(252, 190, 190, 0.3);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
65
|
&.sb-edit-target {
|
|
71
66
|
border: 2px solid #c2b9dd;
|
|
72
67
|
}
|
|
@@ -269,9 +264,14 @@
|
|
|
269
264
|
position-try-fallbacks: flip-block, --actions-below-header;
|
|
270
265
|
}
|
|
271
266
|
|
|
267
|
+
.sb-edit-selection-name-pill {
|
|
268
|
+
max-width: 140px;
|
|
269
|
+
}
|
|
270
|
+
|
|
272
271
|
.sb-edit-selection-name-pill,
|
|
273
|
-
.sb-edit-add-to-chat-button
|
|
274
|
-
|
|
272
|
+
.sb-edit-add-to-chat-button,
|
|
273
|
+
.sb-edit-edit-component-button {
|
|
274
|
+
cursor: pointer !important;
|
|
275
275
|
display: block;
|
|
276
276
|
font-size: 11px;
|
|
277
277
|
color: white;
|
|
@@ -285,6 +285,10 @@
|
|
|
285
285
|
border: none;
|
|
286
286
|
outline: none;
|
|
287
287
|
|
|
288
|
+
* {
|
|
289
|
+
cursor: pointer !important;
|
|
290
|
+
}
|
|
291
|
+
|
|
288
292
|
&:hover {
|
|
289
293
|
box-shadow: 0px 3px 8px -1px #0087e0;
|
|
290
294
|
}
|
|
@@ -296,7 +300,8 @@
|
|
|
296
300
|
}
|
|
297
301
|
|
|
298
302
|
.sb-edit-actions-target-mode .sb-edit-selection-name-pill,
|
|
299
|
-
.sb-edit-actions-target-mode .sb-edit-add-to-chat-button
|
|
303
|
+
.sb-edit-actions-target-mode .sb-edit-add-to-chat-button,
|
|
304
|
+
.sb-edit-actions-target-mode .sb-edit-edit-component-button {
|
|
300
305
|
background-color: rgba(100, 58, 223, 1);
|
|
301
306
|
|
|
302
307
|
&:hover {
|
|
@@ -309,14 +314,15 @@
|
|
|
309
314
|
}
|
|
310
315
|
}
|
|
311
316
|
|
|
312
|
-
.sb-edit-add-to-chat-button
|
|
317
|
+
.sb-edit-add-to-chat-button,
|
|
318
|
+
.sb-edit-edit-component-button {
|
|
313
319
|
display: flex;
|
|
314
320
|
align-items: center;
|
|
315
321
|
justify-content: center;
|
|
316
322
|
|
|
317
323
|
svg {
|
|
318
|
-
width:
|
|
319
|
-
height:
|
|
324
|
+
width: 16px;
|
|
325
|
+
height: 16px;
|
|
320
326
|
}
|
|
321
327
|
}
|
|
322
328
|
|