@walkeros/storybook-addon 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/preview.cjs +1 -1
- package/dist/preview.cjs.map +1 -1
- package/dist/preview.js +1 -1
- package/dist/preview.js.map +1 -1
- package/package.json +5 -5
package/dist/preview.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var previewApi=require('storybook/preview-api'),webSourceBrowser=require('@walkeros/web-source-browser'),collector=require('@walkeros/collector');var g="walkerOS";var c={RESULT:`${g}/result`,REQUEST:`${g}/request`,HIGHLIGHT:`${g}/highlight`,LIVE_EVENT:`${g}/live-event`,ATTRIBUTES_RESULT:`${g}/attributes-result`,ATTRIBUTES_REQUEST:`${g}/attributes-request`};var N={type:"console",push:(t,i)=>{console.log("Storybook Event:",t);},config:{}},O={type:"live",push:(t,i)=>{let o=previewApi.addons.getChannel();o&&o.emit(c.LIVE_EVENT,t);},config:{}};function I(){try{let t=parent.document.querySelector("#storybook-preview-iframe");if(t!=null&&t.contentDocument&&(t!=null&&t.contentWindow))return {document:t.contentDocument,window:t.contentWindow}}catch(t){}return {document,window}}async function S(t){if(!window.__storybookWalker)try{let{document:i,window:o}=I();if(!i){console.warn("Document not available, skipping walkerOS initialization");return}let h=await collector.startFlow({
|
|
1
|
+
'use strict';var previewApi=require('storybook/preview-api'),webSourceBrowser=require('@walkeros/web-source-browser'),collector=require('@walkeros/collector');var g="walkerOS";var c={RESULT:`${g}/result`,REQUEST:`${g}/request`,HIGHLIGHT:`${g}/highlight`,LIVE_EVENT:`${g}/live-event`,ATTRIBUTES_RESULT:`${g}/attributes-result`,ATTRIBUTES_REQUEST:`${g}/attributes-request`};var N={type:"console",push:(t,i)=>{console.log("Storybook Event:",t);},config:{}},O={type:"live",push:(t,i)=>{let o=previewApi.addons.getChannel();o&&o.emit(c.LIVE_EVENT,t);},config:{}};function I(){try{let t=parent.document.querySelector("#storybook-preview-iframe");if(t!=null&&t.contentDocument&&(t!=null&&t.contentWindow))return {document:t.contentDocument,window:t.contentWindow}}catch(t){}return {document,window}}async function S(t){if(!window.__storybookWalker)try{let{document:i,window:o}=I();if(!i){console.warn("Document not available, skipping walkerOS initialization");return}let h=await collector.startFlow({consent:{functional:!0},sources:{browser:{code:webSourceBrowser.sourceBrowser,config:{settings:{pageview:!0,session:!1,elbLayer:"__storybookElbLayer",elb:"__storybookElb",prefix:(t==null?void 0:t.prefix)||"data-elb",scope:i.body||i}},env:{window:o,document:i}}},destinations:{console:{code:N},live:{code:O}}}),{collector:e,elb:l}=h;if(!e)throw new Error("Collector creation failed - no collector returned");window.__storybookWalker=e,window.__storybookElb=l;}catch(i){console.error("Failed to initialize walkerOS:",i);}}var w=()=>{let t=document.querySelector("#storybook-preview-iframe");return t!=null&&t.contentDocument?t.contentDocument:document},b=()=>{let t=w(),i=["#storybook-root","#root",'[data-testid="storybook-root"]',"body"];for(let o of i){let h=t.querySelector(o);if(h)return h}return t.body},k=t=>{let i=[],o=t;for(;o&&o!==document.body&&o.parentElement;){let h=o.tagName.toLowerCase();o.id?h+=`#${o.id}`:o.className&&typeof o.className=="string"&&(h+=`.${o.className.split(" ").filter(e=>e).join(".")}`),i.unshift(h),o=o.parentElement;}return i.join(" > ")},d=(t,i="data-elb")=>{Array.from(t.querySelectorAll("*")).forEach(h=>{let e=Array.from(h.attributes),l=false;e.forEach(p=>{p.name.startsWith(`${i}-`)&&p.name!==`${i}action`&&p.name!==`${i}context`&&p.name!==`${i}globals`&&(l=true);}),l&&h.setAttribute(`${i}property`,"");});};var C=t=>{if(!t)return "";let i=t.tagName.toLowerCase(),o=[];if(Array.from(t.attributes).forEach(e=>{o.push(`${e.name}="${e.value}"`);}),o.length===0)return `<${i}></${i}>`;if(o.length===1)return `<${i} ${o[0]}></${i}>`;let h=o.map(e=>` ${e}`).join(`
|
|
2
2
|
`);return `<${i}
|
|
3
3
|
${h}
|
|
4
4
|
></${i}>`},A=(t,i="data-elb")=>{let o=[],h=new Map,e=webSourceBrowser.getElbAttributeName(i),l=webSourceBrowser.getElbAttributeName(i,"action",false),p=webSourceBrowser.getElbAttributeName(i,"context",false),x=webSourceBrowser.getElbAttributeName(i,"globals",false);return Array.from(t.querySelectorAll("*")).filter(r=>Array.from(r.attributes).some(n=>n.name===e||n.name===l||n.name===p||n.name===x||n.name.startsWith(`${i}-`))).forEach(r=>{if(h.has(r))return;let n={element:r.tagName.toLowerCase(),path:k(r),htmlMarkup:C(r),attributes:{},children:[]};r.hasAttribute(e)&&(n.attributes.entity=r.getAttribute(e)||""),r.hasAttribute(l)&&(n.attributes.action=r.getAttribute(l)||"");try{let a=webSourceBrowser.getElbValues(i,r,"context",!1);Object.keys(a).length>0&&(n.attributes.context=a);}catch(a){}try{let a=webSourceBrowser.getElbValues(i,r,"globals",!1);Object.keys(a).length>0&&(n.attributes.globals=a);}catch(a){}let s={};Array.from(r.attributes).forEach(a=>{if(a.name.startsWith(`${i}-`)){let $=a.name.substring(i.length+1);try{s[$]=webSourceBrowser.getElbValues(i,r,$,!0);}catch(G){s[$]=a.value;}}}),Object.keys(s).length>0&&(n.attributes.properties=s),h.set(r,n);}),h.forEach((r,n)=>{let s=n.parentElement,a=null;for(;s&&s!==t;){if(h.has(s)){a=h.get(s);break}s=s.parentElement;}a?a.children.push(r):o.push(r);}),o};var H=t=>{let i=`${t}globals`,o=`${t}context`,h=t,e=`${t}property`;return `
|
package/dist/preview.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/walker.ts","../src/utils/domUtils.ts","../src/utils/attributeTreeUtils.ts","../src/utils/cssUtils.ts","../src/utils/highlightingUtils.ts","../src/withRoundTrip.ts","../src/preview.ts"],"names":["ADDON_ID","EVENTS","destinationConsole","event","context","destinationLive","channel","addons","getIframeContext","iframe","e","initializeWalker","config","iframeDoc","iframeWin","result","startFlow","sourceBrowser","collector","elb","error","getStoryDocument","getStoryRootElement","storyDoc","selectors","selector","element","getElementPath","el","path","current","c","enhanceProperties","storyRoot","prefix","attributes","hasProperties","attr","generateElementHTML","tagName","allAttribs","formattedAttribs","buildAttributeTree","scope","tree","nodeMap","entityAttr","getElbAttributeName","actionAttr","contextAttr","globalsAttr","node","contextValues","getElbValues","globalsValues","properties","propName","parent","parentNode","generateHighlightCSS","globalsSelector","contextSelector","baseSelector","propertySelector","injectHighlightingCSS","existingStyle","highlightingStyleElement","css","applyHighlighting","highlights","setupHighlighting","currentStoryId","events","getAllEvents","globals","getGlobals","eventsWithGlobals","attributeTree","withRoundTrip","storyFn","_a","storyId","hasStoryChanged","parameters","autoRefresh","err","preview","preview_default"],"mappings":"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","file":"preview.cjs","sourcesContent":["export const ADDON_ID = 'walkerOS';\nexport const PANEL_ID = `${ADDON_ID}/panel`;\nexport const KEY = `walkerOS`;\n\nexport const EVENTS = {\n RESULT: `${ADDON_ID}/result`,\n REQUEST: `${ADDON_ID}/request`,\n HIGHLIGHT: `${ADDON_ID}/highlight`,\n LIVE_EVENT: `${ADDON_ID}/live-event`,\n ATTRIBUTES_RESULT: `${ADDON_ID}/attributes-result`,\n ATTRIBUTES_REQUEST: `${ADDON_ID}/attributes-request`,\n};\n","import type { Collector, WalkerOS, Destination } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { sourceBrowser } from '@walkeros/web-source-browser';\nimport { addons } from 'storybook/preview-api';\nimport { EVENTS } from './constants';\n\ndeclare global {\n interface Window {\n __storybookElb: WalkerOS.Elb;\n __storybookWalker: Collector.Instance;\n }\n}\n\n// Simple console destination for Storybook\nconst destinationConsole = {\n type: 'console',\n push: (event: WalkerOS.Event, context: Destination.PushContext) => {\n console.log('Storybook Event:', event);\n },\n config: {},\n};\n\n// Live destination for Storybook panel\nconst destinationLive = {\n type: 'live',\n push: (event: WalkerOS.Event, context: Destination.PushContext) => {\n // Send event to Storybook panel for live display\n const channel = addons.getChannel();\n if (channel) {\n channel.emit(EVENTS.LIVE_EVENT, event);\n }\n },\n config: {},\n};\n\n// Function to get Storybook iframe context\nfunction getIframeContext() {\n try {\n // Try to get iframe from parent document (manager context)\n const iframe = parent.document.querySelector(\n '#storybook-preview-iframe',\n ) as HTMLIFrameElement;\n if (iframe?.contentDocument && iframe?.contentWindow) {\n return {\n document: iframe.contentDocument,\n window: iframe.contentWindow,\n };\n }\n } catch (e) {\n // If we can't access parent, we're likely already in iframe context\n }\n\n // Fallback to current context\n return { document, window };\n}\n\nexport async function initializeWalker(config?: {\n prefix?: string;\n autoRefresh?: boolean;\n}): Promise<void> {\n // Skip initialization if already done\n if (window.__storybookWalker) return;\n\n try {\n // Get iframe context for proper event capture\n const { document: iframeDoc, window: iframeWin } = getIframeContext();\n\n if (!iframeDoc) {\n console.warn('Document not available, skipping walkerOS initialization');\n return;\n }\n\n // Create collector with browser source and destinations\n const result = await startFlow({\n run: true,\n consent: { functional: true },\n sources: {\n browser: {\n code: sourceBrowser,\n config: {\n settings: {\n pageview: true,\n session: false,\n elbLayer: '__storybookElbLayer',\n elb: '__storybookElb',\n prefix: config?.prefix || 'data-elb',\n scope: iframeDoc.body || iframeDoc, // Set scope to iframe document\n },\n },\n env: {\n window: iframeWin,\n document: iframeDoc,\n },\n },\n },\n destinations: {\n console: { code: destinationConsole },\n live: { code: destinationLive },\n },\n });\n\n const { collector, elb } = result;\n\n // Verify collector was created successfully\n if (!collector) {\n throw new Error('Collector creation failed - no collector returned');\n }\n\n // Set global window objects\n window.__storybookWalker = collector;\n window.__storybookElb = elb;\n } catch (error) {\n console.error('Failed to initialize walkerOS:', error);\n }\n}\n","// DOM utilities for working with story elements\n\n// Function to get the story document (either iframe or main document)\nexport const getStoryDocument = (): Document => {\n // Try to find story iframe\n const iframe = document.querySelector(\n '#storybook-preview-iframe',\n ) as HTMLIFrameElement;\n if (iframe?.contentDocument) {\n return iframe.contentDocument;\n }\n // Fallback to main document\n return document;\n};\n\n// Function to get the story root element\nexport const getStoryRootElement = (): Element | null => {\n const storyDoc = getStoryDocument();\n\n // Try multiple selectors for story root\n const selectors = [\n '#storybook-root',\n '#root',\n '[data-testid=\"storybook-root\"]',\n 'body',\n ];\n\n for (const selector of selectors) {\n const element = storyDoc.querySelector(selector);\n if (element) {\n return element;\n }\n }\n\n return storyDoc.body;\n};\n\n// Helper to get element path\nexport const getElementPath = (el: Element): string => {\n const path = [];\n let current = el;\n while (current && current !== document.body && current.parentElement) {\n let selector = current.tagName.toLowerCase();\n if (current.id) {\n selector += `#${current.id}`;\n } else if (current.className && typeof current.className === 'string') {\n selector += `.${current.className\n .split(' ')\n .filter((c) => c)\n .join('.')}`;\n }\n path.unshift(selector);\n current = current.parentElement;\n }\n return path.join(' > ');\n};\n\n// Function to enhance DOM with property attributes\nexport const enhanceProperties = (\n storyRoot: Element,\n prefix: string = 'data-elb',\n): void => {\n // Find all elements with any attributes starting with prefix-\n const allElements = Array.from(storyRoot.querySelectorAll('*'));\n\n allElements.forEach((el) => {\n const attributes = Array.from(el.attributes);\n let hasProperties = false;\n\n attributes.forEach((attr) => {\n // Check if attribute starts with prefix- (e.g., data-elb-button, data-elb-product)\n if (\n attr.name.startsWith(`${prefix}-`) &&\n attr.name !== `${prefix}action` &&\n attr.name !== `${prefix}context` &&\n attr.name !== `${prefix}globals`\n ) {\n hasProperties = true;\n }\n });\n\n // Mark elements with property attributes\n if (hasProperties) {\n el.setAttribute(`${prefix}property`, '');\n }\n });\n};\n","// Utilities for building and managing attribute trees\n\nimport type { WalkerOS } from '@walkeros/core';\nimport type { AttributeNode } from '../types';\nimport {\n getElbAttributeName,\n getElbValues,\n} from '@walkeros/web-source-browser';\nimport { getElementPath } from './domUtils';\n\n// Utility to generate clean HTML markup from an element\nconst generateElementHTML = (element: Element): string => {\n if (!element) return '';\n\n const tagName = element.tagName.toLowerCase();\n const allAttribs: string[] = [];\n\n // Collect ALL attributes as they are\n Array.from(element.attributes).forEach((attr) => {\n allAttribs.push(`${attr.name}=\"${attr.value}\"`);\n });\n\n // If no attributes, return basic element\n if (allAttribs.length === 0) {\n return `<${tagName}></${tagName}>`;\n }\n\n // Format attributes nicely for display\n if (allAttribs.length === 1) {\n return `<${tagName} ${allAttribs[0]}></${tagName}>`;\n }\n\n // Multiple attributes - format with line breaks like dev tools\n const formattedAttribs = allAttribs.map((attr) => ` ${attr}`).join('\\n');\n return `<${tagName}\\n${formattedAttribs}\\n></${tagName}>`;\n};\n\n// Build attribute tree structure\nexport const buildAttributeTree = (\n scope: Element,\n prefix: string = 'data-elb',\n): AttributeNode[] => {\n const tree: AttributeNode[] = [];\n const nodeMap = new Map<Element, AttributeNode>();\n\n // Build selectors for all walker attributes\n const entityAttr = getElbAttributeName(prefix);\n const actionAttr = getElbAttributeName(prefix, 'action', false);\n const contextAttr = getElbAttributeName(prefix, 'context', false);\n const globalsAttr = getElbAttributeName(prefix, 'globals', false);\n\n // Find all elements with walker attributes\n const allElements = Array.from(scope.querySelectorAll('*'));\n const walkerElements = allElements.filter((el) => {\n return Array.from(el.attributes).some(\n (attr) =>\n attr.name === entityAttr ||\n attr.name === actionAttr ||\n attr.name === contextAttr ||\n attr.name === globalsAttr ||\n attr.name.startsWith(`${prefix}-`),\n );\n });\n\n // Build nodes for each element\n walkerElements.forEach((el) => {\n if (nodeMap.has(el)) return; // Already processed\n\n const node: AttributeNode = {\n element: el.tagName.toLowerCase(),\n path: getElementPath(el),\n htmlMarkup: generateElementHTML(el),\n attributes: {},\n children: [],\n };\n\n // Collect all walker attributes on this element\n if (el.hasAttribute(entityAttr)) {\n node.attributes.entity = el.getAttribute(entityAttr) || '';\n }\n\n if (el.hasAttribute(actionAttr)) {\n node.attributes.action = el.getAttribute(actionAttr) || '';\n }\n\n try {\n const contextValues = getElbValues(prefix, el, 'context', false);\n if (Object.keys(contextValues).length > 0) {\n node.attributes.context = contextValues;\n }\n } catch (e) {\n // Skip context if parsing fails\n }\n\n try {\n const globalsValues = getElbValues(prefix, el, 'globals', false);\n if (Object.keys(globalsValues).length > 0) {\n node.attributes.globals = globalsValues;\n }\n } catch (e) {\n // Skip globals if parsing fails\n }\n\n // Collect property attributes\n const properties: WalkerOS.Properties = {};\n Array.from(el.attributes).forEach((attr) => {\n if (attr.name.startsWith(`${prefix}-`)) {\n const propName = attr.name.substring(prefix.length + 1);\n try {\n properties[propName] = getElbValues(prefix, el, propName, true);\n } catch (e) {\n // If parsing fails, just store the raw value\n properties[propName] = attr.value;\n }\n }\n });\n\n if (Object.keys(properties).length > 0) {\n node.attributes.properties = properties;\n }\n\n nodeMap.set(el, node);\n });\n\n // Build tree structure\n nodeMap.forEach((node, element) => {\n let parent = element.parentElement;\n let parentNode = null;\n\n // Find nearest parent with walker attributes\n while (parent && parent !== scope) {\n if (nodeMap.has(parent)) {\n parentNode = nodeMap.get(parent);\n break;\n }\n parent = parent.parentElement;\n }\n\n if (parentNode) {\n parentNode.children.push(node);\n } else {\n tree.push(node);\n }\n });\n\n return tree;\n};\n","// CSS utilities for highlighting DOM elements\n\n// Generate dynamic CSS based on prefix\nexport const generateHighlightCSS = (prefix: string): string => {\n // Define selectors based on prefix\n const globalsSelector = `${prefix}globals`;\n const contextSelector = `${prefix}context`;\n const baseSelector = prefix;\n const propertySelector = `${prefix}property`;\n\n // Template CSS with actual selectors\n const cssTemplate = `\n /* Highlight colors - original from website */\n :root {\n --highlight-globals: #4fc3f7cc;\n --highlight-context: #ffbd44cc;\n --highlight-entity: #00ca4ecc;\n --highlight-property: #ff605ccc;\n --highlight-action: #9900ffcc;\n --highlight-background: #1f2937;\n --highlight-text: #9ca3af;\n --highlight-hover: rgba(255, 255, 255, 0.05);\n --highlight-separator: rgba(255, 255, 255, 0.05);\n }\n\n .highlight-globals [${globalsSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-globals) !important;\n }\n\n .highlight-context [${contextSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-context) !important;\n }\n\n .highlight-entity [${baseSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-entity) !important;\n }\n\n .highlight-property [${propertySelector}] {\n box-shadow: 0 0 0 2px var(--highlight-property) !important;\n }\n\n .highlight-action [${prefix}action] {\n box-shadow: 0 0 0 2px var(--highlight-action) !important;\n }\n\n /* Combined highlights with layered solid borders */\n .highlight-entity.highlight-action [${baseSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity) !important;\n }\n\n .highlight-entity.highlight-context [${baseSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-entity),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-entity.highlight-property [${baseSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-entity),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-context [${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-context.highlight-property [${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-context),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-property [${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n /* Globals combinations */\n .highlight-globals.highlight-entity [${globalsSelector}][${baseSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity) !important;\n }\n\n .highlight-globals.highlight-action [${globalsSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action) !important;\n }\n\n .highlight-globals.highlight-context [${globalsSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-property [${globalsSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n /* Triple combinations with globals */\n .highlight-globals.highlight-entity.highlight-action\n [${globalsSelector}][${baseSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-context\n [${globalsSelector}][${baseSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-property\n [${globalsSelector}][${baseSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-action.highlight-context\n [${globalsSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-action.highlight-property\n [${globalsSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-context.highlight-property\n [${globalsSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-context),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n /* Triple combinations with distinct layers */\n .highlight-entity.highlight-action.highlight-context\n [${baseSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n /* Triple combinations with property */\n .highlight-entity.highlight-action.highlight-property\n [${baseSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-entity.highlight-context.highlight-property\n [${baseSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-context),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-context.highlight-property\n [${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-context),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n /* Quadruple combinations with globals */\n .highlight-globals.highlight-entity.highlight-action.highlight-context\n [${globalsSelector}][${baseSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-action.highlight-property\n [${globalsSelector}][${baseSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-context.highlight-property\n [${globalsSelector}][${baseSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-action.highlight-context.highlight-property\n [${globalsSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n /* Quadruple combination */\n .highlight-entity.highlight-action.highlight-context.highlight-property\n [${baseSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n /* Quintuple combination with all attributes */\n .highlight-globals.highlight-entity.highlight-action.highlight-context.highlight-property\n [${globalsSelector}][${baseSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-context),\n 0 0 0 10px var(--highlight-property) !important;\n }\n `;\n\n return cssTemplate;\n};\n\n// Function to inject highlighting CSS into story document\nexport const injectHighlightingCSS = (\n storyDoc: Document,\n prefix: string = 'data-elb',\n): void => {\n // Remove existing styles\n const existingStyle = storyDoc.querySelector('#walkeros-highlighting');\n if (existingStyle) {\n existingStyle.remove();\n }\n\n const highlightingStyleElement = storyDoc.createElement('style');\n highlightingStyleElement.id = 'walkeros-highlighting';\n const css = generateHighlightCSS(prefix);\n highlightingStyleElement.textContent = css;\n\n storyDoc.head.appendChild(highlightingStyleElement);\n};\n","// Utilities for managing DOM highlighting\n\nimport type { WalkerOSAddon } from '../types';\nimport {\n getStoryDocument,\n getStoryRootElement,\n enhanceProperties,\n} from './domUtils';\nimport { injectHighlightingCSS } from './cssUtils';\n\n// Function to apply highlighting to story root\nexport const applyHighlighting = (\n highlights: WalkerOSAddon['highlights'],\n prefix: string = 'data-elb',\n): void => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) return;\n\n // Remove existing highlighting classes\n storyRoot.classList.remove('highlight-context');\n storyRoot.classList.remove('highlight-entity');\n storyRoot.classList.remove('highlight-property');\n storyRoot.classList.remove('highlight-action');\n storyRoot.classList.remove('highlight-globals');\n\n if (!highlights) return;\n\n // Re-enhance properties FIRST to ensure they're marked\n enhanceProperties(storyRoot, prefix);\n\n // Then add specific highlighting classes\n if (highlights.context) storyRoot.classList.add('highlight-context');\n if (highlights.entity) storyRoot.classList.add('highlight-entity');\n if (highlights.property) storyRoot.classList.add('highlight-property');\n if (highlights.action) storyRoot.classList.add('highlight-action');\n if (highlights.globals) storyRoot.classList.add('highlight-globals');\n};\n\n// Combined function to inject CSS and apply highlighting\nexport const setupHighlighting = (\n highlights: WalkerOSAddon['highlights'],\n prefix: string = 'data-elb',\n): void => {\n const storyDoc = getStoryDocument();\n\n // Always inject CSS first\n injectHighlightingCSS(storyDoc, prefix);\n\n // Then apply highlighting\n applyHighlighting(highlights, prefix);\n};\n","import type { WalkerOSAddon } from './types';\nimport type { DecoratorFunction } from 'storybook/internal/types';\nimport { addons } from 'storybook/preview-api';\nimport { getAllEvents, getGlobals } from '@walkeros/web-source-browser';\n\nimport { ADDON_ID, EVENTS } from './constants';\nimport { initializeWalker } from './walker';\nimport { getStoryRootElement, enhanceProperties } from './utils/domUtils';\nimport { buildAttributeTree } from './utils/attributeTreeUtils';\nimport { setupHighlighting } from './utils/highlightingUtils';\n\n// Set up the channel listener globally, not per story\nconst channel = addons.getChannel();\nlet currentStoryId: string | null = null;\n\n// Global listener for the request events\nchannel.addListener(EVENTS.REQUEST, (config: WalkerOSAddon) => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) {\n channel.emit(EVENTS.RESULT, []);\n return;\n }\n\n // Enhance DOM with property attributes\n enhanceProperties(storyRoot, config.prefix || 'data-elb');\n\n const events = getAllEvents(storyRoot as Element, config.prefix);\n\n // Collect globals from data-elbglobals attributes\n const globals = getGlobals(config.prefix || 'data-elb', storyRoot as Element);\n\n // Add globals to each event if any globals exist\n const eventsWithGlobals = events.map((event) => {\n if (Object.keys(globals).length > 0) {\n return { ...event, globals };\n }\n return event;\n });\n\n // Send the result back to the manager\n channel.emit(EVENTS.RESULT, eventsWithGlobals);\n});\n\n// Global listener for highlighting events\nchannel.addListener(EVENTS.HIGHLIGHT, (config: WalkerOSAddon) => {\n setupHighlighting(config.highlights, config.prefix);\n});\n\n// Global listener for attribute tree requests\nchannel.addListener(EVENTS.ATTRIBUTES_REQUEST, (config: WalkerOSAddon) => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) {\n channel.emit(EVENTS.ATTRIBUTES_RESULT, []);\n return;\n }\n\n // Build the attribute tree\n const attributeTree = buildAttributeTree(\n storyRoot as Element,\n config.prefix || 'data-elb',\n );\n\n // Send the result back to the manager\n channel.emit(EVENTS.ATTRIBUTES_RESULT, attributeTree);\n});\n\nexport const withRoundTrip: DecoratorFunction = (storyFn, context) => {\n // Check if story changed and auto-run is enabled\n const storyId = context.id;\n const hasStoryChanged = currentStoryId !== storyId;\n const { parameters } = context;\n const autoRefresh = parameters?.[ADDON_ID]?.autoRefresh;\n\n if (hasStoryChanged) {\n currentStoryId = storyId;\n }\n\n const result = storyFn();\n\n // Initialize walker and inject CSS after story renders\n setTimeout(() => {\n // Initialize walkerOS for live event capture\n const prefix = parameters?.[ADDON_ID]?.prefix || 'data-elb';\n initializeWalker({ prefix, autoRefresh }).catch((err) => {\n console.error('Walker initialization failed:', err);\n });\n\n // Inject highlighting CSS and enhance properties\n const storyRoot = getStoryRootElement();\n if (storyRoot) {\n setupHighlighting(undefined, prefix);\n enhanceProperties(storyRoot, prefix);\n }\n\n // Auto-run walker if story changed and auto-refresh is enabled\n if (hasStoryChanged && autoRefresh && window.__storybookElb) {\n window.__storybookElb('walker run');\n }\n }, 200);\n\n return result;\n};\n","/**\n * A decorator is a way to wrap a story in extra “rendering” functionality. Many addons define decorators\n * in order to augment stories:\n * - with extra rendering\n * - gather details about how a story is rendered\n *\n * When writing stories, decorators are typically used to wrap stories with extra markup or context mocking.\n *\n * https://storybook.js.org/docs/react/writing-stories/decorators\n */\nimport type { ProjectAnnotations, Renderer } from 'storybook/internal/types';\n\nimport { ADDON_ID } from './constants';\nimport { withRoundTrip } from './withRoundTrip';\n\n/**\n * Note: if you want to use JSX in this file, rename it to `preview.tsx`\n * and update the entry prop in tsup.config.ts to use \"src/preview.tsx\",\n */\n\nconst preview: ProjectAnnotations<Renderer> = {\n decorators: [withRoundTrip],\n parameters: {\n [ADDON_ID]: {\n autoRefresh: true,\n prefix: 'data-elb',\n },\n },\n};\n\nexport default preview;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/walker.ts","../src/utils/domUtils.ts","../src/utils/attributeTreeUtils.ts","../src/utils/cssUtils.ts","../src/utils/highlightingUtils.ts","../src/withRoundTrip.ts","../src/preview.ts"],"names":["ADDON_ID","EVENTS","destinationConsole","event","context","destinationLive","channel","addons","getIframeContext","iframe","e","initializeWalker","config","iframeDoc","iframeWin","result","startFlow","sourceBrowser","collector","elb","error","getStoryDocument","getStoryRootElement","storyDoc","selectors","selector","element","getElementPath","el","path","current","c","enhanceProperties","storyRoot","prefix","attributes","hasProperties","attr","generateElementHTML","tagName","allAttribs","formattedAttribs","buildAttributeTree","scope","tree","nodeMap","entityAttr","getElbAttributeName","actionAttr","contextAttr","globalsAttr","node","contextValues","getElbValues","globalsValues","properties","propName","parent","parentNode","generateHighlightCSS","globalsSelector","contextSelector","baseSelector","propertySelector","injectHighlightingCSS","existingStyle","highlightingStyleElement","css","applyHighlighting","highlights","setupHighlighting","currentStoryId","events","getAllEvents","globals","getGlobals","eventsWithGlobals","attributeTree","withRoundTrip","storyFn","_a","storyId","hasStoryChanged","parameters","autoRefresh","err","preview","preview_default"],"mappings":"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","file":"preview.cjs","sourcesContent":["export const ADDON_ID = 'walkerOS';\nexport const PANEL_ID = `${ADDON_ID}/panel`;\nexport const KEY = `walkerOS`;\n\nexport const EVENTS = {\n RESULT: `${ADDON_ID}/result`,\n REQUEST: `${ADDON_ID}/request`,\n HIGHLIGHT: `${ADDON_ID}/highlight`,\n LIVE_EVENT: `${ADDON_ID}/live-event`,\n ATTRIBUTES_RESULT: `${ADDON_ID}/attributes-result`,\n ATTRIBUTES_REQUEST: `${ADDON_ID}/attributes-request`,\n};\n","import type { Collector, WalkerOS, Destination } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { sourceBrowser } from '@walkeros/web-source-browser';\nimport { addons } from 'storybook/preview-api';\nimport { EVENTS } from './constants';\n\ndeclare global {\n interface Window {\n __storybookElb: WalkerOS.Elb;\n __storybookWalker: Collector.Instance;\n }\n}\n\n// Simple console destination for Storybook\nconst destinationConsole = {\n type: 'console',\n push: (event: WalkerOS.Event, context: Destination.PushContext) => {\n console.log('Storybook Event:', event);\n },\n config: {},\n};\n\n// Live destination for Storybook panel\nconst destinationLive = {\n type: 'live',\n push: (event: WalkerOS.Event, context: Destination.PushContext) => {\n // Send event to Storybook panel for live display\n const channel = addons.getChannel();\n if (channel) {\n channel.emit(EVENTS.LIVE_EVENT, event);\n }\n },\n config: {},\n};\n\n// Function to get Storybook iframe context\nfunction getIframeContext() {\n try {\n // Try to get iframe from parent document (manager context)\n const iframe = parent.document.querySelector(\n '#storybook-preview-iframe',\n ) as HTMLIFrameElement;\n if (iframe?.contentDocument && iframe?.contentWindow) {\n return {\n document: iframe.contentDocument,\n window: iframe.contentWindow,\n };\n }\n } catch (e) {\n // If we can't access parent, we're likely already in iframe context\n }\n\n // Fallback to current context\n return { document, window };\n}\n\nexport async function initializeWalker(config?: {\n prefix?: string;\n autoRefresh?: boolean;\n}): Promise<void> {\n // Skip initialization if already done\n if (window.__storybookWalker) return;\n\n try {\n // Get iframe context for proper event capture\n const { document: iframeDoc, window: iframeWin } = getIframeContext();\n\n if (!iframeDoc) {\n console.warn('Document not available, skipping walkerOS initialization');\n return;\n }\n\n // Create collector with browser source and destinations\n const result = await startFlow({\n consent: { functional: true },\n sources: {\n browser: {\n code: sourceBrowser,\n config: {\n settings: {\n pageview: true,\n session: false,\n elbLayer: '__storybookElbLayer',\n elb: '__storybookElb',\n prefix: config?.prefix || 'data-elb',\n scope: iframeDoc.body || iframeDoc, // Set scope to iframe document\n },\n },\n env: {\n window: iframeWin,\n document: iframeDoc,\n },\n },\n },\n destinations: {\n console: { code: destinationConsole },\n live: { code: destinationLive },\n },\n });\n\n const { collector, elb } = result;\n\n // Verify collector was created successfully\n if (!collector) {\n throw new Error('Collector creation failed - no collector returned');\n }\n\n // Set global window objects\n window.__storybookWalker = collector;\n window.__storybookElb = elb;\n } catch (error) {\n console.error('Failed to initialize walkerOS:', error);\n }\n}\n","// DOM utilities for working with story elements\n\n// Function to get the story document (either iframe or main document)\nexport const getStoryDocument = (): Document => {\n // Try to find story iframe\n const iframe = document.querySelector(\n '#storybook-preview-iframe',\n ) as HTMLIFrameElement;\n if (iframe?.contentDocument) {\n return iframe.contentDocument;\n }\n // Fallback to main document\n return document;\n};\n\n// Function to get the story root element\nexport const getStoryRootElement = (): Element | null => {\n const storyDoc = getStoryDocument();\n\n // Try multiple selectors for story root\n const selectors = [\n '#storybook-root',\n '#root',\n '[data-testid=\"storybook-root\"]',\n 'body',\n ];\n\n for (const selector of selectors) {\n const element = storyDoc.querySelector(selector);\n if (element) {\n return element;\n }\n }\n\n return storyDoc.body;\n};\n\n// Helper to get element path\nexport const getElementPath = (el: Element): string => {\n const path = [];\n let current = el;\n while (current && current !== document.body && current.parentElement) {\n let selector = current.tagName.toLowerCase();\n if (current.id) {\n selector += `#${current.id}`;\n } else if (current.className && typeof current.className === 'string') {\n selector += `.${current.className\n .split(' ')\n .filter((c) => c)\n .join('.')}`;\n }\n path.unshift(selector);\n current = current.parentElement;\n }\n return path.join(' > ');\n};\n\n// Function to enhance DOM with property attributes\nexport const enhanceProperties = (\n storyRoot: Element,\n prefix: string = 'data-elb',\n): void => {\n // Find all elements with any attributes starting with prefix-\n const allElements = Array.from(storyRoot.querySelectorAll('*'));\n\n allElements.forEach((el) => {\n const attributes = Array.from(el.attributes);\n let hasProperties = false;\n\n attributes.forEach((attr) => {\n // Check if attribute starts with prefix- (e.g., data-elb-button, data-elb-product)\n if (\n attr.name.startsWith(`${prefix}-`) &&\n attr.name !== `${prefix}action` &&\n attr.name !== `${prefix}context` &&\n attr.name !== `${prefix}globals`\n ) {\n hasProperties = true;\n }\n });\n\n // Mark elements with property attributes\n if (hasProperties) {\n el.setAttribute(`${prefix}property`, '');\n }\n });\n};\n","// Utilities for building and managing attribute trees\n\nimport type { WalkerOS } from '@walkeros/core';\nimport type { AttributeNode } from '../types';\nimport {\n getElbAttributeName,\n getElbValues,\n} from '@walkeros/web-source-browser';\nimport { getElementPath } from './domUtils';\n\n// Utility to generate clean HTML markup from an element\nconst generateElementHTML = (element: Element): string => {\n if (!element) return '';\n\n const tagName = element.tagName.toLowerCase();\n const allAttribs: string[] = [];\n\n // Collect ALL attributes as they are\n Array.from(element.attributes).forEach((attr) => {\n allAttribs.push(`${attr.name}=\"${attr.value}\"`);\n });\n\n // If no attributes, return basic element\n if (allAttribs.length === 0) {\n return `<${tagName}></${tagName}>`;\n }\n\n // Format attributes nicely for display\n if (allAttribs.length === 1) {\n return `<${tagName} ${allAttribs[0]}></${tagName}>`;\n }\n\n // Multiple attributes - format with line breaks like dev tools\n const formattedAttribs = allAttribs.map((attr) => ` ${attr}`).join('\\n');\n return `<${tagName}\\n${formattedAttribs}\\n></${tagName}>`;\n};\n\n// Build attribute tree structure\nexport const buildAttributeTree = (\n scope: Element,\n prefix: string = 'data-elb',\n): AttributeNode[] => {\n const tree: AttributeNode[] = [];\n const nodeMap = new Map<Element, AttributeNode>();\n\n // Build selectors for all walker attributes\n const entityAttr = getElbAttributeName(prefix);\n const actionAttr = getElbAttributeName(prefix, 'action', false);\n const contextAttr = getElbAttributeName(prefix, 'context', false);\n const globalsAttr = getElbAttributeName(prefix, 'globals', false);\n\n // Find all elements with walker attributes\n const allElements = Array.from(scope.querySelectorAll('*'));\n const walkerElements = allElements.filter((el) => {\n return Array.from(el.attributes).some(\n (attr) =>\n attr.name === entityAttr ||\n attr.name === actionAttr ||\n attr.name === contextAttr ||\n attr.name === globalsAttr ||\n attr.name.startsWith(`${prefix}-`),\n );\n });\n\n // Build nodes for each element\n walkerElements.forEach((el) => {\n if (nodeMap.has(el)) return; // Already processed\n\n const node: AttributeNode = {\n element: el.tagName.toLowerCase(),\n path: getElementPath(el),\n htmlMarkup: generateElementHTML(el),\n attributes: {},\n children: [],\n };\n\n // Collect all walker attributes on this element\n if (el.hasAttribute(entityAttr)) {\n node.attributes.entity = el.getAttribute(entityAttr) || '';\n }\n\n if (el.hasAttribute(actionAttr)) {\n node.attributes.action = el.getAttribute(actionAttr) || '';\n }\n\n try {\n const contextValues = getElbValues(prefix, el, 'context', false);\n if (Object.keys(contextValues).length > 0) {\n node.attributes.context = contextValues;\n }\n } catch (e) {\n // Skip context if parsing fails\n }\n\n try {\n const globalsValues = getElbValues(prefix, el, 'globals', false);\n if (Object.keys(globalsValues).length > 0) {\n node.attributes.globals = globalsValues;\n }\n } catch (e) {\n // Skip globals if parsing fails\n }\n\n // Collect property attributes\n const properties: WalkerOS.Properties = {};\n Array.from(el.attributes).forEach((attr) => {\n if (attr.name.startsWith(`${prefix}-`)) {\n const propName = attr.name.substring(prefix.length + 1);\n try {\n properties[propName] = getElbValues(prefix, el, propName, true);\n } catch (e) {\n // If parsing fails, just store the raw value\n properties[propName] = attr.value;\n }\n }\n });\n\n if (Object.keys(properties).length > 0) {\n node.attributes.properties = properties;\n }\n\n nodeMap.set(el, node);\n });\n\n // Build tree structure\n nodeMap.forEach((node, element) => {\n let parent = element.parentElement;\n let parentNode = null;\n\n // Find nearest parent with walker attributes\n while (parent && parent !== scope) {\n if (nodeMap.has(parent)) {\n parentNode = nodeMap.get(parent);\n break;\n }\n parent = parent.parentElement;\n }\n\n if (parentNode) {\n parentNode.children.push(node);\n } else {\n tree.push(node);\n }\n });\n\n return tree;\n};\n","// CSS utilities for highlighting DOM elements\n\n// Generate dynamic CSS based on prefix\nexport const generateHighlightCSS = (prefix: string): string => {\n // Define selectors based on prefix\n const globalsSelector = `${prefix}globals`;\n const contextSelector = `${prefix}context`;\n const baseSelector = prefix;\n const propertySelector = `${prefix}property`;\n\n // Template CSS with actual selectors\n const cssTemplate = `\n /* Highlight colors - original from website */\n :root {\n --highlight-globals: #4fc3f7cc;\n --highlight-context: #ffbd44cc;\n --highlight-entity: #00ca4ecc;\n --highlight-property: #ff605ccc;\n --highlight-action: #9900ffcc;\n --highlight-background: #1f2937;\n --highlight-text: #9ca3af;\n --highlight-hover: rgba(255, 255, 255, 0.05);\n --highlight-separator: rgba(255, 255, 255, 0.05);\n }\n\n .highlight-globals [${globalsSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-globals) !important;\n }\n\n .highlight-context [${contextSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-context) !important;\n }\n\n .highlight-entity [${baseSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-entity) !important;\n }\n\n .highlight-property [${propertySelector}] {\n box-shadow: 0 0 0 2px var(--highlight-property) !important;\n }\n\n .highlight-action [${prefix}action] {\n box-shadow: 0 0 0 2px var(--highlight-action) !important;\n }\n\n /* Combined highlights with layered solid borders */\n .highlight-entity.highlight-action [${baseSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity) !important;\n }\n\n .highlight-entity.highlight-context [${baseSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-entity),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-entity.highlight-property [${baseSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-entity),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-context [${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-context.highlight-property [${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-context),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-property [${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n /* Globals combinations */\n .highlight-globals.highlight-entity [${globalsSelector}][${baseSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity) !important;\n }\n\n .highlight-globals.highlight-action [${globalsSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action) !important;\n }\n\n .highlight-globals.highlight-context [${globalsSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-property [${globalsSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n /* Triple combinations with globals */\n .highlight-globals.highlight-entity.highlight-action\n [${globalsSelector}][${baseSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-context\n [${globalsSelector}][${baseSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-property\n [${globalsSelector}][${baseSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-action.highlight-context\n [${globalsSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-action.highlight-property\n [${globalsSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-context.highlight-property\n [${globalsSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-context),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n /* Triple combinations with distinct layers */\n .highlight-entity.highlight-action.highlight-context\n [${baseSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n /* Triple combinations with property */\n .highlight-entity.highlight-action.highlight-property\n [${baseSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-entity.highlight-context.highlight-property\n [${baseSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-context),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-context.highlight-property\n [${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-context),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n /* Quadruple combinations with globals */\n .highlight-globals.highlight-entity.highlight-action.highlight-context\n [${globalsSelector}][${baseSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-action.highlight-property\n [${globalsSelector}][${baseSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-context.highlight-property\n [${globalsSelector}][${baseSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-action.highlight-context.highlight-property\n [${globalsSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n /* Quadruple combination */\n .highlight-entity.highlight-action.highlight-context.highlight-property\n [${baseSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n /* Quintuple combination with all attributes */\n .highlight-globals.highlight-entity.highlight-action.highlight-context.highlight-property\n [${globalsSelector}][${baseSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-context),\n 0 0 0 10px var(--highlight-property) !important;\n }\n `;\n\n return cssTemplate;\n};\n\n// Function to inject highlighting CSS into story document\nexport const injectHighlightingCSS = (\n storyDoc: Document,\n prefix: string = 'data-elb',\n): void => {\n // Remove existing styles\n const existingStyle = storyDoc.querySelector('#walkeros-highlighting');\n if (existingStyle) {\n existingStyle.remove();\n }\n\n const highlightingStyleElement = storyDoc.createElement('style');\n highlightingStyleElement.id = 'walkeros-highlighting';\n const css = generateHighlightCSS(prefix);\n highlightingStyleElement.textContent = css;\n\n storyDoc.head.appendChild(highlightingStyleElement);\n};\n","// Utilities for managing DOM highlighting\n\nimport type { WalkerOSAddon } from '../types';\nimport {\n getStoryDocument,\n getStoryRootElement,\n enhanceProperties,\n} from './domUtils';\nimport { injectHighlightingCSS } from './cssUtils';\n\n// Function to apply highlighting to story root\nexport const applyHighlighting = (\n highlights: WalkerOSAddon['highlights'],\n prefix: string = 'data-elb',\n): void => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) return;\n\n // Remove existing highlighting classes\n storyRoot.classList.remove('highlight-context');\n storyRoot.classList.remove('highlight-entity');\n storyRoot.classList.remove('highlight-property');\n storyRoot.classList.remove('highlight-action');\n storyRoot.classList.remove('highlight-globals');\n\n if (!highlights) return;\n\n // Re-enhance properties FIRST to ensure they're marked\n enhanceProperties(storyRoot, prefix);\n\n // Then add specific highlighting classes\n if (highlights.context) storyRoot.classList.add('highlight-context');\n if (highlights.entity) storyRoot.classList.add('highlight-entity');\n if (highlights.property) storyRoot.classList.add('highlight-property');\n if (highlights.action) storyRoot.classList.add('highlight-action');\n if (highlights.globals) storyRoot.classList.add('highlight-globals');\n};\n\n// Combined function to inject CSS and apply highlighting\nexport const setupHighlighting = (\n highlights: WalkerOSAddon['highlights'],\n prefix: string = 'data-elb',\n): void => {\n const storyDoc = getStoryDocument();\n\n // Always inject CSS first\n injectHighlightingCSS(storyDoc, prefix);\n\n // Then apply highlighting\n applyHighlighting(highlights, prefix);\n};\n","import type { WalkerOSAddon } from './types';\nimport type { DecoratorFunction } from 'storybook/internal/types';\nimport { addons } from 'storybook/preview-api';\nimport { getAllEvents, getGlobals } from '@walkeros/web-source-browser';\n\nimport { ADDON_ID, EVENTS } from './constants';\nimport { initializeWalker } from './walker';\nimport { getStoryRootElement, enhanceProperties } from './utils/domUtils';\nimport { buildAttributeTree } from './utils/attributeTreeUtils';\nimport { setupHighlighting } from './utils/highlightingUtils';\n\n// Set up the channel listener globally, not per story\nconst channel = addons.getChannel();\nlet currentStoryId: string | null = null;\n\n// Global listener for the request events\nchannel.addListener(EVENTS.REQUEST, (config: WalkerOSAddon) => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) {\n channel.emit(EVENTS.RESULT, []);\n return;\n }\n\n // Enhance DOM with property attributes\n enhanceProperties(storyRoot, config.prefix || 'data-elb');\n\n const events = getAllEvents(storyRoot as Element, config.prefix);\n\n // Collect globals from data-elbglobals attributes\n const globals = getGlobals(config.prefix || 'data-elb', storyRoot as Element);\n\n // Add globals to each event if any globals exist\n const eventsWithGlobals = events.map((event) => {\n if (Object.keys(globals).length > 0) {\n return { ...event, globals };\n }\n return event;\n });\n\n // Send the result back to the manager\n channel.emit(EVENTS.RESULT, eventsWithGlobals);\n});\n\n// Global listener for highlighting events\nchannel.addListener(EVENTS.HIGHLIGHT, (config: WalkerOSAddon) => {\n setupHighlighting(config.highlights, config.prefix);\n});\n\n// Global listener for attribute tree requests\nchannel.addListener(EVENTS.ATTRIBUTES_REQUEST, (config: WalkerOSAddon) => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) {\n channel.emit(EVENTS.ATTRIBUTES_RESULT, []);\n return;\n }\n\n // Build the attribute tree\n const attributeTree = buildAttributeTree(\n storyRoot as Element,\n config.prefix || 'data-elb',\n );\n\n // Send the result back to the manager\n channel.emit(EVENTS.ATTRIBUTES_RESULT, attributeTree);\n});\n\nexport const withRoundTrip: DecoratorFunction = (storyFn, context) => {\n // Check if story changed and auto-run is enabled\n const storyId = context.id;\n const hasStoryChanged = currentStoryId !== storyId;\n const { parameters } = context;\n const autoRefresh = parameters?.[ADDON_ID]?.autoRefresh;\n\n if (hasStoryChanged) {\n currentStoryId = storyId;\n }\n\n const result = storyFn();\n\n // Initialize walker and inject CSS after story renders\n setTimeout(() => {\n // Initialize walkerOS for live event capture\n const prefix = parameters?.[ADDON_ID]?.prefix || 'data-elb';\n initializeWalker({ prefix, autoRefresh }).catch((err) => {\n console.error('Walker initialization failed:', err);\n });\n\n // Inject highlighting CSS and enhance properties\n const storyRoot = getStoryRootElement();\n if (storyRoot) {\n setupHighlighting(undefined, prefix);\n enhanceProperties(storyRoot, prefix);\n }\n\n // Auto-run walker if story changed and auto-refresh is enabled\n if (hasStoryChanged && autoRefresh && window.__storybookElb) {\n window.__storybookElb('walker run');\n }\n }, 200);\n\n return result;\n};\n","/**\n * A decorator is a way to wrap a story in extra “rendering” functionality. Many addons define decorators\n * in order to augment stories:\n * - with extra rendering\n * - gather details about how a story is rendered\n *\n * When writing stories, decorators are typically used to wrap stories with extra markup or context mocking.\n *\n * https://storybook.js.org/docs/react/writing-stories/decorators\n */\nimport type { ProjectAnnotations, Renderer } from 'storybook/internal/types';\n\nimport { ADDON_ID } from './constants';\nimport { withRoundTrip } from './withRoundTrip';\n\n/**\n * Note: if you want to use JSX in this file, rename it to `preview.tsx`\n * and update the entry prop in tsup.config.ts to use \"src/preview.tsx\",\n */\n\nconst preview: ProjectAnnotations<Renderer> = {\n decorators: [withRoundTrip],\n parameters: {\n [ADDON_ID]: {\n autoRefresh: true,\n prefix: 'data-elb',\n },\n },\n};\n\nexport default preview;\n"]}
|
package/dist/preview.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {addons}from'storybook/preview-api';import {getAllEvents,getGlobals,getElbAttributeName,getElbValues,sourceBrowser}from'@walkeros/web-source-browser';import {startFlow}from'@walkeros/collector';var g="walkerOS";var c={RESULT:`${g}/result`,REQUEST:`${g}/request`,HIGHLIGHT:`${g}/highlight`,LIVE_EVENT:`${g}/live-event`,ATTRIBUTES_RESULT:`${g}/attributes-result`,ATTRIBUTES_REQUEST:`${g}/attributes-request`};var N={type:"console",push:(t,i)=>{console.log("Storybook Event:",t);},config:{}},O={type:"live",push:(t,i)=>{let o=addons.getChannel();o&&o.emit(c.LIVE_EVENT,t);},config:{}};function I(){try{let t=parent.document.querySelector("#storybook-preview-iframe");if(t!=null&&t.contentDocument&&(t!=null&&t.contentWindow))return {document:t.contentDocument,window:t.contentWindow}}catch(t){}return {document,window}}async function S(t){if(!window.__storybookWalker)try{let{document:i,window:o}=I();if(!i){console.warn("Document not available, skipping walkerOS initialization");return}let h=await startFlow({
|
|
1
|
+
import {addons}from'storybook/preview-api';import {getAllEvents,getGlobals,getElbAttributeName,getElbValues,sourceBrowser}from'@walkeros/web-source-browser';import {startFlow}from'@walkeros/collector';var g="walkerOS";var c={RESULT:`${g}/result`,REQUEST:`${g}/request`,HIGHLIGHT:`${g}/highlight`,LIVE_EVENT:`${g}/live-event`,ATTRIBUTES_RESULT:`${g}/attributes-result`,ATTRIBUTES_REQUEST:`${g}/attributes-request`};var N={type:"console",push:(t,i)=>{console.log("Storybook Event:",t);},config:{}},O={type:"live",push:(t,i)=>{let o=addons.getChannel();o&&o.emit(c.LIVE_EVENT,t);},config:{}};function I(){try{let t=parent.document.querySelector("#storybook-preview-iframe");if(t!=null&&t.contentDocument&&(t!=null&&t.contentWindow))return {document:t.contentDocument,window:t.contentWindow}}catch(t){}return {document,window}}async function S(t){if(!window.__storybookWalker)try{let{document:i,window:o}=I();if(!i){console.warn("Document not available, skipping walkerOS initialization");return}let h=await startFlow({consent:{functional:!0},sources:{browser:{code:sourceBrowser,config:{settings:{pageview:!0,session:!1,elbLayer:"__storybookElbLayer",elb:"__storybookElb",prefix:(t==null?void 0:t.prefix)||"data-elb",scope:i.body||i}},env:{window:o,document:i}}},destinations:{console:{code:N},live:{code:O}}}),{collector:e,elb:l}=h;if(!e)throw new Error("Collector creation failed - no collector returned");window.__storybookWalker=e,window.__storybookElb=l;}catch(i){console.error("Failed to initialize walkerOS:",i);}}var w=()=>{let t=document.querySelector("#storybook-preview-iframe");return t!=null&&t.contentDocument?t.contentDocument:document},b=()=>{let t=w(),i=["#storybook-root","#root",'[data-testid="storybook-root"]',"body"];for(let o of i){let h=t.querySelector(o);if(h)return h}return t.body},k=t=>{let i=[],o=t;for(;o&&o!==document.body&&o.parentElement;){let h=o.tagName.toLowerCase();o.id?h+=`#${o.id}`:o.className&&typeof o.className=="string"&&(h+=`.${o.className.split(" ").filter(e=>e).join(".")}`),i.unshift(h),o=o.parentElement;}return i.join(" > ")},d=(t,i="data-elb")=>{Array.from(t.querySelectorAll("*")).forEach(h=>{let e=Array.from(h.attributes),l=false;e.forEach(p=>{p.name.startsWith(`${i}-`)&&p.name!==`${i}action`&&p.name!==`${i}context`&&p.name!==`${i}globals`&&(l=true);}),l&&h.setAttribute(`${i}property`,"");});};var C=t=>{if(!t)return "";let i=t.tagName.toLowerCase(),o=[];if(Array.from(t.attributes).forEach(e=>{o.push(`${e.name}="${e.value}"`);}),o.length===0)return `<${i}></${i}>`;if(o.length===1)return `<${i} ${o[0]}></${i}>`;let h=o.map(e=>` ${e}`).join(`
|
|
2
2
|
`);return `<${i}
|
|
3
3
|
${h}
|
|
4
4
|
></${i}>`},A=(t,i="data-elb")=>{let o=[],h=new Map,e=getElbAttributeName(i),l=getElbAttributeName(i,"action",false),p=getElbAttributeName(i,"context",false),x=getElbAttributeName(i,"globals",false);return Array.from(t.querySelectorAll("*")).filter(r=>Array.from(r.attributes).some(n=>n.name===e||n.name===l||n.name===p||n.name===x||n.name.startsWith(`${i}-`))).forEach(r=>{if(h.has(r))return;let n={element:r.tagName.toLowerCase(),path:k(r),htmlMarkup:C(r),attributes:{},children:[]};r.hasAttribute(e)&&(n.attributes.entity=r.getAttribute(e)||""),r.hasAttribute(l)&&(n.attributes.action=r.getAttribute(l)||"");try{let a=getElbValues(i,r,"context",!1);Object.keys(a).length>0&&(n.attributes.context=a);}catch(a){}try{let a=getElbValues(i,r,"globals",!1);Object.keys(a).length>0&&(n.attributes.globals=a);}catch(a){}let s={};Array.from(r.attributes).forEach(a=>{if(a.name.startsWith(`${i}-`)){let $=a.name.substring(i.length+1);try{s[$]=getElbValues(i,r,$,!0);}catch(G){s[$]=a.value;}}}),Object.keys(s).length>0&&(n.attributes.properties=s),h.set(r,n);}),h.forEach((r,n)=>{let s=n.parentElement,a=null;for(;s&&s!==t;){if(h.has(s)){a=h.get(s);break}s=s.parentElement;}a?a.children.push(r):o.push(r);}),o};var H=t=>{let i=`${t}globals`,o=`${t}context`,h=t,e=`${t}property`;return `
|
package/dist/preview.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/walker.ts","../src/utils/domUtils.ts","../src/utils/attributeTreeUtils.ts","../src/utils/cssUtils.ts","../src/utils/highlightingUtils.ts","../src/withRoundTrip.ts","../src/preview.ts"],"names":["ADDON_ID","EVENTS","destinationConsole","event","context","destinationLive","channel","addons","getIframeContext","iframe","e","initializeWalker","config","iframeDoc","iframeWin","result","startFlow","sourceBrowser","collector","elb","error","getStoryDocument","getStoryRootElement","storyDoc","selectors","selector","element","getElementPath","el","path","current","c","enhanceProperties","storyRoot","prefix","attributes","hasProperties","attr","generateElementHTML","tagName","allAttribs","formattedAttribs","buildAttributeTree","scope","tree","nodeMap","entityAttr","getElbAttributeName","actionAttr","contextAttr","globalsAttr","node","contextValues","getElbValues","globalsValues","properties","propName","parent","parentNode","generateHighlightCSS","globalsSelector","contextSelector","baseSelector","propertySelector","injectHighlightingCSS","existingStyle","highlightingStyleElement","css","applyHighlighting","highlights","setupHighlighting","currentStoryId","events","getAllEvents","globals","getGlobals","eventsWithGlobals","attributeTree","withRoundTrip","storyFn","_a","storyId","hasStoryChanged","parameters","autoRefresh","err","preview","preview_default"],"mappings":"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","file":"preview.js","sourcesContent":["export const ADDON_ID = 'walkerOS';\nexport const PANEL_ID = `${ADDON_ID}/panel`;\nexport const KEY = `walkerOS`;\n\nexport const EVENTS = {\n RESULT: `${ADDON_ID}/result`,\n REQUEST: `${ADDON_ID}/request`,\n HIGHLIGHT: `${ADDON_ID}/highlight`,\n LIVE_EVENT: `${ADDON_ID}/live-event`,\n ATTRIBUTES_RESULT: `${ADDON_ID}/attributes-result`,\n ATTRIBUTES_REQUEST: `${ADDON_ID}/attributes-request`,\n};\n","import type { Collector, WalkerOS, Destination } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { sourceBrowser } from '@walkeros/web-source-browser';\nimport { addons } from 'storybook/preview-api';\nimport { EVENTS } from './constants';\n\ndeclare global {\n interface Window {\n __storybookElb: WalkerOS.Elb;\n __storybookWalker: Collector.Instance;\n }\n}\n\n// Simple console destination for Storybook\nconst destinationConsole = {\n type: 'console',\n push: (event: WalkerOS.Event, context: Destination.PushContext) => {\n console.log('Storybook Event:', event);\n },\n config: {},\n};\n\n// Live destination for Storybook panel\nconst destinationLive = {\n type: 'live',\n push: (event: WalkerOS.Event, context: Destination.PushContext) => {\n // Send event to Storybook panel for live display\n const channel = addons.getChannel();\n if (channel) {\n channel.emit(EVENTS.LIVE_EVENT, event);\n }\n },\n config: {},\n};\n\n// Function to get Storybook iframe context\nfunction getIframeContext() {\n try {\n // Try to get iframe from parent document (manager context)\n const iframe = parent.document.querySelector(\n '#storybook-preview-iframe',\n ) as HTMLIFrameElement;\n if (iframe?.contentDocument && iframe?.contentWindow) {\n return {\n document: iframe.contentDocument,\n window: iframe.contentWindow,\n };\n }\n } catch (e) {\n // If we can't access parent, we're likely already in iframe context\n }\n\n // Fallback to current context\n return { document, window };\n}\n\nexport async function initializeWalker(config?: {\n prefix?: string;\n autoRefresh?: boolean;\n}): Promise<void> {\n // Skip initialization if already done\n if (window.__storybookWalker) return;\n\n try {\n // Get iframe context for proper event capture\n const { document: iframeDoc, window: iframeWin } = getIframeContext();\n\n if (!iframeDoc) {\n console.warn('Document not available, skipping walkerOS initialization');\n return;\n }\n\n // Create collector with browser source and destinations\n const result = await startFlow({\n run: true,\n consent: { functional: true },\n sources: {\n browser: {\n code: sourceBrowser,\n config: {\n settings: {\n pageview: true,\n session: false,\n elbLayer: '__storybookElbLayer',\n elb: '__storybookElb',\n prefix: config?.prefix || 'data-elb',\n scope: iframeDoc.body || iframeDoc, // Set scope to iframe document\n },\n },\n env: {\n window: iframeWin,\n document: iframeDoc,\n },\n },\n },\n destinations: {\n console: { code: destinationConsole },\n live: { code: destinationLive },\n },\n });\n\n const { collector, elb } = result;\n\n // Verify collector was created successfully\n if (!collector) {\n throw new Error('Collector creation failed - no collector returned');\n }\n\n // Set global window objects\n window.__storybookWalker = collector;\n window.__storybookElb = elb;\n } catch (error) {\n console.error('Failed to initialize walkerOS:', error);\n }\n}\n","// DOM utilities for working with story elements\n\n// Function to get the story document (either iframe or main document)\nexport const getStoryDocument = (): Document => {\n // Try to find story iframe\n const iframe = document.querySelector(\n '#storybook-preview-iframe',\n ) as HTMLIFrameElement;\n if (iframe?.contentDocument) {\n return iframe.contentDocument;\n }\n // Fallback to main document\n return document;\n};\n\n// Function to get the story root element\nexport const getStoryRootElement = (): Element | null => {\n const storyDoc = getStoryDocument();\n\n // Try multiple selectors for story root\n const selectors = [\n '#storybook-root',\n '#root',\n '[data-testid=\"storybook-root\"]',\n 'body',\n ];\n\n for (const selector of selectors) {\n const element = storyDoc.querySelector(selector);\n if (element) {\n return element;\n }\n }\n\n return storyDoc.body;\n};\n\n// Helper to get element path\nexport const getElementPath = (el: Element): string => {\n const path = [];\n let current = el;\n while (current && current !== document.body && current.parentElement) {\n let selector = current.tagName.toLowerCase();\n if (current.id) {\n selector += `#${current.id}`;\n } else if (current.className && typeof current.className === 'string') {\n selector += `.${current.className\n .split(' ')\n .filter((c) => c)\n .join('.')}`;\n }\n path.unshift(selector);\n current = current.parentElement;\n }\n return path.join(' > ');\n};\n\n// Function to enhance DOM with property attributes\nexport const enhanceProperties = (\n storyRoot: Element,\n prefix: string = 'data-elb',\n): void => {\n // Find all elements with any attributes starting with prefix-\n const allElements = Array.from(storyRoot.querySelectorAll('*'));\n\n allElements.forEach((el) => {\n const attributes = Array.from(el.attributes);\n let hasProperties = false;\n\n attributes.forEach((attr) => {\n // Check if attribute starts with prefix- (e.g., data-elb-button, data-elb-product)\n if (\n attr.name.startsWith(`${prefix}-`) &&\n attr.name !== `${prefix}action` &&\n attr.name !== `${prefix}context` &&\n attr.name !== `${prefix}globals`\n ) {\n hasProperties = true;\n }\n });\n\n // Mark elements with property attributes\n if (hasProperties) {\n el.setAttribute(`${prefix}property`, '');\n }\n });\n};\n","// Utilities for building and managing attribute trees\n\nimport type { WalkerOS } from '@walkeros/core';\nimport type { AttributeNode } from '../types';\nimport {\n getElbAttributeName,\n getElbValues,\n} from '@walkeros/web-source-browser';\nimport { getElementPath } from './domUtils';\n\n// Utility to generate clean HTML markup from an element\nconst generateElementHTML = (element: Element): string => {\n if (!element) return '';\n\n const tagName = element.tagName.toLowerCase();\n const allAttribs: string[] = [];\n\n // Collect ALL attributes as they are\n Array.from(element.attributes).forEach((attr) => {\n allAttribs.push(`${attr.name}=\"${attr.value}\"`);\n });\n\n // If no attributes, return basic element\n if (allAttribs.length === 0) {\n return `<${tagName}></${tagName}>`;\n }\n\n // Format attributes nicely for display\n if (allAttribs.length === 1) {\n return `<${tagName} ${allAttribs[0]}></${tagName}>`;\n }\n\n // Multiple attributes - format with line breaks like dev tools\n const formattedAttribs = allAttribs.map((attr) => ` ${attr}`).join('\\n');\n return `<${tagName}\\n${formattedAttribs}\\n></${tagName}>`;\n};\n\n// Build attribute tree structure\nexport const buildAttributeTree = (\n scope: Element,\n prefix: string = 'data-elb',\n): AttributeNode[] => {\n const tree: AttributeNode[] = [];\n const nodeMap = new Map<Element, AttributeNode>();\n\n // Build selectors for all walker attributes\n const entityAttr = getElbAttributeName(prefix);\n const actionAttr = getElbAttributeName(prefix, 'action', false);\n const contextAttr = getElbAttributeName(prefix, 'context', false);\n const globalsAttr = getElbAttributeName(prefix, 'globals', false);\n\n // Find all elements with walker attributes\n const allElements = Array.from(scope.querySelectorAll('*'));\n const walkerElements = allElements.filter((el) => {\n return Array.from(el.attributes).some(\n (attr) =>\n attr.name === entityAttr ||\n attr.name === actionAttr ||\n attr.name === contextAttr ||\n attr.name === globalsAttr ||\n attr.name.startsWith(`${prefix}-`),\n );\n });\n\n // Build nodes for each element\n walkerElements.forEach((el) => {\n if (nodeMap.has(el)) return; // Already processed\n\n const node: AttributeNode = {\n element: el.tagName.toLowerCase(),\n path: getElementPath(el),\n htmlMarkup: generateElementHTML(el),\n attributes: {},\n children: [],\n };\n\n // Collect all walker attributes on this element\n if (el.hasAttribute(entityAttr)) {\n node.attributes.entity = el.getAttribute(entityAttr) || '';\n }\n\n if (el.hasAttribute(actionAttr)) {\n node.attributes.action = el.getAttribute(actionAttr) || '';\n }\n\n try {\n const contextValues = getElbValues(prefix, el, 'context', false);\n if (Object.keys(contextValues).length > 0) {\n node.attributes.context = contextValues;\n }\n } catch (e) {\n // Skip context if parsing fails\n }\n\n try {\n const globalsValues = getElbValues(prefix, el, 'globals', false);\n if (Object.keys(globalsValues).length > 0) {\n node.attributes.globals = globalsValues;\n }\n } catch (e) {\n // Skip globals if parsing fails\n }\n\n // Collect property attributes\n const properties: WalkerOS.Properties = {};\n Array.from(el.attributes).forEach((attr) => {\n if (attr.name.startsWith(`${prefix}-`)) {\n const propName = attr.name.substring(prefix.length + 1);\n try {\n properties[propName] = getElbValues(prefix, el, propName, true);\n } catch (e) {\n // If parsing fails, just store the raw value\n properties[propName] = attr.value;\n }\n }\n });\n\n if (Object.keys(properties).length > 0) {\n node.attributes.properties = properties;\n }\n\n nodeMap.set(el, node);\n });\n\n // Build tree structure\n nodeMap.forEach((node, element) => {\n let parent = element.parentElement;\n let parentNode = null;\n\n // Find nearest parent with walker attributes\n while (parent && parent !== scope) {\n if (nodeMap.has(parent)) {\n parentNode = nodeMap.get(parent);\n break;\n }\n parent = parent.parentElement;\n }\n\n if (parentNode) {\n parentNode.children.push(node);\n } else {\n tree.push(node);\n }\n });\n\n return tree;\n};\n","// CSS utilities for highlighting DOM elements\n\n// Generate dynamic CSS based on prefix\nexport const generateHighlightCSS = (prefix: string): string => {\n // Define selectors based on prefix\n const globalsSelector = `${prefix}globals`;\n const contextSelector = `${prefix}context`;\n const baseSelector = prefix;\n const propertySelector = `${prefix}property`;\n\n // Template CSS with actual selectors\n const cssTemplate = `\n /* Highlight colors - original from website */\n :root {\n --highlight-globals: #4fc3f7cc;\n --highlight-context: #ffbd44cc;\n --highlight-entity: #00ca4ecc;\n --highlight-property: #ff605ccc;\n --highlight-action: #9900ffcc;\n --highlight-background: #1f2937;\n --highlight-text: #9ca3af;\n --highlight-hover: rgba(255, 255, 255, 0.05);\n --highlight-separator: rgba(255, 255, 255, 0.05);\n }\n\n .highlight-globals [${globalsSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-globals) !important;\n }\n\n .highlight-context [${contextSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-context) !important;\n }\n\n .highlight-entity [${baseSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-entity) !important;\n }\n\n .highlight-property [${propertySelector}] {\n box-shadow: 0 0 0 2px var(--highlight-property) !important;\n }\n\n .highlight-action [${prefix}action] {\n box-shadow: 0 0 0 2px var(--highlight-action) !important;\n }\n\n /* Combined highlights with layered solid borders */\n .highlight-entity.highlight-action [${baseSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity) !important;\n }\n\n .highlight-entity.highlight-context [${baseSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-entity),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-entity.highlight-property [${baseSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-entity),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-context [${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-context.highlight-property [${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-context),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-property [${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n /* Globals combinations */\n .highlight-globals.highlight-entity [${globalsSelector}][${baseSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity) !important;\n }\n\n .highlight-globals.highlight-action [${globalsSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action) !important;\n }\n\n .highlight-globals.highlight-context [${globalsSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-property [${globalsSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n /* Triple combinations with globals */\n .highlight-globals.highlight-entity.highlight-action\n [${globalsSelector}][${baseSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-context\n [${globalsSelector}][${baseSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-property\n [${globalsSelector}][${baseSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-action.highlight-context\n [${globalsSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-action.highlight-property\n [${globalsSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-context.highlight-property\n [${globalsSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-context),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n /* Triple combinations with distinct layers */\n .highlight-entity.highlight-action.highlight-context\n [${baseSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n /* Triple combinations with property */\n .highlight-entity.highlight-action.highlight-property\n [${baseSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-entity.highlight-context.highlight-property\n [${baseSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-context),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-context.highlight-property\n [${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-context),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n /* Quadruple combinations with globals */\n .highlight-globals.highlight-entity.highlight-action.highlight-context\n [${globalsSelector}][${baseSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-action.highlight-property\n [${globalsSelector}][${baseSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-context.highlight-property\n [${globalsSelector}][${baseSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-action.highlight-context.highlight-property\n [${globalsSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n /* Quadruple combination */\n .highlight-entity.highlight-action.highlight-context.highlight-property\n [${baseSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n /* Quintuple combination with all attributes */\n .highlight-globals.highlight-entity.highlight-action.highlight-context.highlight-property\n [${globalsSelector}][${baseSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-context),\n 0 0 0 10px var(--highlight-property) !important;\n }\n `;\n\n return cssTemplate;\n};\n\n// Function to inject highlighting CSS into story document\nexport const injectHighlightingCSS = (\n storyDoc: Document,\n prefix: string = 'data-elb',\n): void => {\n // Remove existing styles\n const existingStyle = storyDoc.querySelector('#walkeros-highlighting');\n if (existingStyle) {\n existingStyle.remove();\n }\n\n const highlightingStyleElement = storyDoc.createElement('style');\n highlightingStyleElement.id = 'walkeros-highlighting';\n const css = generateHighlightCSS(prefix);\n highlightingStyleElement.textContent = css;\n\n storyDoc.head.appendChild(highlightingStyleElement);\n};\n","// Utilities for managing DOM highlighting\n\nimport type { WalkerOSAddon } from '../types';\nimport {\n getStoryDocument,\n getStoryRootElement,\n enhanceProperties,\n} from './domUtils';\nimport { injectHighlightingCSS } from './cssUtils';\n\n// Function to apply highlighting to story root\nexport const applyHighlighting = (\n highlights: WalkerOSAddon['highlights'],\n prefix: string = 'data-elb',\n): void => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) return;\n\n // Remove existing highlighting classes\n storyRoot.classList.remove('highlight-context');\n storyRoot.classList.remove('highlight-entity');\n storyRoot.classList.remove('highlight-property');\n storyRoot.classList.remove('highlight-action');\n storyRoot.classList.remove('highlight-globals');\n\n if (!highlights) return;\n\n // Re-enhance properties FIRST to ensure they're marked\n enhanceProperties(storyRoot, prefix);\n\n // Then add specific highlighting classes\n if (highlights.context) storyRoot.classList.add('highlight-context');\n if (highlights.entity) storyRoot.classList.add('highlight-entity');\n if (highlights.property) storyRoot.classList.add('highlight-property');\n if (highlights.action) storyRoot.classList.add('highlight-action');\n if (highlights.globals) storyRoot.classList.add('highlight-globals');\n};\n\n// Combined function to inject CSS and apply highlighting\nexport const setupHighlighting = (\n highlights: WalkerOSAddon['highlights'],\n prefix: string = 'data-elb',\n): void => {\n const storyDoc = getStoryDocument();\n\n // Always inject CSS first\n injectHighlightingCSS(storyDoc, prefix);\n\n // Then apply highlighting\n applyHighlighting(highlights, prefix);\n};\n","import type { WalkerOSAddon } from './types';\nimport type { DecoratorFunction } from 'storybook/internal/types';\nimport { addons } from 'storybook/preview-api';\nimport { getAllEvents, getGlobals } from '@walkeros/web-source-browser';\n\nimport { ADDON_ID, EVENTS } from './constants';\nimport { initializeWalker } from './walker';\nimport { getStoryRootElement, enhanceProperties } from './utils/domUtils';\nimport { buildAttributeTree } from './utils/attributeTreeUtils';\nimport { setupHighlighting } from './utils/highlightingUtils';\n\n// Set up the channel listener globally, not per story\nconst channel = addons.getChannel();\nlet currentStoryId: string | null = null;\n\n// Global listener for the request events\nchannel.addListener(EVENTS.REQUEST, (config: WalkerOSAddon) => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) {\n channel.emit(EVENTS.RESULT, []);\n return;\n }\n\n // Enhance DOM with property attributes\n enhanceProperties(storyRoot, config.prefix || 'data-elb');\n\n const events = getAllEvents(storyRoot as Element, config.prefix);\n\n // Collect globals from data-elbglobals attributes\n const globals = getGlobals(config.prefix || 'data-elb', storyRoot as Element);\n\n // Add globals to each event if any globals exist\n const eventsWithGlobals = events.map((event) => {\n if (Object.keys(globals).length > 0) {\n return { ...event, globals };\n }\n return event;\n });\n\n // Send the result back to the manager\n channel.emit(EVENTS.RESULT, eventsWithGlobals);\n});\n\n// Global listener for highlighting events\nchannel.addListener(EVENTS.HIGHLIGHT, (config: WalkerOSAddon) => {\n setupHighlighting(config.highlights, config.prefix);\n});\n\n// Global listener for attribute tree requests\nchannel.addListener(EVENTS.ATTRIBUTES_REQUEST, (config: WalkerOSAddon) => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) {\n channel.emit(EVENTS.ATTRIBUTES_RESULT, []);\n return;\n }\n\n // Build the attribute tree\n const attributeTree = buildAttributeTree(\n storyRoot as Element,\n config.prefix || 'data-elb',\n );\n\n // Send the result back to the manager\n channel.emit(EVENTS.ATTRIBUTES_RESULT, attributeTree);\n});\n\nexport const withRoundTrip: DecoratorFunction = (storyFn, context) => {\n // Check if story changed and auto-run is enabled\n const storyId = context.id;\n const hasStoryChanged = currentStoryId !== storyId;\n const { parameters } = context;\n const autoRefresh = parameters?.[ADDON_ID]?.autoRefresh;\n\n if (hasStoryChanged) {\n currentStoryId = storyId;\n }\n\n const result = storyFn();\n\n // Initialize walker and inject CSS after story renders\n setTimeout(() => {\n // Initialize walkerOS for live event capture\n const prefix = parameters?.[ADDON_ID]?.prefix || 'data-elb';\n initializeWalker({ prefix, autoRefresh }).catch((err) => {\n console.error('Walker initialization failed:', err);\n });\n\n // Inject highlighting CSS and enhance properties\n const storyRoot = getStoryRootElement();\n if (storyRoot) {\n setupHighlighting(undefined, prefix);\n enhanceProperties(storyRoot, prefix);\n }\n\n // Auto-run walker if story changed and auto-refresh is enabled\n if (hasStoryChanged && autoRefresh && window.__storybookElb) {\n window.__storybookElb('walker run');\n }\n }, 200);\n\n return result;\n};\n","/**\n * A decorator is a way to wrap a story in extra “rendering” functionality. Many addons define decorators\n * in order to augment stories:\n * - with extra rendering\n * - gather details about how a story is rendered\n *\n * When writing stories, decorators are typically used to wrap stories with extra markup or context mocking.\n *\n * https://storybook.js.org/docs/react/writing-stories/decorators\n */\nimport type { ProjectAnnotations, Renderer } from 'storybook/internal/types';\n\nimport { ADDON_ID } from './constants';\nimport { withRoundTrip } from './withRoundTrip';\n\n/**\n * Note: if you want to use JSX in this file, rename it to `preview.tsx`\n * and update the entry prop in tsup.config.ts to use \"src/preview.tsx\",\n */\n\nconst preview: ProjectAnnotations<Renderer> = {\n decorators: [withRoundTrip],\n parameters: {\n [ADDON_ID]: {\n autoRefresh: true,\n prefix: 'data-elb',\n },\n },\n};\n\nexport default preview;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/walker.ts","../src/utils/domUtils.ts","../src/utils/attributeTreeUtils.ts","../src/utils/cssUtils.ts","../src/utils/highlightingUtils.ts","../src/withRoundTrip.ts","../src/preview.ts"],"names":["ADDON_ID","EVENTS","destinationConsole","event","context","destinationLive","channel","addons","getIframeContext","iframe","e","initializeWalker","config","iframeDoc","iframeWin","result","startFlow","sourceBrowser","collector","elb","error","getStoryDocument","getStoryRootElement","storyDoc","selectors","selector","element","getElementPath","el","path","current","c","enhanceProperties","storyRoot","prefix","attributes","hasProperties","attr","generateElementHTML","tagName","allAttribs","formattedAttribs","buildAttributeTree","scope","tree","nodeMap","entityAttr","getElbAttributeName","actionAttr","contextAttr","globalsAttr","node","contextValues","getElbValues","globalsValues","properties","propName","parent","parentNode","generateHighlightCSS","globalsSelector","contextSelector","baseSelector","propertySelector","injectHighlightingCSS","existingStyle","highlightingStyleElement","css","applyHighlighting","highlights","setupHighlighting","currentStoryId","events","getAllEvents","globals","getGlobals","eventsWithGlobals","attributeTree","withRoundTrip","storyFn","_a","storyId","hasStoryChanged","parameters","autoRefresh","err","preview","preview_default"],"mappings":"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","file":"preview.js","sourcesContent":["export const ADDON_ID = 'walkerOS';\nexport const PANEL_ID = `${ADDON_ID}/panel`;\nexport const KEY = `walkerOS`;\n\nexport const EVENTS = {\n RESULT: `${ADDON_ID}/result`,\n REQUEST: `${ADDON_ID}/request`,\n HIGHLIGHT: `${ADDON_ID}/highlight`,\n LIVE_EVENT: `${ADDON_ID}/live-event`,\n ATTRIBUTES_RESULT: `${ADDON_ID}/attributes-result`,\n ATTRIBUTES_REQUEST: `${ADDON_ID}/attributes-request`,\n};\n","import type { Collector, WalkerOS, Destination } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { sourceBrowser } from '@walkeros/web-source-browser';\nimport { addons } from 'storybook/preview-api';\nimport { EVENTS } from './constants';\n\ndeclare global {\n interface Window {\n __storybookElb: WalkerOS.Elb;\n __storybookWalker: Collector.Instance;\n }\n}\n\n// Simple console destination for Storybook\nconst destinationConsole = {\n type: 'console',\n push: (event: WalkerOS.Event, context: Destination.PushContext) => {\n console.log('Storybook Event:', event);\n },\n config: {},\n};\n\n// Live destination for Storybook panel\nconst destinationLive = {\n type: 'live',\n push: (event: WalkerOS.Event, context: Destination.PushContext) => {\n // Send event to Storybook panel for live display\n const channel = addons.getChannel();\n if (channel) {\n channel.emit(EVENTS.LIVE_EVENT, event);\n }\n },\n config: {},\n};\n\n// Function to get Storybook iframe context\nfunction getIframeContext() {\n try {\n // Try to get iframe from parent document (manager context)\n const iframe = parent.document.querySelector(\n '#storybook-preview-iframe',\n ) as HTMLIFrameElement;\n if (iframe?.contentDocument && iframe?.contentWindow) {\n return {\n document: iframe.contentDocument,\n window: iframe.contentWindow,\n };\n }\n } catch (e) {\n // If we can't access parent, we're likely already in iframe context\n }\n\n // Fallback to current context\n return { document, window };\n}\n\nexport async function initializeWalker(config?: {\n prefix?: string;\n autoRefresh?: boolean;\n}): Promise<void> {\n // Skip initialization if already done\n if (window.__storybookWalker) return;\n\n try {\n // Get iframe context for proper event capture\n const { document: iframeDoc, window: iframeWin } = getIframeContext();\n\n if (!iframeDoc) {\n console.warn('Document not available, skipping walkerOS initialization');\n return;\n }\n\n // Create collector with browser source and destinations\n const result = await startFlow({\n consent: { functional: true },\n sources: {\n browser: {\n code: sourceBrowser,\n config: {\n settings: {\n pageview: true,\n session: false,\n elbLayer: '__storybookElbLayer',\n elb: '__storybookElb',\n prefix: config?.prefix || 'data-elb',\n scope: iframeDoc.body || iframeDoc, // Set scope to iframe document\n },\n },\n env: {\n window: iframeWin,\n document: iframeDoc,\n },\n },\n },\n destinations: {\n console: { code: destinationConsole },\n live: { code: destinationLive },\n },\n });\n\n const { collector, elb } = result;\n\n // Verify collector was created successfully\n if (!collector) {\n throw new Error('Collector creation failed - no collector returned');\n }\n\n // Set global window objects\n window.__storybookWalker = collector;\n window.__storybookElb = elb;\n } catch (error) {\n console.error('Failed to initialize walkerOS:', error);\n }\n}\n","// DOM utilities for working with story elements\n\n// Function to get the story document (either iframe or main document)\nexport const getStoryDocument = (): Document => {\n // Try to find story iframe\n const iframe = document.querySelector(\n '#storybook-preview-iframe',\n ) as HTMLIFrameElement;\n if (iframe?.contentDocument) {\n return iframe.contentDocument;\n }\n // Fallback to main document\n return document;\n};\n\n// Function to get the story root element\nexport const getStoryRootElement = (): Element | null => {\n const storyDoc = getStoryDocument();\n\n // Try multiple selectors for story root\n const selectors = [\n '#storybook-root',\n '#root',\n '[data-testid=\"storybook-root\"]',\n 'body',\n ];\n\n for (const selector of selectors) {\n const element = storyDoc.querySelector(selector);\n if (element) {\n return element;\n }\n }\n\n return storyDoc.body;\n};\n\n// Helper to get element path\nexport const getElementPath = (el: Element): string => {\n const path = [];\n let current = el;\n while (current && current !== document.body && current.parentElement) {\n let selector = current.tagName.toLowerCase();\n if (current.id) {\n selector += `#${current.id}`;\n } else if (current.className && typeof current.className === 'string') {\n selector += `.${current.className\n .split(' ')\n .filter((c) => c)\n .join('.')}`;\n }\n path.unshift(selector);\n current = current.parentElement;\n }\n return path.join(' > ');\n};\n\n// Function to enhance DOM with property attributes\nexport const enhanceProperties = (\n storyRoot: Element,\n prefix: string = 'data-elb',\n): void => {\n // Find all elements with any attributes starting with prefix-\n const allElements = Array.from(storyRoot.querySelectorAll('*'));\n\n allElements.forEach((el) => {\n const attributes = Array.from(el.attributes);\n let hasProperties = false;\n\n attributes.forEach((attr) => {\n // Check if attribute starts with prefix- (e.g., data-elb-button, data-elb-product)\n if (\n attr.name.startsWith(`${prefix}-`) &&\n attr.name !== `${prefix}action` &&\n attr.name !== `${prefix}context` &&\n attr.name !== `${prefix}globals`\n ) {\n hasProperties = true;\n }\n });\n\n // Mark elements with property attributes\n if (hasProperties) {\n el.setAttribute(`${prefix}property`, '');\n }\n });\n};\n","// Utilities for building and managing attribute trees\n\nimport type { WalkerOS } from '@walkeros/core';\nimport type { AttributeNode } from '../types';\nimport {\n getElbAttributeName,\n getElbValues,\n} from '@walkeros/web-source-browser';\nimport { getElementPath } from './domUtils';\n\n// Utility to generate clean HTML markup from an element\nconst generateElementHTML = (element: Element): string => {\n if (!element) return '';\n\n const tagName = element.tagName.toLowerCase();\n const allAttribs: string[] = [];\n\n // Collect ALL attributes as they are\n Array.from(element.attributes).forEach((attr) => {\n allAttribs.push(`${attr.name}=\"${attr.value}\"`);\n });\n\n // If no attributes, return basic element\n if (allAttribs.length === 0) {\n return `<${tagName}></${tagName}>`;\n }\n\n // Format attributes nicely for display\n if (allAttribs.length === 1) {\n return `<${tagName} ${allAttribs[0]}></${tagName}>`;\n }\n\n // Multiple attributes - format with line breaks like dev tools\n const formattedAttribs = allAttribs.map((attr) => ` ${attr}`).join('\\n');\n return `<${tagName}\\n${formattedAttribs}\\n></${tagName}>`;\n};\n\n// Build attribute tree structure\nexport const buildAttributeTree = (\n scope: Element,\n prefix: string = 'data-elb',\n): AttributeNode[] => {\n const tree: AttributeNode[] = [];\n const nodeMap = new Map<Element, AttributeNode>();\n\n // Build selectors for all walker attributes\n const entityAttr = getElbAttributeName(prefix);\n const actionAttr = getElbAttributeName(prefix, 'action', false);\n const contextAttr = getElbAttributeName(prefix, 'context', false);\n const globalsAttr = getElbAttributeName(prefix, 'globals', false);\n\n // Find all elements with walker attributes\n const allElements = Array.from(scope.querySelectorAll('*'));\n const walkerElements = allElements.filter((el) => {\n return Array.from(el.attributes).some(\n (attr) =>\n attr.name === entityAttr ||\n attr.name === actionAttr ||\n attr.name === contextAttr ||\n attr.name === globalsAttr ||\n attr.name.startsWith(`${prefix}-`),\n );\n });\n\n // Build nodes for each element\n walkerElements.forEach((el) => {\n if (nodeMap.has(el)) return; // Already processed\n\n const node: AttributeNode = {\n element: el.tagName.toLowerCase(),\n path: getElementPath(el),\n htmlMarkup: generateElementHTML(el),\n attributes: {},\n children: [],\n };\n\n // Collect all walker attributes on this element\n if (el.hasAttribute(entityAttr)) {\n node.attributes.entity = el.getAttribute(entityAttr) || '';\n }\n\n if (el.hasAttribute(actionAttr)) {\n node.attributes.action = el.getAttribute(actionAttr) || '';\n }\n\n try {\n const contextValues = getElbValues(prefix, el, 'context', false);\n if (Object.keys(contextValues).length > 0) {\n node.attributes.context = contextValues;\n }\n } catch (e) {\n // Skip context if parsing fails\n }\n\n try {\n const globalsValues = getElbValues(prefix, el, 'globals', false);\n if (Object.keys(globalsValues).length > 0) {\n node.attributes.globals = globalsValues;\n }\n } catch (e) {\n // Skip globals if parsing fails\n }\n\n // Collect property attributes\n const properties: WalkerOS.Properties = {};\n Array.from(el.attributes).forEach((attr) => {\n if (attr.name.startsWith(`${prefix}-`)) {\n const propName = attr.name.substring(prefix.length + 1);\n try {\n properties[propName] = getElbValues(prefix, el, propName, true);\n } catch (e) {\n // If parsing fails, just store the raw value\n properties[propName] = attr.value;\n }\n }\n });\n\n if (Object.keys(properties).length > 0) {\n node.attributes.properties = properties;\n }\n\n nodeMap.set(el, node);\n });\n\n // Build tree structure\n nodeMap.forEach((node, element) => {\n let parent = element.parentElement;\n let parentNode = null;\n\n // Find nearest parent with walker attributes\n while (parent && parent !== scope) {\n if (nodeMap.has(parent)) {\n parentNode = nodeMap.get(parent);\n break;\n }\n parent = parent.parentElement;\n }\n\n if (parentNode) {\n parentNode.children.push(node);\n } else {\n tree.push(node);\n }\n });\n\n return tree;\n};\n","// CSS utilities for highlighting DOM elements\n\n// Generate dynamic CSS based on prefix\nexport const generateHighlightCSS = (prefix: string): string => {\n // Define selectors based on prefix\n const globalsSelector = `${prefix}globals`;\n const contextSelector = `${prefix}context`;\n const baseSelector = prefix;\n const propertySelector = `${prefix}property`;\n\n // Template CSS with actual selectors\n const cssTemplate = `\n /* Highlight colors - original from website */\n :root {\n --highlight-globals: #4fc3f7cc;\n --highlight-context: #ffbd44cc;\n --highlight-entity: #00ca4ecc;\n --highlight-property: #ff605ccc;\n --highlight-action: #9900ffcc;\n --highlight-background: #1f2937;\n --highlight-text: #9ca3af;\n --highlight-hover: rgba(255, 255, 255, 0.05);\n --highlight-separator: rgba(255, 255, 255, 0.05);\n }\n\n .highlight-globals [${globalsSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-globals) !important;\n }\n\n .highlight-context [${contextSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-context) !important;\n }\n\n .highlight-entity [${baseSelector}] {\n box-shadow: 0 0 0 2px var(--highlight-entity) !important;\n }\n\n .highlight-property [${propertySelector}] {\n box-shadow: 0 0 0 2px var(--highlight-property) !important;\n }\n\n .highlight-action [${prefix}action] {\n box-shadow: 0 0 0 2px var(--highlight-action) !important;\n }\n\n /* Combined highlights with layered solid borders */\n .highlight-entity.highlight-action [${baseSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity) !important;\n }\n\n .highlight-entity.highlight-context [${baseSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-entity),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-entity.highlight-property [${baseSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-entity),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-context [${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-context.highlight-property [${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-context),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-property [${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n /* Globals combinations */\n .highlight-globals.highlight-entity [${globalsSelector}][${baseSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity) !important;\n }\n\n .highlight-globals.highlight-action [${globalsSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action) !important;\n }\n\n .highlight-globals.highlight-context [${globalsSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-property [${globalsSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-property) !important;\n }\n\n /* Triple combinations with globals */\n .highlight-globals.highlight-entity.highlight-action\n [${globalsSelector}][${baseSelector}][${prefix}action] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-context\n [${globalsSelector}][${baseSelector}][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-property\n [${globalsSelector}][${baseSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-action.highlight-context\n [${globalsSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-action.highlight-property\n [${globalsSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-context.highlight-property\n [${globalsSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-context),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n /* Triple combinations with distinct layers */\n .highlight-entity.highlight-action.highlight-context\n [${baseSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context) !important;\n }\n\n /* Triple combinations with property */\n .highlight-entity.highlight-action.highlight-property\n [${baseSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-entity.highlight-context.highlight-property\n [${baseSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-context),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n .highlight-action.highlight-context.highlight-property\n [${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-context),\n 0 0 0 6px var(--highlight-property) !important;\n }\n\n /* Quadruple combinations with globals */\n .highlight-globals.highlight-entity.highlight-action.highlight-context\n [${globalsSelector}][${baseSelector}][${prefix}action][${contextSelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-context) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-action.highlight-property\n [${globalsSelector}][${baseSelector}][${prefix}action][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-entity.highlight-context.highlight-property\n [${globalsSelector}][${baseSelector}][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n .highlight-globals.highlight-action.highlight-context.highlight-property\n [${globalsSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-action),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n /* Quadruple combination */\n .highlight-entity.highlight-action.highlight-context.highlight-property\n [${baseSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-action),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-context),\n 0 0 0 8px var(--highlight-property) !important;\n }\n\n /* Quintuple combination with all attributes */\n .highlight-globals.highlight-entity.highlight-action.highlight-context.highlight-property\n [${globalsSelector}][${baseSelector}][${prefix}action][${contextSelector}][${propertySelector}] {\n box-shadow:\n 0 0 0 2px var(--highlight-globals),\n 0 0 0 4px var(--highlight-entity),\n 0 0 0 6px var(--highlight-action),\n 0 0 0 8px var(--highlight-context),\n 0 0 0 10px var(--highlight-property) !important;\n }\n `;\n\n return cssTemplate;\n};\n\n// Function to inject highlighting CSS into story document\nexport const injectHighlightingCSS = (\n storyDoc: Document,\n prefix: string = 'data-elb',\n): void => {\n // Remove existing styles\n const existingStyle = storyDoc.querySelector('#walkeros-highlighting');\n if (existingStyle) {\n existingStyle.remove();\n }\n\n const highlightingStyleElement = storyDoc.createElement('style');\n highlightingStyleElement.id = 'walkeros-highlighting';\n const css = generateHighlightCSS(prefix);\n highlightingStyleElement.textContent = css;\n\n storyDoc.head.appendChild(highlightingStyleElement);\n};\n","// Utilities for managing DOM highlighting\n\nimport type { WalkerOSAddon } from '../types';\nimport {\n getStoryDocument,\n getStoryRootElement,\n enhanceProperties,\n} from './domUtils';\nimport { injectHighlightingCSS } from './cssUtils';\n\n// Function to apply highlighting to story root\nexport const applyHighlighting = (\n highlights: WalkerOSAddon['highlights'],\n prefix: string = 'data-elb',\n): void => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) return;\n\n // Remove existing highlighting classes\n storyRoot.classList.remove('highlight-context');\n storyRoot.classList.remove('highlight-entity');\n storyRoot.classList.remove('highlight-property');\n storyRoot.classList.remove('highlight-action');\n storyRoot.classList.remove('highlight-globals');\n\n if (!highlights) return;\n\n // Re-enhance properties FIRST to ensure they're marked\n enhanceProperties(storyRoot, prefix);\n\n // Then add specific highlighting classes\n if (highlights.context) storyRoot.classList.add('highlight-context');\n if (highlights.entity) storyRoot.classList.add('highlight-entity');\n if (highlights.property) storyRoot.classList.add('highlight-property');\n if (highlights.action) storyRoot.classList.add('highlight-action');\n if (highlights.globals) storyRoot.classList.add('highlight-globals');\n};\n\n// Combined function to inject CSS and apply highlighting\nexport const setupHighlighting = (\n highlights: WalkerOSAddon['highlights'],\n prefix: string = 'data-elb',\n): void => {\n const storyDoc = getStoryDocument();\n\n // Always inject CSS first\n injectHighlightingCSS(storyDoc, prefix);\n\n // Then apply highlighting\n applyHighlighting(highlights, prefix);\n};\n","import type { WalkerOSAddon } from './types';\nimport type { DecoratorFunction } from 'storybook/internal/types';\nimport { addons } from 'storybook/preview-api';\nimport { getAllEvents, getGlobals } from '@walkeros/web-source-browser';\n\nimport { ADDON_ID, EVENTS } from './constants';\nimport { initializeWalker } from './walker';\nimport { getStoryRootElement, enhanceProperties } from './utils/domUtils';\nimport { buildAttributeTree } from './utils/attributeTreeUtils';\nimport { setupHighlighting } from './utils/highlightingUtils';\n\n// Set up the channel listener globally, not per story\nconst channel = addons.getChannel();\nlet currentStoryId: string | null = null;\n\n// Global listener for the request events\nchannel.addListener(EVENTS.REQUEST, (config: WalkerOSAddon) => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) {\n channel.emit(EVENTS.RESULT, []);\n return;\n }\n\n // Enhance DOM with property attributes\n enhanceProperties(storyRoot, config.prefix || 'data-elb');\n\n const events = getAllEvents(storyRoot as Element, config.prefix);\n\n // Collect globals from data-elbglobals attributes\n const globals = getGlobals(config.prefix || 'data-elb', storyRoot as Element);\n\n // Add globals to each event if any globals exist\n const eventsWithGlobals = events.map((event) => {\n if (Object.keys(globals).length > 0) {\n return { ...event, globals };\n }\n return event;\n });\n\n // Send the result back to the manager\n channel.emit(EVENTS.RESULT, eventsWithGlobals);\n});\n\n// Global listener for highlighting events\nchannel.addListener(EVENTS.HIGHLIGHT, (config: WalkerOSAddon) => {\n setupHighlighting(config.highlights, config.prefix);\n});\n\n// Global listener for attribute tree requests\nchannel.addListener(EVENTS.ATTRIBUTES_REQUEST, (config: WalkerOSAddon) => {\n const storyRoot = getStoryRootElement();\n if (!storyRoot) {\n channel.emit(EVENTS.ATTRIBUTES_RESULT, []);\n return;\n }\n\n // Build the attribute tree\n const attributeTree = buildAttributeTree(\n storyRoot as Element,\n config.prefix || 'data-elb',\n );\n\n // Send the result back to the manager\n channel.emit(EVENTS.ATTRIBUTES_RESULT, attributeTree);\n});\n\nexport const withRoundTrip: DecoratorFunction = (storyFn, context) => {\n // Check if story changed and auto-run is enabled\n const storyId = context.id;\n const hasStoryChanged = currentStoryId !== storyId;\n const { parameters } = context;\n const autoRefresh = parameters?.[ADDON_ID]?.autoRefresh;\n\n if (hasStoryChanged) {\n currentStoryId = storyId;\n }\n\n const result = storyFn();\n\n // Initialize walker and inject CSS after story renders\n setTimeout(() => {\n // Initialize walkerOS for live event capture\n const prefix = parameters?.[ADDON_ID]?.prefix || 'data-elb';\n initializeWalker({ prefix, autoRefresh }).catch((err) => {\n console.error('Walker initialization failed:', err);\n });\n\n // Inject highlighting CSS and enhance properties\n const storyRoot = getStoryRootElement();\n if (storyRoot) {\n setupHighlighting(undefined, prefix);\n enhanceProperties(storyRoot, prefix);\n }\n\n // Auto-run walker if story changed and auto-refresh is enabled\n if (hasStoryChanged && autoRefresh && window.__storybookElb) {\n window.__storybookElb('walker run');\n }\n }, 200);\n\n return result;\n};\n","/**\n * A decorator is a way to wrap a story in extra “rendering” functionality. Many addons define decorators\n * in order to augment stories:\n * - with extra rendering\n * - gather details about how a story is rendered\n *\n * When writing stories, decorators are typically used to wrap stories with extra markup or context mocking.\n *\n * https://storybook.js.org/docs/react/writing-stories/decorators\n */\nimport type { ProjectAnnotations, Renderer } from 'storybook/internal/types';\n\nimport { ADDON_ID } from './constants';\nimport { withRoundTrip } from './withRoundTrip';\n\n/**\n * Note: if you want to use JSX in this file, rename it to `preview.tsx`\n * and update the entry prop in tsup.config.ts to use \"src/preview.tsx\",\n */\n\nconst preview: ProjectAnnotations<Renderer> = {\n decorators: [withRoundTrip],\n parameters: {\n [ADDON_ID]: {\n autoRefresh: true,\n prefix: 'data-elb',\n },\n },\n};\n\nexport default preview;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walkeros/storybook-addon",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Visualize, debug, and validate walkerOS event tracking in your Storybook stories. Real-time event capture with visual DOM highlighting for data-attribute based tagging.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"storybook-addons",
|
|
@@ -59,10 +59,10 @@
|
|
|
59
59
|
"build-storybook": "storybook build"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@walkeros/core": "0.
|
|
63
|
-
"@walkeros/collector": "0.
|
|
64
|
-
"@walkeros/web-core": "0.
|
|
65
|
-
"@walkeros/web-source-browser": "0.
|
|
62
|
+
"@walkeros/core": "0.8.0",
|
|
63
|
+
"@walkeros/collector": "0.9.0",
|
|
64
|
+
"@walkeros/web-core": "0.8.0",
|
|
65
|
+
"@walkeros/web-source-browser": "0.8.0",
|
|
66
66
|
"@storybook/icons": "^2.0.1"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|