@hypertools/sdk 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +1 -1
  2. package/dist/capture/index.js +13 -1
  3. package/dist/capture/index.js.map +2 -2
  4. package/dist/controls/index.js +13 -1
  5. package/dist/controls/index.js.map +2 -2
  6. package/dist/core/index.js +13 -1
  7. package/dist/core/index.js.map +2 -2
  8. package/dist/index.js +14 -1
  9. package/dist/index.js.map +2 -2
  10. package/dist/react/index.js +13 -1
  11. package/dist/react/index.js.map +2 -2
  12. package/dist/recording/index.js +13 -1
  13. package/dist/recording/index.js.map +2 -2
  14. package/package.json +31 -10
  15. package/dist/codegen/index.d.ts +0 -6
  16. package/dist/codegen/index.d.ts.map +0 -1
  17. package/dist/codegen/index.js +0 -800
  18. package/dist/codegen/index.js.map +0 -13
  19. package/dist/export/bundler.d.ts +0 -55
  20. package/dist/export/bundler.d.ts.map +0 -1
  21. package/dist/export/generators/index.d.ts +0 -6
  22. package/dist/export/generators/index.d.ts.map +0 -1
  23. package/dist/export/generators/webComponent.d.ts +0 -29
  24. package/dist/export/generators/webComponent.d.ts.map +0 -1
  25. package/dist/export/index.d.ts +0 -19
  26. package/dist/export/index.d.ts.map +0 -1
  27. package/dist/export/index.js +0 -800
  28. package/dist/export/index.js.map +0 -13
  29. package/dist/export/runtime.d.ts +0 -46
  30. package/dist/export/runtime.d.ts.map +0 -1
  31. package/dist/frame/cssBridge.d.ts +0 -34
  32. package/dist/frame/cssBridge.d.ts.map +0 -1
  33. package/dist/frame/index.d.ts +0 -9
  34. package/dist/frame/index.d.ts.map +0 -1
  35. package/dist/frame/index.js +0 -3
  36. package/dist/frame/index.js.map +0 -24
  37. package/dist/frame/runtime.d.ts +0 -39
  38. package/dist/frame/runtime.d.ts.map +0 -1
  39. package/dist/frame/types.d.ts +0 -119
  40. package/dist/frame/types.d.ts.map +0 -1
  41. package/dist/frame/utils/dom.d.ts +0 -11
  42. package/dist/frame/utils/dom.d.ts.map +0 -1
  43. package/dist/frame/wrapper-app/WrapperApp.d.ts +0 -16
  44. package/dist/frame/wrapper-app/WrapperApp.d.ts.map +0 -1
  45. package/dist/frame/wrapper-app/components/CanvasSizeWidget.d.ts +0 -17
  46. package/dist/frame/wrapper-app/components/CanvasSizeWidget.d.ts.map +0 -1
  47. package/dist/frame/wrapper-app/components/ControlsPanel.d.ts +0 -11
  48. package/dist/frame/wrapper-app/components/ControlsPanel.d.ts.map +0 -1
  49. package/dist/frame/wrapper-app/components/ExportWidget.d.ts +0 -16
  50. package/dist/frame/wrapper-app/components/ExportWidget.d.ts.map +0 -1
  51. package/dist/frame/wrapper-app/components/ResizeHandles.d.ts +0 -19
  52. package/dist/frame/wrapper-app/components/ResizeHandles.d.ts.map +0 -1
  53. package/dist/frame/wrapper-app/components/SandboxContainer.d.ts +0 -16
  54. package/dist/frame/wrapper-app/components/SandboxContainer.d.ts.map +0 -1
  55. package/dist/frame/wrapper-app/components/index.d.ts +0 -5
  56. package/dist/frame/wrapper-app/components/index.d.ts.map +0 -1
  57. package/dist/frame/wrapper-app/context/CanvasContext.d.ts +0 -37
  58. package/dist/frame/wrapper-app/context/CanvasContext.d.ts.map +0 -1
  59. package/dist/frame/wrapper-app/context/index.d.ts +0 -2
  60. package/dist/frame/wrapper-app/context/index.d.ts.map +0 -1
  61. package/dist/frame/wrapper-app/index.d.ts +0 -9
  62. package/dist/frame/wrapper-app/index.d.ts.map +0 -1
  63. package/dist/frame/wrapper-app/types.d.ts +0 -38
  64. package/dist/frame/wrapper-app/types.d.ts.map +0 -1
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 HyperTool Team
3
+ Copyright (c) 2025 HyperTool Team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,3 +1,13 @@
1
+ /**
2
+ * @hypertools/sdk
3
+ * Copyright (c) 2025 HyperTools Team
4
+ *
5
+ * Vanilla-first SDK for embedding interactive creative coding experiences.
6
+ * Supports p5.js, Three.js, WebGL, and more.
7
+ *
8
+ * @license MIT
9
+ * @see https://github.com/hypertools/sdk
10
+ */
1
11
  class G{config;customHandler=null;constructor(p={}){if(this.config={defaultFormat:"png",quality:0.92,...p},p.customHandler)this.customHandler=p.customHandler}registerHandler(p){this.customHandler=p}async capture(p,u=this.config.defaultFormat||"png"){if(this.customHandler)return this.customHandler(u);let H=this.findRenderTarget(p);if(!H)return console.warn("[CaptureManager] No render target found in container"),null;let{element:C,type:V}=H;switch(V){case"canvas":return this.captureCanvas(C,u);case"svg":return this.captureSvg(C,u);case"html":return this.captureHtml(C,u);default:return console.warn("[CaptureManager] Unknown render target type:",V),null}}findRenderTarget(p){if(this.config.targetSelector){let C=p.querySelector(this.config.targetSelector);if(C)return{element:C,type:this.config.targetType||this.detectType(C)}}let u=p.querySelector("canvas");if(u)return{element:u,type:"canvas"};let H=p.querySelector("svg");if(H)return{element:H,type:"svg"};return{element:p,type:"html"}}detectType(p){if(p instanceof HTMLCanvasElement)return"canvas";if(p instanceof SVGSVGElement)return"svg";return"html"}async captureCanvas(p,u){let H=this.getMimeType(u),C=u==="jpeg"?this.config.quality:void 0;return new Promise((V)=>{p.toBlob((d)=>{if(!d){V(null);return}V({blob:d,width:p.width,height:p.height,format:u})},H,C)})}async captureSvg(p,u){if(u==="svg"){let C=new XMLSerializer().serializeToString(p),V=new Blob([C],{type:"image/svg+xml"}),d=p.getBBox();return{blob:V,width:d.width||p.clientWidth,height:d.height||p.clientHeight,format:"svg"}}return this.svgToRaster(p,u)}async svgToRaster(p,u){let C=new XMLSerializer().serializeToString(p),V=new Blob([C],{type:"image/svg+xml;charset=utf-8"}),d=URL.createObjectURL(V),R=new Image;return R.src=d,new Promise((A)=>{R.onload=()=>{URL.revokeObjectURL(d);let k=document.createElement("canvas"),y=p.clientWidth||R.width,T=p.clientHeight||R.height;k.width=y,k.height=T;let F=k.getContext("2d");if(!F){A(null);return}F.drawImage(R,0,0,y,T),this.captureCanvas(k,u).then(A)},R.onerror=()=>{URL.revokeObjectURL(d),A(null)}})}async captureHtml(p,u){let H=p,C=H.offsetWidth,V=H.offsetHeight,d=document.createElement("canvas");d.width=C,d.height=V;let R=d.getContext("2d");if(!R)return null;let A=`
2
12
  <svg xmlns="http://www.w3.org/2000/svg" width="${C}" height="${V}">
3
13
  <foreignObject width="100%" height="100%">
@@ -8,4 +18,6 @@ class G{config;customHandler=null;constructor(p={}){if(this.config={defaultForma
8
18
  </svg>
9
19
  `,k=new Blob([A],{type:"image/svg+xml;charset=utf-8"}),y=URL.createObjectURL(k),T=new Image;return T.src=y,new Promise((F)=>{T.onload=()=>{URL.revokeObjectURL(y),R.drawImage(T,0,0),this.captureCanvas(d,u).then(F)},T.onerror=()=>{URL.revokeObjectURL(y),console.warn("[CaptureManager] HTML capture failed. Consider using a custom capture handler."),F(null)}})}getMimeType(p){switch(p){case"png":return"image/png";case"jpeg":return"image/jpeg";case"webp":return"image/webp";case"svg":return"image/svg+xml";default:return"image/png"}}}export{G as CaptureManager};
10
20
 
11
- //# debugId=5A7F3124CCD112A664756E2164756E21
21
+ /* @hypertools/sdk - MIT License - https://hypertools.dev */
22
+
23
+ //# debugId=1FCFAADF8D276A9864756E2164756E21
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "/**\n * CaptureManager - Rendering-target agnostic capture system\n *\n * Supports capturing from ANY rendering target:\n * - Canvas (2D, WebGL, WebGPU)\n * - SVG elements\n * - HTML elements (via html2canvas-like approach)\n * - Custom targets via handlers\n */\n\nimport type {\n CaptureFormat,\n CaptureResult,\n CaptureHandler,\n CaptureConfig,\n RenderTargetType,\n} from './types';\n\nexport class CaptureManager {\n private config: CaptureConfig;\n private customHandler: CaptureHandler | null = null;\n\n constructor(config: CaptureConfig = {}) {\n this.config = {\n defaultFormat: 'png',\n quality: 0.92,\n ...config,\n };\n\n if (config.customHandler) {\n this.customHandler = config.customHandler;\n }\n }\n\n /**\n * Register a custom capture handler\n * Use this to support any rendering target\n */\n registerHandler(handler: CaptureHandler): void {\n this.customHandler = handler;\n }\n\n /**\n * Capture image from the render target\n */\n async capture(\n container: HTMLElement,\n format: CaptureFormat = this.config.defaultFormat || 'png'\n ): Promise<CaptureResult | null> {\n // Use custom handler if registered\n if (this.customHandler) {\n return this.customHandler(format);\n }\n\n // Auto-detect render target\n const target = this.findRenderTarget(container);\n if (!target) {\n console.warn('[CaptureManager] No render target found in container');\n return null;\n }\n\n const { element, type } = target;\n\n switch (type) {\n case 'canvas':\n return this.captureCanvas(element as HTMLCanvasElement, format);\n case 'svg':\n return this.captureSvg(element as SVGSVGElement, format);\n case 'html':\n return this.captureHtml(element, format);\n default:\n console.warn('[CaptureManager] Unknown render target type:', type);\n return null;\n }\n }\n\n /**\n * Find the render target in a container\n * Priority: custom selector > canvas > svg > container itself\n */\n private findRenderTarget(\n container: HTMLElement\n ): { element: Element; type: RenderTargetType } | null {\n // Use custom selector if specified\n if (this.config.targetSelector) {\n const element = container.querySelector(this.config.targetSelector);\n if (element) {\n return {\n element,\n type: this.config.targetType || this.detectType(element),\n };\n }\n }\n\n // Auto-detect: canvas first\n const canvas = container.querySelector('canvas');\n if (canvas) {\n return { element: canvas, type: 'canvas' };\n }\n\n // Then SVG\n const svg = container.querySelector('svg');\n if (svg) {\n return { element: svg, type: 'svg' };\n }\n\n // Fall back to the container itself (HTML capture)\n return { element: container, type: 'html' };\n }\n\n /**\n * Detect the type of an element\n */\n private detectType(element: Element): RenderTargetType {\n if (element instanceof HTMLCanvasElement) return 'canvas';\n if (element instanceof SVGSVGElement) return 'svg';\n return 'html';\n }\n\n /**\n * Capture from canvas element\n */\n private async captureCanvas(\n canvas: HTMLCanvasElement,\n format: CaptureFormat\n ): Promise<CaptureResult | null> {\n const mimeType = this.getMimeType(format);\n const quality = format === 'jpeg' ? this.config.quality : undefined;\n\n return new Promise((resolve) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n resolve(null);\n return;\n }\n resolve({\n blob,\n width: canvas.width,\n height: canvas.height,\n format,\n });\n },\n mimeType,\n quality\n );\n });\n }\n\n /**\n * Capture from SVG element\n */\n private async captureSvg(\n svg: SVGSVGElement,\n format: CaptureFormat\n ): Promise<CaptureResult | null> {\n // For SVG format, return the SVG directly\n if (format === 'svg') {\n const serializer = new XMLSerializer();\n const svgString = serializer.serializeToString(svg);\n const blob = new Blob([svgString], { type: 'image/svg+xml' });\n const bbox = svg.getBBox();\n return {\n blob,\n width: bbox.width || svg.clientWidth,\n height: bbox.height || svg.clientHeight,\n format: 'svg',\n };\n }\n\n // For raster formats, render SVG to canvas first\n return this.svgToRaster(svg, format);\n }\n\n /**\n * Convert SVG to raster image via canvas\n */\n private async svgToRaster(\n svg: SVGSVGElement,\n format: CaptureFormat\n ): Promise<CaptureResult | null> {\n const serializer = new XMLSerializer();\n const svgString = serializer.serializeToString(svg);\n const svgBlob = new Blob([svgString], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n const img = new Image();\n img.src = url;\n\n return new Promise((resolve) => {\n img.onload = () => {\n URL.revokeObjectURL(url);\n\n const canvas = document.createElement('canvas');\n const width = svg.clientWidth || img.width;\n const height = svg.clientHeight || img.height;\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n resolve(null);\n return;\n }\n\n ctx.drawImage(img, 0, 0, width, height);\n\n this.captureCanvas(canvas, format).then(resolve);\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n });\n }\n\n /**\n * Capture from HTML element\n * Uses a simple approach - for complex HTML, consider html2canvas\n */\n private async captureHtml(\n element: Element,\n format: CaptureFormat\n ): Promise<CaptureResult | null> {\n // Simple approach: use browser's native rendering\n // For production, you might want to use html2canvas or similar\n\n const htmlElement = element as HTMLElement;\n const width = htmlElement.offsetWidth;\n const height = htmlElement.offsetHeight;\n\n // Create a canvas and draw the element\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n // Use foreignObject approach\n const svgString = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\n <foreignObject width=\"100%\" height=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\">\n ${htmlElement.outerHTML}\n </div>\n </foreignObject>\n </svg>\n `;\n\n const svgBlob = new Blob([svgString], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n const img = new Image();\n img.src = url;\n\n return new Promise((resolve) => {\n img.onload = () => {\n URL.revokeObjectURL(url);\n ctx.drawImage(img, 0, 0);\n this.captureCanvas(canvas, format).then(resolve);\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n // Fallback: return null, user should use custom handler for complex HTML\n console.warn(\n '[CaptureManager] HTML capture failed. Consider using a custom capture handler.'\n );\n resolve(null);\n };\n });\n }\n\n /**\n * Get MIME type for format\n */\n private getMimeType(format: CaptureFormat): string {\n switch (format) {\n case 'png':\n return 'image/png';\n case 'jpeg':\n return 'image/jpeg';\n case 'webp':\n return 'image/webp';\n case 'svg':\n return 'image/svg+xml';\n default:\n return 'image/png';\n }\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "5A7F3124CCD112A664756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "1FCFAADF8D276A9864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,3 +1,13 @@
1
+ /**
2
+ * @hypertools/sdk
3
+ * Copyright (c) 2025 HyperTools Team
4
+ *
5
+ * Vanilla-first SDK for embedding interactive creative coding experiences.
6
+ * Supports p5.js, Three.js, WebGL, and more.
7
+ *
8
+ * @license MIT
9
+ * @see https://github.com/hypertools/sdk
10
+ */
1
11
  import{Pane as k}from"tweakpane";var b={cssVariables:{"--bg":"#0a0e14","--bg-elevated":"#0f1419","--muted":"#1a2332","--text":"#e6edf3","--text-secondary":"#8b949e","--accent":"#58d5ff","--accent-2":"#42a5cc","--border":"#21262d","--border-hover":"#30363d","--success":"#3fb950","--error":"#f85149","--ht-text-color-main-200":"#00ffd4","--ht-text-color-main-300":"#6ff3dd","--ht-text-color-main-500":"#4b8e85","--ht-text-color-grey-200":"#8c8d8f","--ht-bg-color-200":"#8c8d8f","--ht-bg-color-200-active":"#7a7b7d","--ht-bg-color-200-focus":"#7e7f81","--ht-bg-color-200-hover":"#828384","--ht-bg-color-300":"#5e6068","--ht-bg-color-300-active":"#4c4e56","--ht-bg-color-300-focus":"#55575f","--ht-bg-color-300-hover":"#595b63","--ht-bg-color-400":"#cccccc","--ht-bg-color-400-active":"#b3b3b3","--ht-bg-color-400-focus":"#c0c0c0","--ht-bg-color-400-hover":"#c6c6c6","--ht-bg-color-500":"#1C1D20","--ht-bg-color-500-active":"#0a0b0e","--ht-bg-color-500-focus":"#131417","--ht-bg-color-500-hover":"#16171a","--ht-bg-color-600":"#37383D","--ht-bg-color-600-active":"#25262b","--ht-bg-color-600-focus":"#2e2f34","--ht-bg-color-600-hover":"#323338","--ht-bg-color-700":"#0f1419","--ht-bg-color-700-active":"#16171c","--ht-bg-color-700-focus":"#1f2025","--ht-bg-color-700-hover":"#232429","--ht-border-radius":"8px","--ht-base-font-family-base":'"HydrogenType400", ui-sans-serif, system-ui, sans-serif',"--ht-base-font-family-display":'"Departure Mono", Roboto Mono, Source Code Pro, Menlo, Courier, monospace',"--ht-base-font-family-sans":'"Routed Gothic", ui-sans-serif, system-ui, sans-serif',"--ht-base-font-family-mono":'"Routed Gothic Narrow", ui-monospace, SFMono-Regular, SF Mono, Consolas, Liberation Mono, Menlo, monospace'},tweakpane:{"--tp-base-background-color":"var(--ht-bg-color-700)","--tp-base-shadow-color":"hsla(0, 0%, 0%, 0.2)","--tp-container-background-color":"var(--ht-bg-color-600)","--tp-container-background-color-active":"var(--ht-bg-color-600-active)","--tp-container-background-color-focus":"var(--ht-bg-color-600-focus)","--tp-container-background-color-hover":"var(--ht-bg-color-600-hover)","--tp-container-foreground-color":"var(--ht-text-color-main-300)","--tp-button-background-color":"var(--ht-bg-color-400)","--tp-button-background-color-active":"color-mix(in srgb, var(--ht-bg-color-400-active) 80%, white)","--tp-button-background-color-focus":"color-mix(in srgb, var(--ht-bg-color-400-focus) 85%, white)","--tp-button-background-color-hover":"color-mix(in srgb, var(--ht-bg-color-400-hover) 90%, white)","--tp-button-foreground-color":"var(--ht-text-color-main-300)","--tp-groove-foreground-color":"var(--ht-bg-color-300)","--tp-input-background-color":"var(--ht-bg-color-500)","--tp-input-background-color-active":"var(--ht-bg-color-500-active)","--tp-input-background-color-focus":"var(--ht-bg-color-500-focus)","--tp-input-background-color-hover":"var(--ht-bg-color-500-hover)","--tp-input-foreground-color":"var(--ht-text-color-main-300)","--tp-label-foreground-color":"var(--ht-text-color-main-300)","--tp-monitor-background-color":"var(--ht-bg-color-500)","--tp-monitor-foreground-color":"var(--ht-text-color-main-300)"}};function h(){let D=document.createElement("style");D.id="hypertool-theme";let z=Object.entries({...b.cssVariables,...b.tweakpane}).map(([T,J])=>` ${T}: ${J};`).join(`
2
12
  `);D.textContent=`
3
13
  body {
@@ -25,4 +35,6 @@ ${z}
25
35
  }
26
36
  `,document.head.appendChild(D)}class E{constructor(D,z={}){this.pane=null,this.definitions=D,this.options={title:z.title||"Controls",position:z.position||"top-right",expanded:z.expanded!==void 0?z.expanded:!0,container:z.container!==void 0?z.container:null,onChange:z.onChange||(()=>{}),onReady:z.onReady||(()=>{})},this.params=this.extractInitialValues(D),this.init()}isFolder(D){return D&&typeof D==="object"&&(D.type==="folder"||D.type==="group")}isButton(D){return D&&typeof D==="object"&&D.type==="button"}isTab(D){return D&&typeof D==="object"&&D.type==="tab"}isFile(D){return D&&typeof D==="object"&&D.type==="file"}extractInitialValues(D){let z={};for(let[T,J]of Object.entries(D)){let F=J;if(this.isFolder(F))z[T]=this.extractInitialValues(F.controls);else if(this.isTab(F))z[T]=F.pages.map((L)=>this.extractInitialValues(L.controls));else if(this.isButton(F))continue;else z[T]=F.value}return z}async init(){try{h(),await new Promise((D)=>setTimeout(D,50)),this.createPane(),this.addControls(),this.options.onReady()}catch(D){console.error("[HypertoolControls] Initialization error:",D)}}createPane(){let D=this.resolveContainer(),z={title:this.options.title,expanded:this.options.expanded};if(D)z.container=D;this.pane=new k(z),this.pane.element.parentElement?.classList.add("controls-container")}resolveContainer(){if(typeof document>"u")return null;let D=this.options.container;if(!D)return null;if(D instanceof HTMLElement)return D;let z=document.querySelector(D);if(!z)return console.warn(`[HypertoolControls] Container selector "${D}" did not match any elements`),null;return z}addControls(){if(!this.pane)return;this.addControlsToTarget(this.pane,this.definitions,this.params)}addControlsToTarget(D,z,T){for(let[J,F]of Object.entries(z))try{if(this.isFolder(F)){let L={title:F.label||J};if(F.expanded!==void 0)L.expanded=F.expanded;let W=D.addFolder(L);this.addControlsToTarget(W,F.controls,T[J])}else if(this.isButton(F)){let L={title:F.title};if(F.label)L.label=F.label;let W=D.addButton(L);if(F.onClick)W.on("click",F.onClick)}else if(this.isTab(F)){let L={pages:F.pages.map((G)=>({title:G.title}))},W=D.addTab(L);F.pages.forEach((G,X)=>{this.addControlsToTarget(W.pages[X],G.controls,T[J][X])})}else if(this.isFile(F))this.addFileControl(D,J,F,T);else this.addControlToTarget(D,J,F,T)}catch(L){console.error(`[HypertoolControls] Error adding control/folder/button/tab "${J}":`,L)}}addControlToTarget(D,z,T,J){if(this.isFolder(T))return;let F={label:T.label||z};if(T.readonly!==void 0)F.readonly=T.readonly;if(T.interval!==void 0)F.interval=T.interval;if(T.bufferSize!==void 0)F.bufferSize=T.bufferSize;if(T.multiline!==void 0)F.multiline=T.multiline;if(T.rows!==void 0)F.rows=T.rows;if(T.view!==void 0)F.view=T.view;switch(T.type){case"number":if(T.min!==void 0)F.min=T.min;if(T.max!==void 0)F.max=T.max;if(T.step!==void 0)F.step=T.step;break;case"point":case"point2d":case"point3d":case"point4d":if(T.min!==void 0)F.min=T.min;if(T.max!==void 0)F.max=T.max;if(T.step!==void 0)F.step=T.step;let W=["x","y","z","w"];for(let G of W)if(T[G]&&typeof T[G]==="object")F[G]=T[G];break;case"select":case"selector":if(Array.isArray(T.options))F.options=T.options.map((G)=>{if(typeof G==="object"&&G!==null)return{text:G.label||G.text||String(G.value),value:G.value};return{text:String(G),value:G}});else F.options=Object.entries(T.options).map(([G,X])=>({text:G,value:X}));break;case"color":case"boolean":case"string":case"text":break;case"folder":case"group":console.warn("[HypertoolControls] Folder/Group encountered in addControlToTarget (should be handled earlier)");return;case"button":console.warn("[HypertoolControls] Button encountered in addControlToTarget (should be handled earlier)");return;case"tab":console.warn("[HypertoolControls] Tab encountered in addControlToTarget (should be handled earlier)");return;default:console.warn(`[HypertoolControls] Unknown control type: ${T.type}`);return}D.addBinding(J,z,F).on("change",(W)=>{J[z]=W.value;let G={key:z,value:W.value,event:W};this.options.onChange(this.values,G)})}addFileControl(D,z,T,J){let F=T.label||z,L=T.accept||"*/*",W=T.placeholder||"Choose file...",G=T.preview!==!1,X=document.createElement("div");X.className="tp-lblv ht-file-control-row";let x=document.createElement("div");x.className="tp-lblv_l ht-file-control-label",x.textContent=F;let V=document.createElement("div");V.className="tp-lblv_v ht-file-control-value";let Y=document.createElement("input");Y.type="file",Y.accept=L,Y.style.display="none";let A=document.createElement("div");A.className="ht-file-control-buttons";let M=document.createElement("button");M.className="tp-btnv_b ht-file-control-button",M.textContent=J[z]?"Change":"Upload",M.style.display=J[z]?"none":"inline-flex";let $=document.createElement("button");$.className="tp-btnv_b ht-file-control-button ht-file-control-button--muted",$.textContent="✕",$.style.display="none";let j=document.createElement("div");j.className="ht-file-control-preview",j.style.display=J[z]&&G?"block":"none";let U=document.createElement("div");U.className="ht-file-control-preview-bar";let S=document.createElement("span");S.className="ht-file-control-preview-name",S.textContent=J[z]?"File":"No file selected";let C=document.createElement("div");C.className="ht-file-control-preview-actions";let q=document.createElement("button");q.type="button",q.className="ht-file-control-preview-action",q.title="Replace file",q.textContent="↻",q.onclick=(K)=>{K.preventDefault(),Y.click()};let H=document.createElement("button");H.type="button",H.className="ht-file-control-preview-action",H.title="Remove file",H.textContent="✕",H.onclick=(K)=>{K.preventDefault(),$.click()},C.appendChild(q),C.appendChild(H),U.appendChild(S),U.appendChild(C);let O=document.createElement("img");O.className="ht-file-control-preview-img";let N=document.createElement("div");N.className="ht-file-control-placeholder",N.style.display="none",Y.onchange=async()=>{let K=Y.files?.[0];if(!K)return;if(T.maxSize&&K.size>T.maxSize){console.warn(`[HypertoolControls] File size exceeds limit: ${K.size} > ${T.maxSize}`);return}M.textContent="Uploading...",M.disabled=!0;let R=`file-upload-${Date.now()}-${Math.random().toString(36).slice(2)}`,w=new Promise((Z)=>{let _=(Q)=>{if(Q.data?.type!=="UPLOAD_CONTROL_FILE_RESULT")return;if(Q.data?.requestId!==R)return;if(window.removeEventListener("message",_),Q.data.error)console.error("[HypertoolControls] File upload failed:",Q.data.error),Z(null);else Z({url:Q.data.url,originalUrl:Q.data.originalUrl||Q.data.url})};window.addEventListener("message",_),setTimeout(()=>{window.removeEventListener("message",_),console.warn("[HypertoolControls] File upload timed out"),Z(null)},30000)}),P=null;if(G&&K.type.startsWith("image/")){let Z=new FileReader;Z.onload=(_)=>{P=_.target?.result},Z.readAsDataURL(K)}let B=new FileReader;B.onload=async(Z)=>{let _=Z.target?.result;window.parent.postMessage({type:"UPLOAD_CONTROL_FILE",source:"hypertool-iframe",requestId:R,data:{fileName:K.name,fileType:K.type,fileSize:K.size,fileData:_,controlKey:z}},"*",[_]);let Q=await w;if(M.disabled=!1,Q){if(J[z]=Q.url,M.textContent="Change",M.style.display="none",S.textContent=K.name||"File",G&&K.type.startsWith("image/")&&P)N.style.display="none",O.src=P,j.style.display="flex";let g={key:z,value:Q.originalUrl,event:{value:Q.originalUrl,proxyUrl:Q.url,file:K}};this.options.onChange(this.values,g)}else M.textContent=J[z]?"Change":"Upload",console.error("[HypertoolControls] Failed to upload file to storage")},B.readAsArrayBuffer(K)},M.onclick=()=>{Y.click()},$.onclick=()=>{J[z]=null,Y.value="",M.textContent="Upload",M.style.display="inline-flex",$.style.display="none",j.style.display="none",N.style.display="none",S.textContent="No file selected";let K={key:z,value:null,event:{value:null}};this.options.onChange(this.values,K)},A.appendChild(M),A.appendChild($),j.appendChild(O),j.appendChild(U),V.appendChild(Y),V.appendChild(A),V.appendChild(N),V.appendChild(j),X.appendChild(x),X.appendChild(V);let I=D.element;(I.querySelector(".tp-rotv_c")||I).appendChild(X)}addFolder(D){if(!this.pane)return null;return this.pane.addFolder({title:D})}set(D,z){if(D in this.params){if(this.params[D]=z,this.pane)this.pane.refresh()}}get values(){return{...this.params}}destroy(){if(this.pane)this.pane.dispose(),this.pane=null;let D=document.getElementById("hypertool-theme");if(D)D.remove()}setVisible(D){if(!this.pane)return;this.pane.element.style.display=D?"block":"none"}refresh(){if(this.pane)this.pane.refresh()}}function m(D,z){return new E(D,z).params}function u(D,z){return new E(D,z)}export{b as studioTheme,h as injectThemeVariables,m as createControls,u as createControlPanel,E as HypertoolControls};
27
37
 
28
- //# debugId=9B4AE28FA320332164756E2164756E21
38
+ /* @hypertools/sdk - MIT License - https://hypertools.dev */
39
+
40
+ //# debugId=38F6DE9532D2840764756E2164756E21
@@ -6,7 +6,7 @@
6
6
  "/**\n * Design tokens inherited from the parent Studio application\n * These CSS variables are defined in src/app/globals.css\n */\nexport const studioTheme = {\n // CSS variables that should be available in the iframe\n cssVariables: {\n '--bg': '#0a0e14',\n '--bg-elevated': '#0f1419',\n '--muted': '#1a2332',\n '--text': '#e6edf3',\n '--text-secondary': '#8b949e',\n '--accent': '#58d5ff',\n '--accent-2': '#42a5cc',\n '--border': '#21262d',\n '--border-hover': '#30363d',\n '--success': '#3fb950',\n '--error': '#f85149',\n\n // Hypertool-specific variables\n '--ht-text-color-main-200': '#00ffd4',\n '--ht-text-color-main-300': '#6ff3dd',\n '--ht-text-color-main-500': '#4b8e85',\n '--ht-text-color-grey-200': '#8c8d8f',\n\n '--ht-bg-color-200': '#8c8d8f',\n '--ht-bg-color-200-active': '#7a7b7d',\n '--ht-bg-color-200-focus': '#7e7f81',\n '--ht-bg-color-200-hover': '#828384',\n\n '--ht-bg-color-300': '#5e6068',\n '--ht-bg-color-300-active': '#4c4e56',\n '--ht-bg-color-300-focus': '#55575f',\n '--ht-bg-color-300-hover': '#595b63',\n\n '--ht-bg-color-400': '#cccccc',\n '--ht-bg-color-400-active': '#b3b3b3',\n '--ht-bg-color-400-focus': '#c0c0c0',\n '--ht-bg-color-400-hover': '#c6c6c6',\n\n '--ht-bg-color-500': '#1C1D20',\n '--ht-bg-color-500-active': '#0a0b0e',\n '--ht-bg-color-500-focus': '#131417',\n '--ht-bg-color-500-hover': '#16171a',\n\n '--ht-bg-color-600': '#37383D',\n '--ht-bg-color-600-active': '#25262b',\n '--ht-bg-color-600-focus': '#2e2f34',\n '--ht-bg-color-600-hover': '#323338',\n\n '--ht-bg-color-700': '#0f1419',\n '--ht-bg-color-700-active': '#16171c',\n '--ht-bg-color-700-focus': '#1f2025',\n '--ht-bg-color-700-hover': '#232429',\n\n '--ht-border-radius': '8px',\n\n '--ht-base-font-family-base': '\"HydrogenType400\", ui-sans-serif, system-ui, sans-serif',\n '--ht-base-font-family-display': '\"Departure Mono\", Roboto Mono, Source Code Pro, Menlo, Courier, monospace',\n '--ht-base-font-family-sans': '\"Routed Gothic\", ui-sans-serif, system-ui, sans-serif',\n '--ht-base-font-family-mono': '\"Routed Gothic Narrow\", ui-monospace, SFMono-Regular, SF Mono, Consolas, Liberation Mono, Menlo, monospace',\n },\n\n // Tweakpane-specific theme variables\n tweakpane: {\n '--tp-base-background-color': 'var(--ht-bg-color-700)',\n '--tp-base-shadow-color': 'hsla(0, 0%, 0%, 0.2)',\n\n '--tp-container-background-color': 'var(--ht-bg-color-600)',\n '--tp-container-background-color-active': 'var(--ht-bg-color-600-active)',\n '--tp-container-background-color-focus': 'var(--ht-bg-color-600-focus)',\n '--tp-container-background-color-hover': 'var(--ht-bg-color-600-hover)',\n '--tp-container-foreground-color': 'var(--ht-text-color-main-300)',\n\n '--tp-button-background-color': 'var(--ht-bg-color-400)',\n '--tp-button-background-color-active': 'color-mix(in srgb, var(--ht-bg-color-400-active) 80%, white)',\n '--tp-button-background-color-focus': 'color-mix(in srgb, var(--ht-bg-color-400-focus) 85%, white)',\n '--tp-button-background-color-hover': 'color-mix(in srgb, var(--ht-bg-color-400-hover) 90%, white)',\n '--tp-button-foreground-color': 'var(--ht-text-color-main-300)',\n\n '--tp-groove-foreground-color': 'var(--ht-bg-color-300)',\n\n '--tp-input-background-color': 'var(--ht-bg-color-500)',\n '--tp-input-background-color-active': 'var(--ht-bg-color-500-active)',\n '--tp-input-background-color-focus': 'var(--ht-bg-color-500-focus)',\n '--tp-input-background-color-hover': 'var(--ht-bg-color-500-hover)',\n '--tp-input-foreground-color': 'var(--ht-text-color-main-300)',\n\n '--tp-label-foreground-color': 'var(--ht-text-color-main-300)',\n\n '--tp-monitor-background-color': 'var(--ht-bg-color-500)',\n '--tp-monitor-foreground-color': 'var(--ht-text-color-main-300)',\n }\n};\n\n/**\n * Inject CSS variables into the document\n */\nexport function injectThemeVariables() {\n const style = document.createElement('style');\n style.id = 'hypertool-theme';\n\n const cssVars = Object.entries({\n ...studioTheme.cssVariables,\n ...studioTheme.tweakpane\n })\n .map(([key, value]) => ` ${key}: ${value};`)\n .join('\\n');\n\n style.textContent = `\n body {\n margin: 0;\n padding: 0;\n }\n\n:root {\n${cssVars}\n}\n\n/* Controls panel positioning and styling */\n.controls-container {\n position: fixed;\n top: 8px;\n right: 8px;\n z-index: 1000;\n max-height: calc(100vh - 16px);\n overflow-y: auto;\n}\n\n/* Ensure Tweakpane pane has background */\n.tp-dfwv {\n background-color: var(--tp-base-background-color, #0f1419) !important;\n}\n`;\n\n document.head.appendChild(style);\n}",
7
7
  "import { HypertoolControls } from './HypertoolControls';\nimport type { ControlDefinitions, HypertoolControlsOptions, ParameterValues } from './types';\n\n/**\n * Simple API for quick setup - returns params object directly\n *\n * @example\n * ```typescript\n * const params = createControls({\n * speed: { type: 'number', value: 1, min: 0, max: 10, step: 0.1 },\n * color: { type: 'color', value: '#ff0000' },\n * enabled: { type: 'boolean', value: true }\n * });\n *\n * // Use params directly in your code\n * circle.speed = params.speed;\n * circle.color = params.color;\n * ```\n */\nexport function createControls<T extends ControlDefinitions>(\n definitions: T,\n options?: HypertoolControlsOptions<T>\n): ParameterValues<T> {\n const controls = new HypertoolControls(definitions, options);\n return controls.params;\n}\n\n/**\n * Advanced API for full control - returns HypertoolControls instance\n *\n * @example\n * ```typescript\n * const controls = createControlPanel({\n * speed: { type: 'number', value: 1, min: 0, max: 10 }\n * }, {\n * title: 'Simulation',\n * onChange: (params) => console.log('Changed:', params)\n * });\n *\n * // Access params\n * const params = controls.params;\n *\n * // Programmatically update\n * controls.set('speed', 5);\n *\n * // Hide/show\n * controls.setVisible(false);\n * ```\n */\nexport function createControlPanel<T extends ControlDefinitions>(\n definitions: T,\n options?: HypertoolControlsOptions<T>\n): HypertoolControls<T> {\n return new HypertoolControls(definitions, options);\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "9B4AE28FA320332164756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "38F6DE9532D2840764756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -1,3 +1,15 @@
1
+ /**
2
+ * @hypertools/sdk
3
+ * Copyright (c) 2025 HyperTools Team
4
+ *
5
+ * Vanilla-first SDK for embedding interactive creative coding experiences.
6
+ * Supports p5.js, Three.js, WebGL, and more.
7
+ *
8
+ * @license MIT
9
+ * @see https://github.com/hypertools/sdk
10
+ */
1
11
  class H{_handlers=new Map;on(E,x){if(!this._handlers.has(E))this._handlers.set(E,new Set);return this._handlers.get(E).add(x),()=>this.off(E,x)}once(E,x){let C=(P)=>{this.off(E,C),x(P)};return this.on(E,C)}off(E,x){let C=this._handlers.get(E);if(C)C.delete(x)}emit(E){let x=this._handlers.get(E.type);if(!x)return;for(let C of x)try{C(E)}catch(P){console.error(`[EventEmitter] Handler error for ${E.type}:`,P)}}removeAllListeners(E){if(E)this._handlers.delete(E);else this._handlers.clear()}listenerCount(E){return this._handlers.get(E)?.size??0}}class O{_definitions;_values;_listeners;_proxy;constructor(E,x){this._definitions=E,this._listeners=new Set,this._values={};for(let[C,P]of Object.entries(E))this._values[C]=P.value;if(x){for(let[C,P]of Object.entries(x))if(C in this._definitions)this._values[C]=this._validate(C,P)}this._proxy=this._createProxy()}_createProxy(){let E=this;return new Proxy(this._values,{get(x,C){return x[C]},set(x,C,P){if(!(C in E._definitions))return console.warn(`[ParamStore] Unknown parameter: ${C}`),!1;let R=E._validate(C,P),D=x[C];if(R!==D)x[C]=R,E._notify(C,R,D);return!0},has(x,C){return C in x},ownKeys(x){return Object.keys(x)},getOwnPropertyDescriptor(x,C){if(C in x)return{enumerable:!0,configurable:!0,value:x[C]};return}})}_validate(E,x){let C=this._definitions[E];if(!C)return x;switch(C.type){case"number":{let P=typeof x==="number"?x:parseFloat(String(x));if(isNaN(P))P=C.value;if(C.min!==void 0)P=Math.max(C.min,P);if(C.max!==void 0)P=Math.min(C.max,P);if(C.step!==void 0)P=Math.round(P/C.step)*C.step;return P}case"color":{let P=String(x);if(/^#[0-9A-Fa-f]{6}$/.test(P))return P;if(/^#[0-9A-Fa-f]{3}$/.test(P))return P;if(/^#[0-9A-Fa-f]{8}$/.test(P))return P;if(/^rgb\(/.test(P))return P;if(/^rgba\(/.test(P))return P;if(/^hsl\(/.test(P))return P;if(/^hsla\(/.test(P))return P;return C.value}case"boolean":if(typeof x==="boolean")return x;if(x==="true"||x==="1")return!0;if(x==="false"||x==="0")return!1;return Boolean(x);case"string":return String(x);case"select":{let P=String(x);return(C.options||[]).some((F)=>typeof F==="object"?F.value===P:F===P)?P:C.value}case"point2d":{if(typeof x==="object"&&x!==null&&"x"in x&&"y"in x)return{x:Number(x.x),y:Number(x.y)};return C.value}case"point3d":{if(typeof x==="object"&&x!==null&&"x"in x&&"y"in x&&"z"in x)return{x:Number(x.x),y:Number(x.y),z:Number(x.z)};return C.value}default:return x}}_notify(E,x,C){for(let P of this._listeners)try{P(E,x,C)}catch(R){console.error("[ParamStore] Listener error:",R)}}getProxy(){return this._proxy}getSnapshot(){return{...this._values}}getDefinitions(){return{...this._definitions}}set(E,x){this._proxy[E]=x}setMultiple(E){for(let[x,C]of Object.entries(E))this._proxy[x]=C}reset(){for(let[E,x]of Object.entries(this._definitions))this._proxy[E]=x.value}subscribe(E){return this._listeners.add(E),()=>this._listeners.delete(E)}addDefinition(E,x){this._definitions[E]=x,this._values[E]=x.value}}class S{_byName=new Map;_byId=new Map;_onRegister=new Set;_onUnregister=new Set;register(E,x,C){if(this._byName.has(E))this.unregister(E);let P=this._generateId(),R={name:E,id:P,object:x,metadata:C};this._byName.set(E,R),this._byId.set(P,R);for(let D of this._onRegister)try{D(E,P,x)}catch(F){console.error("[ObjectRegistry] onRegister callback error:",F)}return P}unregister(E){let x=this._byName.get(E);if(!x)return!1;this._byName.delete(E),this._byId.delete(x.id);for(let C of this._onUnregister)try{C(E)}catch(P){console.error("[ObjectRegistry] onUnregister callback error:",P)}return!0}findByName(E){return this._byName.get(E)?.object}findById(E){return this._byId.get(E)?.object}getInfo(E){return this._byName.get(E)}has(E){return this._byName.has(E)}getNames(){return Array.from(this._byName.keys())}getAll(){let E=new Map;for(let[x,C]of this._byName)E.set(x,C.object);return E}query(E){let x=[];for(let C of this._byName.values())if(E(C))x.push(C);return x}findByType(E){return this.query((x)=>x.metadata?.type===E).map((x)=>x.object)}clear(){let E=Array.from(this._byName.keys());for(let x of E)this.unregister(x)}onRegister(E){return this._onRegister.add(E),()=>this._onRegister.delete(E)}onUnregister(E){return this._onUnregister.add(E),()=>this._onUnregister.delete(E)}get size(){return this._byName.size}_generateId(){return`obj_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}}class U{_isReady=!1;_isPlaying=!1;_isDestroyed=!1;_currentFrame=0;_paramStore;_events;_objects;_mount;_frameRate;_filename="capture";_cleanups=[];_userCleanup;_animationFrameId;_lastFrameTime=0;_resizeObserver;_captureHandler;constructor(E){if(this._mount=E.mount,this._frameRate=E.frameRate??60,E.background)this._mount.style.background=E.background;this._paramStore=new O(E.paramDefs??{},E.initialParams),this._events=new H,this._objects=new S,this._paramStore.subscribe((x,C,P)=>{this._events.emit({type:"paramChange",timestamp:Date.now(),key:x,value:C,previousValue:P})}),this._setupResizeObserver(),this._runSetup(E.setup,E.autoplay??!0)}get isReady(){return this._isReady}get isPlaying(){return this._isPlaying}get isDestroyed(){return this._isDestroyed}get currentFrame(){return this._currentFrame}get mount(){return this._mount}get params(){return this._paramStore.getProxy()}get events(){return this._events}get objects(){return this._objects}setParam(E,x){this._paramStore.set(E,x)}setParams(E){this._paramStore.setMultiple(E)}getParams(){return this._paramStore.getSnapshot()}getParamDefs(){return this._paramStore.getDefinitions()}resetParams(){this._paramStore.reset()}registerObject(E,x,C){return this._objects.register(E,x,C)}findObjectByName(E){return this._objects.findByName(E)}findObjectById(E){return this._objects.findById(E)}getAllObjects(){return this._objects.getAll()}play(){if(this._isPlaying||this._isDestroyed)return;this._isPlaying=!0,this._lastFrameTime=performance.now(),this._tick(),this._events.emit({type:"play",timestamp:Date.now()})}pause(){if(!this._isPlaying)return;if(this._isPlaying=!1,this._animationFrameId)cancelAnimationFrame(this._animationFrameId),this._animationFrameId=void 0;this._events.emit({type:"pause",timestamp:Date.now()})}toggle(){if(this._isPlaying)this.pause();else this.play()}on(E,x){return this._events.on(E,x)}once(E,x){return this._events.once(E,x)}off(E,x){this._events.off(E,x)}async captureImage(E="png"){if(this._captureHandler)return this._captureHandler(E);let x=this._mount.querySelector("canvas");if(!x)return console.warn("[Experience] No canvas found for capture"),null;return new Promise((C)=>{let P=`image/${E}`,R=E==="jpeg"?0.92:void 0;x.toBlob((D)=>C(D),P,R)})}getFilename(){return this._filename}addCleanup(E){if(typeof E==="function")this._cleanups.push(E)}destroy(){if(this._isDestroyed)return;if(this._isDestroyed=!0,this.pause(),this._userCleanup)try{this._userCleanup()}catch(E){console.error("[Experience] User cleanup error:",E)}while(this._cleanups.length>0){let E=this._cleanups.pop();if(E)try{E()}catch(x){console.error("[Experience] Cleanup error:",x)}}this._resizeObserver?.disconnect(),this._objects.clear(),this._events.removeAllListeners(),this._events.emit({type:"destroyed",timestamp:Date.now()})}async _runSetup(E,x){try{let C=this._createContext(),P=await E(C);if(typeof P==="function")this._userCleanup=P;if(this._isReady=!0,this._events.emit({type:"ready",timestamp:Date.now()}),x)this.play()}catch(C){console.error("[Experience] Setup error:",C),this._events.emit({type:"error",timestamp:Date.now(),error:C instanceof Error?C:Error(String(C))})}}_createContext(){return{mount:this._mount,params:this._paramStore.getProxy(),exports:this._createExportsApi(),environment:this._createEnvironmentApi(),registerObject:(E,x,C)=>this._objects.register(E,x,C),findObjectByName:(E)=>this._objects.findByName(E),experience:this}}_createExportsApi(){return{captureImage:(E)=>this.captureImage(E),setFilename:(E)=>{this._filename=E},registerCaptureHandler:(E)=>{this._captureHandler=E}}}_createEnvironmentApi(){return{window,document,onResize:(E)=>{let x=()=>{E(this._mount.clientWidth,this._mount.clientHeight)};x();let C=new ResizeObserver(x);C.observe(this._mount);let P=()=>C.disconnect();return this._cleanups.push(P),P},addCleanup:(E)=>this.addCleanup(E)}}_setupResizeObserver(){this._resizeObserver=new ResizeObserver((E)=>{for(let x of E){let{width:C,height:P}=x.contentRect;this._events.emit({type:"resize",timestamp:Date.now(),width:C,height:P})}}),this._resizeObserver.observe(this._mount)}_tick(){if(!this._isPlaying)return;let E=performance.now(),x=E-this._lastFrameTime,C=1000/this._frameRate;if(x>=C)this._currentFrame++,this._lastFrameTime=E-x%C,this._events.emit({type:"frame",timestamp:Date.now(),frame:this._currentFrame,deltaTime:x});this._animationFrameId=requestAnimationFrame(()=>this._tick())}}export{O as ParamStore,S as ObjectRegistry,U as Experience,H as EventEmitter};
2
12
 
3
- //# debugId=730310C6746E3D6664756E2164756E21
13
+ /* @hypertools/sdk - MIT License - https://hypertools.dev */
14
+
15
+ //# debugId=BE20C8AEA123CFE964756E2164756E21
@@ -7,7 +7,7 @@
7
7
  "/**\n * Spline-like object registry for querying objects by name/id\n */\n\nexport interface RegisteredObject<T = unknown> {\n name: string;\n id: string;\n object: T;\n metadata?: Record<string, unknown>;\n}\n\nexport type ObjectRegisteredCallback = (name: string, id: string, object: unknown) => void;\nexport type ObjectUnregisteredCallback = (name: string) => void;\n\nexport class ObjectRegistry {\n private _byName = new Map<string, RegisteredObject>();\n private _byId = new Map<string, RegisteredObject>();\n private _onRegister: Set<ObjectRegisteredCallback> = new Set();\n private _onUnregister: Set<ObjectUnregisteredCallback> = new Set();\n\n /**\n * Register an object for external access\n * @returns Generated ID for the object\n */\n register<T>(\n name: string,\n object: T,\n metadata?: Record<string, unknown>\n ): string {\n // If name already exists, unregister first\n if (this._byName.has(name)) {\n this.unregister(name);\n }\n\n const id = this._generateId();\n\n const registered: RegisteredObject<T> = {\n name,\n id,\n object,\n metadata,\n };\n\n this._byName.set(name, registered);\n this._byId.set(id, registered);\n\n // Notify listeners\n for (const callback of this._onRegister) {\n try {\n callback(name, id, object);\n } catch (e) {\n console.error('[ObjectRegistry] onRegister callback error:', e);\n }\n }\n\n return id;\n }\n\n /**\n * Unregister an object by name\n */\n unregister(name: string): boolean {\n const obj = this._byName.get(name);\n if (!obj) return false;\n\n this._byName.delete(name);\n this._byId.delete(obj.id);\n\n // Notify listeners\n for (const callback of this._onUnregister) {\n try {\n callback(name);\n } catch (e) {\n console.error('[ObjectRegistry] onUnregister callback error:', e);\n }\n }\n\n return true;\n }\n\n /**\n * Find object by name (Spline-like API)\n */\n findByName<T = unknown>(name: string): T | undefined {\n return this._byName.get(name)?.object as T | undefined;\n }\n\n /**\n * Find object by ID\n */\n findById<T = unknown>(id: string): T | undefined {\n return this._byId.get(id)?.object as T | undefined;\n }\n\n /**\n * Get registered object info by name\n */\n getInfo(name: string): RegisteredObject | undefined {\n return this._byName.get(name);\n }\n\n /**\n * Check if an object exists\n */\n has(name: string): boolean {\n return this._byName.has(name);\n }\n\n /**\n * Get all registered object names\n */\n getNames(): string[] {\n return Array.from(this._byName.keys());\n }\n\n /**\n * Get all registered objects as a Map\n */\n getAll(): Map<string, unknown> {\n const result = new Map<string, unknown>();\n for (const [name, registered] of this._byName) {\n result.set(name, registered.object);\n }\n return result;\n }\n\n /**\n * Query objects by metadata\n */\n query(predicate: (obj: RegisteredObject) => boolean): RegisteredObject[] {\n const results: RegisteredObject[] = [];\n for (const obj of this._byName.values()) {\n if (predicate(obj)) {\n results.push(obj);\n }\n }\n return results;\n }\n\n /**\n * Query objects by type (requires metadata.type to be set)\n */\n findByType<T = unknown>(type: string): T[] {\n return this.query((obj) => obj.metadata?.type === type).map(\n (obj) => obj.object as T\n );\n }\n\n /**\n * Clear all registered objects\n */\n clear(): void {\n const names = Array.from(this._byName.keys());\n for (const name of names) {\n this.unregister(name);\n }\n }\n\n /**\n * Subscribe to object registration events\n */\n onRegister(callback: ObjectRegisteredCallback): () => void {\n this._onRegister.add(callback);\n return () => this._onRegister.delete(callback);\n }\n\n /**\n * Subscribe to object unregistration events\n */\n onUnregister(callback: ObjectUnregisteredCallback): () => void {\n this._onUnregister.add(callback);\n return () => this._onUnregister.delete(callback);\n }\n\n /**\n * Get the number of registered objects\n */\n get size(): number {\n return this._byName.size;\n }\n\n private _generateId(): string {\n return `obj_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n}\n",
8
8
  "/**\n * Core Experience class - THE shared logic for all runtimes\n *\n * This is the brain. All adapters (Frame, Export, HostedPreview) use this.\n * Adapters are thin wiring layers - Experience contains ALL the logic.\n */\n\nimport {\n EventEmitter,\n type ExperienceEvent,\n type EventHandler,\n type ParamChangeEvent,\n type FrameEvent,\n type ResizeEvent,\n type ErrorEvent,\n} from './EventEmitter';\nimport { ParamStore, type ParamDefinitions, type ParamValues } from './ParamStore';\nimport { ObjectRegistry } from './ObjectRegistry';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ExperienceConfig {\n /** Mount element where content is rendered */\n mount: HTMLElement;\n\n /** Parameter definitions schema */\n paramDefs?: ParamDefinitions;\n\n /** Initial parameter values (overrides defaults from paramDefs) */\n initialParams?: Record<string, unknown>;\n\n /** User's setup function */\n setup: SetupFunction;\n\n /** Auto-start on init (default: true) */\n autoplay?: boolean;\n\n /** Target frame rate for frame events (default: 60) */\n frameRate?: number;\n\n /** Background color/style */\n background?: string;\n}\n\n/**\n * Context passed to user's setup function\n * This is the API users interact with in their code\n */\nexport interface ExperienceContext {\n /** DOM element to render into */\n mount: HTMLElement;\n\n /** Reactive params object (Proxy) - changes trigger events */\n params: ParamValues;\n\n /** Export/capture utilities */\n exports: ExportsApi;\n\n /** Environment utilities (window, document, resize) */\n environment: EnvironmentApi;\n\n /** Register an object for Spline-like queries */\n registerObject: <T = unknown>(\n name: string,\n object: T,\n metadata?: Record<string, unknown>\n ) => string;\n\n /** Find registered object by name */\n findObjectByName: <T = unknown>(name: string) => T | undefined;\n\n /** Experience instance (for advanced use) */\n experience: Experience;\n}\n\nexport interface ExportsApi {\n /** Capture canvas as image */\n captureImage: (format?: 'png' | 'jpeg' | 'webp') => Promise<Blob | null>;\n\n /** Set filename for exports */\n setFilename: (filename: string) => void;\n\n /** Register custom capture handler */\n registerCaptureHandler: (handler: CaptureHandler) => void;\n}\n\nexport type CaptureHandler = (format: string) => Promise<Blob | null>;\n\nexport interface EnvironmentApi {\n /** Window reference */\n window: Window;\n\n /** Document reference */\n document: Document;\n\n /** Subscribe to resize events, returns cleanup */\n onResize: (callback: (width: number, height: number) => void) => () => void;\n\n /** Add cleanup function to be called on destroy */\n addCleanup: (cleanup: () => void) => void;\n}\n\nexport type SetupFunction = (\n context: ExperienceContext\n) => CleanupFunction | void | Promise<CleanupFunction | void>;\n\nexport type CleanupFunction = () => void;\n\n// ============================================================================\n// Experience Class\n// ============================================================================\n\nexport class Experience {\n // State\n private _isReady = false;\n private _isPlaying = false;\n private _isDestroyed = false;\n private _currentFrame = 0;\n\n // Core systems\n private _paramStore: ParamStore;\n private _events: EventEmitter;\n private _objects: ObjectRegistry;\n\n // Config\n private _mount: HTMLElement;\n private _frameRate: number;\n private _filename = 'capture';\n\n // Lifecycle\n private _cleanups: CleanupFunction[] = [];\n private _userCleanup?: CleanupFunction;\n private _animationFrameId?: number;\n private _lastFrameTime = 0;\n private _resizeObserver?: ResizeObserver;\n private _captureHandler?: CaptureHandler;\n\n constructor(config: ExperienceConfig) {\n this._mount = config.mount;\n this._frameRate = config.frameRate ?? 60;\n\n // Apply background if provided\n if (config.background) {\n this._mount.style.background = config.background;\n }\n\n // Initialize core systems\n this._paramStore = new ParamStore(\n config.paramDefs ?? {},\n config.initialParams\n );\n this._events = new EventEmitter();\n this._objects = new ObjectRegistry();\n\n // Subscribe to param changes -> emit events\n this._paramStore.subscribe((key, value, previousValue) => {\n this._events.emit<ParamChangeEvent>({\n type: 'paramChange',\n timestamp: Date.now(),\n key,\n value,\n previousValue,\n });\n });\n\n // Setup resize observer\n this._setupResizeObserver();\n\n // Run user setup\n this._runSetup(config.setup, config.autoplay ?? true);\n }\n\n // ===== Public Getters =====\n\n get isReady(): boolean {\n return this._isReady;\n }\n\n get isPlaying(): boolean {\n return this._isPlaying;\n }\n\n get isDestroyed(): boolean {\n return this._isDestroyed;\n }\n\n get currentFrame(): number {\n return this._currentFrame;\n }\n\n get mount(): HTMLElement {\n return this._mount;\n }\n\n /** Reactive params proxy */\n get params(): ParamValues {\n return this._paramStore.getProxy();\n }\n\n /** EventEmitter for external subscriptions */\n get events(): EventEmitter {\n return this._events;\n }\n\n /** ObjectRegistry for external access */\n get objects(): ObjectRegistry {\n return this._objects;\n }\n\n // ===== Parameter Methods =====\n\n setParam(key: string, value: unknown): void {\n this._paramStore.set(key, value);\n }\n\n setParams(params: Record<string, unknown>): void {\n this._paramStore.setMultiple(params);\n }\n\n getParams(): Record<string, unknown> {\n return this._paramStore.getSnapshot();\n }\n\n getParamDefs(): ParamDefinitions {\n return this._paramStore.getDefinitions();\n }\n\n resetParams(): void {\n this._paramStore.reset();\n }\n\n // ===== Object Registry (Spline-like) =====\n\n registerObject<T = unknown>(\n name: string,\n object: T,\n metadata?: Record<string, unknown>\n ): string {\n return this._objects.register(name, object, metadata);\n }\n\n findObjectByName<T = unknown>(name: string): T | undefined {\n return this._objects.findByName<T>(name);\n }\n\n findObjectById<T = unknown>(id: string): T | undefined {\n return this._objects.findById<T>(id);\n }\n\n getAllObjects(): Map<string, unknown> {\n return this._objects.getAll();\n }\n\n // ===== Playback =====\n\n play(): void {\n if (this._isPlaying || this._isDestroyed) return;\n this._isPlaying = true;\n this._lastFrameTime = performance.now();\n this._tick();\n this._events.emit({ type: 'play', timestamp: Date.now() });\n }\n\n pause(): void {\n if (!this._isPlaying) return;\n this._isPlaying = false;\n if (this._animationFrameId) {\n cancelAnimationFrame(this._animationFrameId);\n this._animationFrameId = undefined;\n }\n this._events.emit({ type: 'pause', timestamp: Date.now() });\n }\n\n toggle(): void {\n if (this._isPlaying) {\n this.pause();\n } else {\n this.play();\n }\n }\n\n // ===== Events =====\n\n on<T extends ExperienceEvent>(\n type: T['type'],\n handler: EventHandler<T>\n ): () => void {\n return this._events.on(type, handler);\n }\n\n once<T extends ExperienceEvent>(\n type: T['type'],\n handler: EventHandler<T>\n ): () => void {\n return this._events.once(type, handler);\n }\n\n off<T extends ExperienceEvent>(\n type: T['type'],\n handler: EventHandler<T>\n ): void {\n this._events.off(type, handler);\n }\n\n // ===== Capture =====\n\n async captureImage(format: 'png' | 'jpeg' | 'webp' = 'png'): Promise<Blob | null> {\n // Use custom handler if registered\n if (this._captureHandler) {\n return this._captureHandler(format);\n }\n\n // Default: find canvas and capture\n const canvas = this._mount.querySelector('canvas');\n if (!canvas) {\n console.warn('[Experience] No canvas found for capture');\n return null;\n }\n\n return new Promise((resolve) => {\n const mimeType = `image/${format}`;\n const quality = format === 'jpeg' ? 0.92 : undefined;\n canvas.toBlob((blob) => resolve(blob), mimeType, quality);\n });\n }\n\n getFilename(): string {\n return this._filename;\n }\n\n // ===== Lifecycle =====\n\n /**\n * Add a cleanup function to be called on destroy\n */\n addCleanup(cleanup: CleanupFunction): void {\n if (typeof cleanup === 'function') {\n this._cleanups.push(cleanup);\n }\n }\n\n /**\n * Destroy the experience and run all cleanups\n */\n destroy(): void {\n if (this._isDestroyed) return;\n this._isDestroyed = true;\n\n // Stop animation\n this.pause();\n\n // Run user cleanup first\n if (this._userCleanup) {\n try {\n this._userCleanup();\n } catch (e) {\n console.error('[Experience] User cleanup error:', e);\n }\n }\n\n // Run registered cleanups (reverse order)\n while (this._cleanups.length > 0) {\n const cleanup = this._cleanups.pop();\n if (cleanup) {\n try {\n cleanup();\n } catch (e) {\n console.error('[Experience] Cleanup error:', e);\n }\n }\n }\n\n // Disconnect observers\n this._resizeObserver?.disconnect();\n\n // Clear registry\n this._objects.clear();\n\n // Remove all event listeners\n this._events.removeAllListeners();\n\n // Emit destroyed event before clearing\n this._events.emit({ type: 'destroyed', timestamp: Date.now() });\n }\n\n // ===== Private Methods =====\n\n private async _runSetup(setup: SetupFunction, autoplay: boolean): Promise<void> {\n try {\n // Create context for user's setup\n const context = this._createContext();\n\n // Run user's setup\n const cleanup = await setup(context);\n if (typeof cleanup === 'function') {\n this._userCleanup = cleanup;\n }\n\n this._isReady = true;\n this._events.emit({ type: 'ready', timestamp: Date.now() });\n\n // Autoplay if enabled\n if (autoplay) {\n this.play();\n }\n } catch (error) {\n console.error('[Experience] Setup error:', error);\n this._events.emit<ErrorEvent>({\n type: 'error',\n timestamp: Date.now(),\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n private _createContext(): ExperienceContext {\n return {\n mount: this._mount,\n params: this._paramStore.getProxy(),\n exports: this._createExportsApi(),\n environment: this._createEnvironmentApi(),\n registerObject: (name, object, metadata) =>\n this._objects.register(name, object, metadata),\n findObjectByName: (name) => this._objects.findByName(name),\n experience: this,\n };\n }\n\n private _createExportsApi(): ExportsApi {\n return {\n captureImage: (format) => this.captureImage(format),\n setFilename: (filename) => {\n this._filename = filename;\n },\n registerCaptureHandler: (handler) => {\n this._captureHandler = handler;\n },\n };\n }\n\n private _createEnvironmentApi(): EnvironmentApi {\n return {\n window,\n document,\n onResize: (callback) => {\n const handler = () => {\n callback(this._mount.clientWidth, this._mount.clientHeight);\n };\n\n // Call immediately with current size\n handler();\n\n // Setup observer\n const ro = new ResizeObserver(handler);\n ro.observe(this._mount);\n\n const cleanup = () => ro.disconnect();\n this._cleanups.push(cleanup);\n return cleanup;\n },\n addCleanup: (cleanup) => this.addCleanup(cleanup),\n };\n }\n\n private _setupResizeObserver(): void {\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n this._events.emit<ResizeEvent>({\n type: 'resize',\n timestamp: Date.now(),\n width,\n height,\n });\n }\n });\n this._resizeObserver.observe(this._mount);\n }\n\n private _tick(): void {\n if (!this._isPlaying) return;\n\n const now = performance.now();\n const deltaTime = now - this._lastFrameTime;\n const targetInterval = 1000 / this._frameRate;\n\n if (deltaTime >= targetInterval) {\n this._currentFrame++;\n this._lastFrameTime = now - (deltaTime % targetInterval);\n\n this._events.emit<FrameEvent>({\n type: 'frame',\n timestamp: Date.now(),\n frame: this._currentFrame,\n deltaTime,\n });\n }\n\n this._animationFrameId = requestAnimationFrame(() => this._tick());\n }\n}\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "730310C6746E3D6664756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "BE20C8AEA123CFE964756E2164756E21",
12
12
  "names": []
13
13
  }
package/dist/index.js CHANGED
@@ -1,3 +1,13 @@
1
+ /**
2
+ * @hypertools/sdk
3
+ * Copyright (c) 2025 HyperTools Team
4
+ *
5
+ * Vanilla-first SDK for embedding interactive creative coding experiences.
6
+ * Supports p5.js, Three.js, WebGL, and more.
7
+ *
8
+ * @license MIT
9
+ * @see https://github.com/hypertools/sdk
10
+ */
1
11
  var sR=Object.create;var{getPrototypeOf:lR,defineProperty:IW,getOwnPropertyNames:iR}=Object;var nR=Object.prototype.hasOwnProperty;var zQ=(Z,Y,K)=>{K=Z!=null?sR(lR(Z)):{};let z=Y||!Z||!Z.__esModule?IW(K,"default",{value:Z,enumerable:!0}):K;for(let $ of iR(Z))if(!nR.call(z,$))IW(z,$,{get:()=>Z[$],enumerable:!0});return z};var m1=(Z,Y)=>()=>(Y||Z((Y={exports:{}}).exports,Y),Y.exports);var G8=m1((rT,UG)=>{(function(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart==="function")__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var Z="18.3.1",Y=Symbol.for("react.element"),K=Symbol.for("react.portal"),z=Symbol.for("react.fragment"),$=Symbol.for("react.strict_mode"),F=Symbol.for("react.profiler"),B=Symbol.for("react.provider"),j=Symbol.for("react.context"),y=Symbol.for("react.forward_ref"),_=Symbol.for("react.suspense"),b=Symbol.for("react.suspense_list"),k=Symbol.for("react.memo"),a=Symbol.for("react.lazy"),DJ=Symbol.for("react.offscreen"),_J=Symbol.iterator,yJ="@@iterator";function CJ(D){if(D===null||typeof D!=="object")return null;var A=_J&&D[_J]||D[yJ];if(typeof A==="function")return A;return null}var g={current:null},KJ={transition:null},c={current:null,isBatchingLegacy:!1,didScheduleLegacyUpdate:!1},qJ={current:null},d={},UJ=null;function SJ(D){UJ=D}d.setExtraStackFrame=function(D){UJ=D},d.getCurrentStack=null,d.getStackAddendum=function(){var D="";if(UJ)D+=UJ;var A=d.getCurrentStack;if(A)D+=A()||"";return D};var zJ=!1,i=!1,$J=!1,LJ=!1,JJ=!1,YJ={ReactCurrentDispatcher:g,ReactCurrentBatchConfig:KJ,ReactCurrentOwner:qJ};YJ.ReactDebugCurrentFrame=d,YJ.ReactCurrentActQueue=c;function TJ(D){{for(var A=arguments.length,V=Array(A>1?A-1:0),C=1;C<A;C++)V[C-1]=arguments[C];AJ("warn",D,V)}}function QJ(D){{for(var A=arguments.length,V=Array(A>1?A-1:0),C=1;C<A;C++)V[C-1]=arguments[C];AJ("error",D,V)}}function AJ(D,A,V){{var C=YJ.ReactDebugCurrentFrame,m=C.getStackAddendum();if(m!=="")A+="%s",V=V.concat([m]);var IJ=V.map(function(XJ){return String(XJ)});IJ.unshift("Warning: "+A),Function.prototype.apply.call(console[D],console,IJ)}}var BQ={};function vQ(D,A){{var V=D.constructor,C=V&&(V.displayName||V.name)||"ReactClass",m=C+"."+A;if(BQ[m])return;QJ("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",A,C),BQ[m]=!0}}var mZ={isMounted:function(D){return!1},enqueueForceUpdate:function(D,A,V){vQ(D,"forceUpdate")},enqueueReplaceState:function(D,A,V,C){vQ(D,"replaceState")},enqueueSetState:function(D,A,V,C){vQ(D,"setState")}},cQ=Object.assign,$Q={};Object.freeze($Q);function uQ(D,A,V){this.props=D,this.context=A,this.refs=$Q,this.updater=V||mZ}uQ.prototype.isReactComponent={},uQ.prototype.setState=function(D,A){if(typeof D!=="object"&&typeof D!=="function"&&D!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,D,A,"setState")},uQ.prototype.forceUpdate=function(D){this.updater.enqueueForceUpdate(this,D,"forceUpdate")};{var cZ={isMounted:["isMounted","Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],replaceState:["replaceState","Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]},Z7=function(D,A){Object.defineProperty(uQ.prototype,D,{get:function(){TJ("%s(...) is deprecated in plain JavaScript React classes. %s",A[0],A[1]);return}})};for(var f7 in cZ)if(cZ.hasOwnProperty(f7))Z7(f7,cZ[f7])}function v7(){}v7.prototype=uQ.prototype;function ZZ(D,A,V){this.props=D,this.context=A,this.refs=$Q,this.updater=V||mZ}var X7=ZZ.prototype=new v7;X7.constructor=ZZ,cQ(X7,uQ.prototype),X7.isPureReactComponent=!0;function PZ(){var D={current:null};return Object.seal(D),D}var I7=Array.isArray;function yQ(D){return I7(D)}function Y7(D){{var A=typeof Symbol==="function"&&Symbol.toStringTag,V=A&&D[Symbol.toStringTag]||D.constructor.name||"Object";return V}}function j7(D){try{return pQ(D),!1}catch(A){return!0}}function pQ(D){return""+D}function SQ(D){if(j7(D))return QJ("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",Y7(D)),pQ(D)}function pZ(D,A,V){var C=D.displayName;if(C)return C;var m=A.displayName||A.name||"";return m!==""?V+"("+m+")":V}function u7(D){return D.displayName||"Context"}function XZ(D){if(D==null)return null;if(typeof D.tag==="number")QJ("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.");if(typeof D==="function")return D.displayName||D.name||null;if(typeof D==="string")return D;switch(D){case z:return"Fragment";case K:return"Portal";case F:return"Profiler";case $:return"StrictMode";case _:return"Suspense";case b:return"SuspenseList"}if(typeof D==="object")switch(D.$$typeof){case j:var A=D;return u7(A)+".Consumer";case B:var V=D;return u7(V._context)+".Provider";case y:return pZ(D,D.render,"ForwardRef");case k:var C=D.displayName||null;if(C!==null)return C;return XZ(D.type)||"Memo";case a:{var m=D,IJ=m._payload,XJ=m._init;try{return XZ(XJ(IJ))}catch(PJ){return null}}}return null}var P7=Object.prototype.hasOwnProperty,qX={key:!0,ref:!0,__self:!0,__source:!0},G7,K7,sQ;sQ={};function N7(D){if(P7.call(D,"ref")){var A=Object.getOwnPropertyDescriptor(D,"ref").get;if(A&&A.isReactWarning)return!1}return D.ref!==void 0}function NZ(D){if(P7.call(D,"key")){var A=Object.getOwnPropertyDescriptor(D,"key").get;if(A&&A.isReactWarning)return!1}return D.key!==void 0}function $Z(D,A){var V=function(){if(!G7)G7=!0,QJ("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",A)};V.isReactWarning=!0,Object.defineProperty(D,"key",{get:V,configurable:!0})}function K8(D,A){var V=function(){if(!K7)K7=!0,QJ("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",A)};V.isReactWarning=!0,Object.defineProperty(D,"ref",{get:V,configurable:!0})}function U8(D){if(typeof D.ref==="string"&&qJ.current&&D.__self&&qJ.current.stateNode!==D.__self){var A=XZ(qJ.current.type);if(!sQ[A])QJ('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',A,D.ref),sQ[A]=!0}}var g7=function(D,A,V,C,m,IJ,XJ){var PJ={$$typeof:Y,type:D,key:A,ref:V,props:XJ,_owner:IJ};if(PJ._store={},Object.defineProperty(PJ._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(PJ,"_self",{configurable:!1,enumerable:!1,writable:!1,value:C}),Object.defineProperty(PJ,"_source",{configurable:!1,enumerable:!1,writable:!1,value:m}),Object.freeze)Object.freeze(PJ.props),Object.freeze(PJ);return PJ};function U7(D,A,V){var C,m={},IJ=null,XJ=null,PJ=null,gJ=null;if(A!=null){if(N7(A))XJ=A.ref,U8(A);if(NZ(A))SQ(A.key),IJ=""+A.key;PJ=A.__self===void 0?null:A.__self,gJ=A.__source===void 0?null:A.__source;for(C in A)if(P7.call(A,C)&&!qX.hasOwnProperty(C))m[C]=A[C]}var XQ=arguments.length-2;if(XQ===1)m.children=V;else if(XQ>1){var LQ=Array(XQ);for(var WQ=0;WQ<XQ;WQ++)LQ[WQ]=arguments[WQ+2];if(Object.freeze)Object.freeze(LQ);m.children=LQ}if(D&&D.defaultProps){var jQ=D.defaultProps;for(C in jQ)if(m[C]===void 0)m[C]=jQ[C]}if(IJ||XJ){var EQ=typeof D==="function"?D.displayName||D.name||"Unknown":D;if(IJ)$Z(m,EQ);if(XJ)K8(m,EQ)}return g7(D,IJ,XJ,PJ,gJ,qJ.current,m)}function r(D,A){var V=g7(D.type,A,D.ref,D._self,D._source,D._owner,D.props);return V}function WJ(D,A,V){if(D===null||D===void 0)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+D+".");var C,m=cQ({},D.props),IJ=D.key,XJ=D.ref,PJ=D._self,gJ=D._source,XQ=D._owner;if(A!=null){if(N7(A))XJ=A.ref,XQ=qJ.current;if(NZ(A))SQ(A.key),IJ=""+A.key;var LQ;if(D.type&&D.type.defaultProps)LQ=D.type.defaultProps;for(C in A)if(P7.call(A,C)&&!qX.hasOwnProperty(C))if(A[C]===void 0&&LQ!==void 0)m[C]=LQ[C];else m[C]=A[C]}var WQ=arguments.length-2;if(WQ===1)m.children=V;else if(WQ>1){var jQ=Array(WQ);for(var EQ=0;EQ<WQ;EQ++)jQ[EQ]=arguments[EQ+2];m.children=jQ}return g7(D.type,IJ,XJ,PJ,gJ,XQ,m)}function VJ(D){return typeof D==="object"&&D!==null&&D.$$typeof===Y}var JQ=".",OQ=":";function lQ(D){var A=/[=:]/g,V={"=":"=0",":":"=2"},C=D.replace(A,function(m){return V[m]});return"$"+C}var AQ=!1,wZ=/\/+/g;function cJ(D){return D.replace(wZ,"$&/")}function rJ(D,A){if(typeof D==="object"&&D!==null&&D.key!=null)return SQ(D.key),lQ(""+D.key);return A.toString(36)}function T8(D,A,V,C,m){var IJ=typeof D;if(IJ==="undefined"||IJ==="boolean")D=null;var XJ=!1;if(D===null)XJ=!0;else switch(IJ){case"string":case"number":XJ=!0;break;case"object":switch(D.$$typeof){case Y:case K:XJ=!0}}if(XJ){var PJ=D,gJ=m(PJ),XQ=C===""?JQ+rJ(PJ,0):C;if(yQ(gJ)){var LQ="";if(XQ!=null)LQ=cJ(XQ)+"/";T8(gJ,A,LQ,"",function(FG){return FG})}else if(gJ!=null){if(VJ(gJ)){if(gJ.key&&(!PJ||PJ.key!==gJ.key))SQ(gJ.key);gJ=r(gJ,V+(gJ.key&&(!PJ||PJ.key!==gJ.key)?cJ(""+gJ.key)+"/":"")+XQ)}A.push(gJ)}return 1}var WQ,jQ,EQ=0,tJ=C===""?JQ:C+OQ;if(yQ(D))for(var Z9=0;Z9<D.length;Z9++)WQ=D[Z9],jQ=tJ+rJ(WQ,Z9),EQ+=T8(WQ,A,V,jQ,m);else{var r9=CJ(D);if(typeof r9==="function"){var I6=D;if(r9===I6.entries){if(!AQ)TJ("Using Maps as children is not supported. Use an array of keyed ReactElements instead.");AQ=!0}var MG=r9.call(I6),k8,j6=0;while(!(k8=MG.next()).done)WQ=k8.value,jQ=tJ+rJ(WQ,j6++),EQ+=T8(WQ,A,V,jQ,m)}else if(IJ==="object"){var P6=String(D);throw Error("Objects are not valid as a React child (found: "+(P6==="[object Object]"?"object with keys {"+Object.keys(D).join(", ")+"}":P6)+"). If you meant to render a collection of children, use an array instead.")}}return EQ}function w7(D,A,V){if(D==null)return D;var C=[],m=0;return T8(D,C,"","",function(IJ){return A.call(V,IJ,m++)}),C}function zX(D){var A=0;return w7(D,function(){A++}),A}function K6(D,A,V){w7(D,function(){A.apply(this,arguments)},V)}function m9(D){return w7(D,function(A){return A})||[]}function c9(D){if(!VJ(D))throw Error("React.Children.only expected to receive a single React element child.");return D}function tX(D){var A={$$typeof:j,_currentValue:D,_currentValue2:D,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};A.Provider={$$typeof:B,_context:A};var V=!1,C=!1,m=!1;{var IJ={$$typeof:j,_context:A};Object.defineProperties(IJ,{Provider:{get:function(){if(!C)C=!0,QJ("Rendering <Context.Consumer.Provider> is not supported and will be removed in a future major release. Did you mean to render <Context.Provider> instead?");return A.Provider},set:function(XJ){A.Provider=XJ}},_currentValue:{get:function(){return A._currentValue},set:function(XJ){A._currentValue=XJ}},_currentValue2:{get:function(){return A._currentValue2},set:function(XJ){A._currentValue2=XJ}},_threadCount:{get:function(){return A._threadCount},set:function(XJ){A._threadCount=XJ}},Consumer:{get:function(){if(!V)V=!0,QJ("Rendering <Context.Consumer.Consumer> is not supported and will be removed in a future major release. Did you mean to render <Context.Consumer> instead?");return A.Consumer}},displayName:{get:function(){return A.displayName},set:function(XJ){if(!m)TJ("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.",XJ),m=!0}}}),A.Consumer=IJ}return A._currentRenderer=null,A._currentRenderer2=null,A}var q8=-1,$X=0,OX=1,d7=2;function m7(D){if(D._status===q8){var A=D._result,V=A();if(V.then(function(IJ){if(D._status===$X||D._status===q8){var XJ=D;XJ._status=OX,XJ._result=IJ}},function(IJ){if(D._status===$X||D._status===q8){var XJ=D;XJ._status=d7,XJ._result=IJ}}),D._status===q8){var C=D;C._status=$X,C._result=V}}if(D._status===OX){var m=D._result;if(m===void 0)QJ(`lazy: Expected the result of a dynamic import() call. Instead received: %s
2
12
 
3
13
  Your code should look like:
@@ -186,4 +196,7 @@ ${Y}
186
196
  }
187
197
  `,document.head.appendChild(Z)}class u9{constructor(Z,Y={}){this.pane=null,this.definitions=Z,this.options={title:Y.title||"Controls",position:Y.position||"top-right",expanded:Y.expanded!==void 0?Y.expanded:!0,container:Y.container!==void 0?Y.container:null,onChange:Y.onChange||(()=>{}),onReady:Y.onReady||(()=>{})},this.params=this.extractInitialValues(Z),this.init()}isFolder(Z){return Z&&typeof Z==="object"&&(Z.type==="folder"||Z.type==="group")}isButton(Z){return Z&&typeof Z==="object"&&Z.type==="button"}isTab(Z){return Z&&typeof Z==="object"&&Z.type==="tab"}isFile(Z){return Z&&typeof Z==="object"&&Z.type==="file"}extractInitialValues(Z){let Y={};for(let[K,z]of Object.entries(Z)){let $=z;if(this.isFolder($))Y[K]=this.extractInitialValues($.controls);else if(this.isTab($))Y[K]=$.pages.map((F)=>this.extractInitialValues(F.controls));else if(this.isButton($))continue;else Y[K]=$.value}return Y}async init(){try{H4(),await new Promise((Z)=>setTimeout(Z,50)),this.createPane(),this.addControls(),this.options.onReady()}catch(Z){console.error("[HypertoolControls] Initialization error:",Z)}}createPane(){let Z=this.resolveContainer(),Y={title:this.options.title,expanded:this.options.expanded};if(Z)Y.container=Z;this.pane=new G$(Y),this.pane.element.parentElement?.classList.add("controls-container")}resolveContainer(){if(typeof document>"u")return null;let Z=this.options.container;if(!Z)return null;if(Z instanceof HTMLElement)return Z;let Y=document.querySelector(Z);if(!Y)return console.warn(`[HypertoolControls] Container selector "${Z}" did not match any elements`),null;return Y}addControls(){if(!this.pane)return;this.addControlsToTarget(this.pane,this.definitions,this.params)}addControlsToTarget(Z,Y,K){for(let[z,$]of Object.entries(Y))try{if(this.isFolder($)){let F={title:$.label||z};if($.expanded!==void 0)F.expanded=$.expanded;let B=Z.addFolder(F);this.addControlsToTarget(B,$.controls,K[z])}else if(this.isButton($)){let F={title:$.title};if($.label)F.label=$.label;let B=Z.addButton(F);if($.onClick)B.on("click",$.onClick)}else if(this.isTab($)){let F={pages:$.pages.map((j)=>({title:j.title}))},B=Z.addTab(F);$.pages.forEach((j,y)=>{this.addControlsToTarget(B.pages[y],j.controls,K[z][y])})}else if(this.isFile($))this.addFileControl(Z,z,$,K);else this.addControlToTarget(Z,z,$,K)}catch(F){console.error(`[HypertoolControls] Error adding control/folder/button/tab "${z}":`,F)}}addControlToTarget(Z,Y,K,z){if(this.isFolder(K))return;let $={label:K.label||Y};if(K.readonly!==void 0)$.readonly=K.readonly;if(K.interval!==void 0)$.interval=K.interval;if(K.bufferSize!==void 0)$.bufferSize=K.bufferSize;if(K.multiline!==void 0)$.multiline=K.multiline;if(K.rows!==void 0)$.rows=K.rows;if(K.view!==void 0)$.view=K.view;switch(K.type){case"number":if(K.min!==void 0)$.min=K.min;if(K.max!==void 0)$.max=K.max;if(K.step!==void 0)$.step=K.step;break;case"point":case"point2d":case"point3d":case"point4d":if(K.min!==void 0)$.min=K.min;if(K.max!==void 0)$.max=K.max;if(K.step!==void 0)$.step=K.step;let B=["x","y","z","w"];for(let j of B)if(K[j]&&typeof K[j]==="object")$[j]=K[j];break;case"select":case"selector":if(Array.isArray(K.options))$.options=K.options.map((j)=>{if(typeof j==="object"&&j!==null)return{text:j.label||j.text||String(j.value),value:j.value};return{text:String(j),value:j}});else $.options=Object.entries(K.options).map(([j,y])=>({text:j,value:y}));break;case"color":case"boolean":case"string":case"text":break;case"folder":case"group":console.warn("[HypertoolControls] Folder/Group encountered in addControlToTarget (should be handled earlier)");return;case"button":console.warn("[HypertoolControls] Button encountered in addControlToTarget (should be handled earlier)");return;case"tab":console.warn("[HypertoolControls] Tab encountered in addControlToTarget (should be handled earlier)");return;default:console.warn(`[HypertoolControls] Unknown control type: ${K.type}`);return}Z.addBinding(z,Y,$).on("change",(B)=>{z[Y]=B.value;let j={key:Y,value:B.value,event:B};this.options.onChange(this.values,j)})}addFileControl(Z,Y,K,z){let $=K.label||Y,F=K.accept||"*/*",B=K.placeholder||"Choose file...",j=K.preview!==!1,y=document.createElement("div");y.className="tp-lblv ht-file-control-row";let _=document.createElement("div");_.className="tp-lblv_l ht-file-control-label",_.textContent=$;let b=document.createElement("div");b.className="tp-lblv_v ht-file-control-value";let k=document.createElement("input");k.type="file",k.accept=F,k.style.display="none";let a=document.createElement("div");a.className="ht-file-control-buttons";let DJ=document.createElement("button");DJ.className="tp-btnv_b ht-file-control-button",DJ.textContent=z[Y]?"Change":"Upload",DJ.style.display=z[Y]?"none":"inline-flex";let _J=document.createElement("button");_J.className="tp-btnv_b ht-file-control-button ht-file-control-button--muted",_J.textContent="✕",_J.style.display="none";let yJ=document.createElement("div");yJ.className="ht-file-control-preview",yJ.style.display=z[Y]&&j?"block":"none";let CJ=document.createElement("div");CJ.className="ht-file-control-preview-bar";let g=document.createElement("span");g.className="ht-file-control-preview-name",g.textContent=z[Y]?"File":"No file selected";let KJ=document.createElement("div");KJ.className="ht-file-control-preview-actions";let c=document.createElement("button");c.type="button",c.className="ht-file-control-preview-action",c.title="Replace file",c.textContent="↻",c.onclick=(i)=>{i.preventDefault(),k.click()};let qJ=document.createElement("button");qJ.type="button",qJ.className="ht-file-control-preview-action",qJ.title="Remove file",qJ.textContent="✕",qJ.onclick=(i)=>{i.preventDefault(),_J.click()},KJ.appendChild(c),KJ.appendChild(qJ),CJ.appendChild(g),CJ.appendChild(KJ);let d=document.createElement("img");d.className="ht-file-control-preview-img";let UJ=document.createElement("div");UJ.className="ht-file-control-placeholder",UJ.style.display="none",k.onchange=async()=>{let i=k.files?.[0];if(!i)return;if(K.maxSize&&i.size>K.maxSize){console.warn(`[HypertoolControls] File size exceeds limit: ${i.size} > ${K.maxSize}`);return}DJ.textContent="Uploading...",DJ.disabled=!0;let $J=`file-upload-${Date.now()}-${Math.random().toString(36).slice(2)}`,LJ=new Promise((TJ)=>{let QJ=(AJ)=>{if(AJ.data?.type!=="UPLOAD_CONTROL_FILE_RESULT")return;if(AJ.data?.requestId!==$J)return;if(window.removeEventListener("message",QJ),AJ.data.error)console.error("[HypertoolControls] File upload failed:",AJ.data.error),TJ(null);else TJ({url:AJ.data.url,originalUrl:AJ.data.originalUrl||AJ.data.url})};window.addEventListener("message",QJ),setTimeout(()=>{window.removeEventListener("message",QJ),console.warn("[HypertoolControls] File upload timed out"),TJ(null)},30000)}),JJ=null;if(j&&i.type.startsWith("image/")){let TJ=new FileReader;TJ.onload=(QJ)=>{JJ=QJ.target?.result},TJ.readAsDataURL(i)}let YJ=new FileReader;YJ.onload=async(TJ)=>{let QJ=TJ.target?.result;window.parent.postMessage({type:"UPLOAD_CONTROL_FILE",source:"hypertool-iframe",requestId:$J,data:{fileName:i.name,fileType:i.type,fileSize:i.size,fileData:QJ,controlKey:Y}},"*",[QJ]);let AJ=await LJ;if(DJ.disabled=!1,AJ){if(z[Y]=AJ.url,DJ.textContent="Change",DJ.style.display="none",g.textContent=i.name||"File",j&&i.type.startsWith("image/")&&JJ)UJ.style.display="none",d.src=JJ,yJ.style.display="flex";let BQ={key:Y,value:AJ.originalUrl,event:{value:AJ.originalUrl,proxyUrl:AJ.url,file:i}};this.options.onChange(this.values,BQ)}else DJ.textContent=z[Y]?"Change":"Upload",console.error("[HypertoolControls] Failed to upload file to storage")},YJ.readAsArrayBuffer(i)},DJ.onclick=()=>{k.click()},_J.onclick=()=>{z[Y]=null,k.value="",DJ.textContent="Upload",DJ.style.display="inline-flex",_J.style.display="none",yJ.style.display="none",UJ.style.display="none",g.textContent="No file selected";let i={key:Y,value:null,event:{value:null}};this.options.onChange(this.values,i)},a.appendChild(DJ),a.appendChild(_J),yJ.appendChild(d),yJ.appendChild(CJ),b.appendChild(k),b.appendChild(a),b.appendChild(UJ),b.appendChild(yJ),y.appendChild(_),y.appendChild(b);let SJ=Z.element;(SJ.querySelector(".tp-rotv_c")||SJ).appendChild(y)}addFolder(Z){if(!this.pane)return null;return this.pane.addFolder({title:Z})}set(Z,Y){if(Z in this.params){if(this.params[Z]=Y,this.pane)this.pane.refresh()}}get values(){return{...this.params}}destroy(){if(this.pane)this.pane.dispose(),this.pane=null;let Z=document.getElementById("hypertool-theme");if(Z)Z.remove()}setVisible(Z){if(!this.pane)return;this.pane.element.style.display=Z?"block":"none"}refresh(){if(this.pane)this.pane.refresh()}}function K$(Z,Y){return new u9(Z,Y).params}function U$(Z,Y){return new u9(Z,Y)}var jM=zQ(G8(),1),PM=zQ(zM(),1);var q$=new Set(["STYLE","LINK"]);class z${source;target;observer=null;nodeMap=new WeakMap;active=!1;messageListener=null;usePostMessage=!1;cssNodesById=new Map;constructor(Z={}){let Y=null;if(Z.sourceDocument)Y=Z.sourceDocument;else if(typeof window<"u")try{Y=window.parent?.document??null}catch(K){console.debug("[hyper-frame] Using postMessage for CSS sync (cross-origin)"),this.usePostMessage=!0,Y=null}this.source=Y,this.target=Z.targetDocument??(typeof document<"u"?document:null),this.active=Boolean(Z.mirror??!0)}start(){if(!this.active)return;if(this.usePostMessage)this.startPostMessageMode();else if(this.source&&this.target)this.cleanupPreviousClones(),this.syncAll(),this.attachObserver();else console.warn("[hyper-frame] Unable to mirror CSS – missing source or target document.")}stop(){if(this.observer?.disconnect(),this.observer=null,this.nodeMap=new WeakMap,this.cleanupPreviousClones(),this.messageListener&&typeof window<"u")window.removeEventListener("message",this.messageListener),this.messageListener=null;this.cssNodesById.clear()}startPostMessageMode(){if(!this.target||typeof window>"u")return;this.cleanupPreviousClones(),this.messageListener=(Z)=>{if(!Z.data||Z.data.type!=="hyper-frame:css-sync")return;this.handleCssMessage(Z.data)},window.addEventListener("message",this.messageListener),console.debug("[hyper-frame] CSS postMessage receiver ready")}handleCssMessage(Z){if(!this.target)return;switch(Z.action){case"init":this.cleanupPreviousClones(),this.cssNodesById.clear();break;case"add":if(Z.id&&Z.tagName)this.addCssNode(Z.id,Z.tagName,Z.attributes,Z.textContent);break;case"remove":if(Z.id)this.removeCssNode(Z.id);break;case"update":if(Z.id)this.updateCssNode(Z.id,Z.attributes,Z.textContent);break}}addCssNode(Z,Y,K,z){if(!this.target)return;if(this.cssNodesById.has(Z))return;let $=document.createElement(Y);if($.setAttribute("data-hyper-frame-clone","true"),$.setAttribute("data-css-id",Z),K)for(let[F,B]of Object.entries(K))$.setAttribute(F,B);if(z)$.textContent=z;this.target.head.appendChild($),this.cssNodesById.set(Z,$)}removeCssNode(Z){let Y=this.cssNodesById.get(Z);if(Y&&Y.parentNode)Y.parentNode.removeChild(Y),this.cssNodesById.delete(Z)}updateCssNode(Z,Y,K){let z=this.cssNodesById.get(Z);if(!z)return;if(Y){for(let $ of Array.from(z.attributes))if(!$.name.startsWith("data-"))z.removeAttribute($.name);for(let[$,F]of Object.entries(Y))z.setAttribute($,F)}if(K!==void 0)z.textContent=K}cleanupPreviousClones(){if(!this.target)return;this.target.querySelectorAll('[data-hyper-frame-clone="true"]').forEach((Z)=>Z.parentNode?.removeChild(Z))}async syncAll(){if(!this.source||!this.target)return;let Z=this.source.head,Y=Array.from(Z.children).filter((K)=>q$.has(K.nodeName));for(let K of Y){let z=await this.cloneNode(K);if(!z)continue;this.target?.head.appendChild(z),this.nodeMap.set(K,z)}}attachObserver(){if(!this.source||!this.target)return;if(this.observer)return;this.observer=new MutationObserver((Z)=>{Z.forEach((Y)=>{switch(Y.type){case"childList":this.handleChildListMutation(Y);break;case"characterData":this.handleCharacterDataMutation(Y);break;case"attributes":this.handleAttributeMutation(Y);break}})}),this.observer.observe(this.source.head,{childList:!0,subtree:!0,characterData:!0,attributes:!0})}handleChildListMutation(Z){if(!this.target)return;Z.removedNodes.forEach((Y)=>{let K=this.nodeMap.get(Y);if(K&&K.parentNode)K.parentNode.removeChild(K),this.nodeMap.delete(Y)}),Z.addedNodes.forEach(async(Y)=>{if(!(Y instanceof HTMLElement))return;if(!q$.has(Y.nodeName))return;try{let K=await this.cloneNode(Y);if(!K)return;let z=Z.nextSibling?this.nodeMap.get(Z.nextSibling):null;if(z&&z.parentNode)z.parentNode.insertBefore(K,z);else this.target?.head.appendChild(K);this.nodeMap.set(Y,K)}catch(K){console.error("[CssBridge] Failed to clone node:",K)}})}handleCharacterDataMutation(Z){let K=Z.target.parentNode;if(!K)return;let z=this.nodeMap.get(K);if(!z)return;z.textContent=K.textContent}handleAttributeMutation(Z){let Y=Z.target,K=this.nodeMap.get(Y);if(!K||!(K instanceof Element))return;if(Z.attributeName){let z=Y.getAttribute(Z.attributeName);if(z===null)K.removeAttribute(Z.attributeName);else K.setAttribute(Z.attributeName,z)}}async cloneNode(Z){if(!(Z instanceof HTMLElement))return null;if(!q$.has(Z.nodeName))return null;if(Z.nodeName==="LINK"&&Z instanceof HTMLLinkElement){let K=Z.getAttribute("href"),z=Z.getAttribute("rel");if(K){if(z==="stylesheet")try{let F=await this.fetchCssContent(K),B=document.createElement("STYLE");return B.textContent=F,B.setAttribute("data-hyper-frame-clone","true"),B}catch(F){console.error(`[CssBridge] Failed to fetch CSS from ${K}:`,F)}let $=Z.cloneNode(!0);try{let F=this.source?new URL(this.source.location.href):new URL(window.location.href),B=new URL(K,F).href;$.setAttribute("href",B)}catch(F){console.error(`[CssBridge] Failed to convert URL to absolute: ${K}`,F)}return $.setAttribute("data-hyper-frame-clone","true"),$}}let Y=Z.cloneNode(!0);return Y.setAttribute("data-hyper-frame-clone","true"),Y}async fetchCssContent(Z){let Y=this.source?new URL(this.source.location.href):new URL(window.location.href),K=new URL(Z,Y).href,z=await fetch(K);if(!z.ok)throw Error(`HTTP ${z.status}: ${z.statusText}`);return await z.text()}}function $M(Z={}){let Y=Z.documentRef??document;if(!Y)throw Error("[hyper-frame] document is not available");let K=Z.containerClassName||"hyper-frame",z=Z.target;if(z instanceof HTMLElement)return z.classList.add(K),{element:z,createdInternally:!1};if(typeof z==="string"&&z.trim().length>0){let F=Y.querySelector(z);if(F)return F.classList.add(K),{element:F,createdInternally:!1};console.warn(`[hyper-frame] Could not find container for selector "${z}", creating one instead.`)}let $=Y.createElement("div");return $.classList.add(K),$.classList.add("hyper-frame-container"),Y.body.appendChild($),{element:$,createdInternally:!0}}var zG=zQ(G8(),1);var NQ=zQ(G8(),1),y7=zQ(gZ(),1),OM=({definitions:Z,options:Y,onChange:K,onReady:z})=>{let $=NQ.useRef(null),F=NQ.useRef(null),B=NQ.useRef(null),j=NQ.useRef(null),y=NQ.useRef(z),[_,b]=NQ.useState(!1),[k,a]=NQ.useState(!1),[DJ,_J]=NQ.useState(!1),yJ=NQ.useMemo(()=>{let d=[{type:"number",label:"Number",description:"Slider with min/max/step"},{type:"color",label:"Color",description:"Color picker"},{type:"boolean",label:"Toggle",description:"On/off switch"},{type:"string",label:"Text",description:"Single-line string"},{type:"text",label:"Textarea",description:"Multiline string"},{type:"select",label:"Select",description:"Dropdown options"},{type:"point2d",label:"Point 2D",description:"Vector {x,y}"},{type:"point3d",label:"Point 3D",description:"Vector {x,y,z}"},{type:"file",label:"File",description:"Upload image/audio/etc"}],UJ=Y?.controlTypes;if(!UJ||UJ.length===0)return d;return d.filter((SJ)=>UJ.includes(SJ.type))},[Y?.controlTypes]),CJ=NQ.useCallback(()=>b(!1),[]),g=NQ.useCallback(()=>{let d=$.current,UJ=F.current;if(!d||!UJ)return;let SJ=d.getBoundingClientRect(),zJ=window.innerHeight-SJ.top-12,i=UJ.scrollHeight;_J(i>zJ)},[]);NQ.useEffect(()=>{let d=(UJ)=>{if(!(UJ.target instanceof HTMLElement))return;if(!UJ.target.closest(".hyper-frame-controls-panel"))CJ()};if(_)document.addEventListener("click",d);return()=>{document.removeEventListener("click",d)}},[_,CJ]),NQ.useEffect(()=>{g()},[_,g,yJ.length]),NQ.useEffect(()=>{let d=()=>g();return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d)},[g]);let KJ=NQ.useCallback((d)=>{let UJ=Math.random().toString(36).slice(2,6);return`${d}-control-${UJ}`},[]),c=NQ.useCallback((d,UJ)=>{return[`Add a new ${d} control named "${UJ}" to the existing controls definitions.`,"Do NOT regenerate files; only patch the controls definitions object.",`Use sensible defaults for ${d} (e.g., 0/1 for numbers, "#00ff88" for colors).`,"Return a search-replace JSON patch that only touches the controls definitions section.","Keep all other code intact."].join(" ")},[]),qJ=NQ.useCallback((d)=>{let UJ=KJ(d),SJ=c(d,UJ),zJ={source:"hypertool-controls",type:"ADD_CONTROL_REQUEST",controlType:d,name:UJ,prompt:SJ,timestamp:Date.now()};if(Y?.onAddControlRequest);if(Y?.onAddControlRequest?.({type:d,name:UJ,prompt:SJ}),window.dispatchEvent(new CustomEvent("hypertool:add-control-request",{detail:zJ})),window.parent&&window.parent!==window)window.parent.postMessage(zJ,"*")},[c,KJ,Y]);return NQ.useEffect(()=>{y.current=z},[z]),NQ.useEffect(()=>{let d=(UJ)=>{let SJ=UJ;if(!SJ.detail||typeof SJ.detail.loading!=="boolean")return;a(Boolean(SJ.detail.loading))};return window.addEventListener("hypertool:add-control-status",d),()=>{window.removeEventListener("hypertool:add-control-status",d)}},[]),NQ.useEffect(()=>{if(!B.current)return;let d=()=>g(),UJ=()=>g(),SJ=null,zJ=window;if(!zJ.hypertoolControls){console.warn("[ControlsPanel] hypertoolControls not available on window");return}try{let i=zJ.hypertoolControls.createControlPanel(Z,{title:Y?.title,position:Y?.position,expanded:Y?.expanded,container:B.current,onChange:($J,LJ)=>{if(K)K({key:LJ.key,value:LJ.value,event:LJ.event})}});if(j.current=i,SJ=document.querySelector(".hyper-frame-controls-panel__add-btn"),SJ?.addEventListener("click",d),window.addEventListener("resize",UJ),g(),y.current)y.current(i)}catch(i){console.error("[ControlsPanel] Failed to create controls:",i)}return()=>{if(j.current){if(typeof j.current.dispose==="function")j.current.dispose();else if(typeof j.current.destroy==="function")j.current.destroy();j.current=null}SJ?.removeEventListener("click",d),window.removeEventListener("resize",UJ)}},[Z,Y,K]),y7.jsxDEV("div",{className:"hyper-frame-controls-panel",ref:$,children:y7.jsxDEV("div",{ref:F,className:DJ?"hyper-frame-controls-panel__scroll hyper-frame-controls-panel__scroll--overflow":"hyper-frame-controls-panel__scroll",children:[y7.jsxDEV("div",{ref:B,className:"hyper-frame-controls-panel__pane"},void 0,!1,void 0,this),Y?.showAddControlActions!==!1&&yJ.length>0&&y7.jsxDEV("div",{className:"hyper-frame-controls-panel__actions",children:[y7.jsxDEV("button",{type:"button",className:"hyper-frame-controls-panel__add-btn",onClick:()=>b((d)=>!d),"aria-expanded":_,"aria-haspopup":"true",disabled:k,children:[k?y7.jsxDEV("span",{className:"hyper-frame-controls-panel__spinner"},void 0,!1,void 0,this):"+",y7.jsxDEV("span",{children:k?"Adding…":"Add control"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),_&&y7.jsxDEV("div",{className:"hyper-frame-controls-panel__menu",role:"menu",children:yJ.map((d)=>y7.jsxDEV("button",{className:"hyper-frame-controls-panel__menu-item",onClick:()=>{a(!0),qJ(d.type),CJ()},role:"menuitem",children:[y7.jsxDEV("div",{className:"hyper-frame-controls-panel__menu-title",children:[d.label,": "]},void 0,!0,void 0,this),y7.jsxDEV("div",{className:"hyper-frame-controls-panel__menu-desc",children:d.description},void 0,!1,void 0,this)]},d.type,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)};var dZ=zQ(G8(),1);var wQ=zQ(G8(),1),DM=zQ(gZ(),1),LM=wQ.createContext(null),qG=()=>{let{innerWidth:Z,innerHeight:Y}=window;return{width:Math.max(100,Math.round(Z)),height:Math.max(100,Math.round(Y))}},WM=({children:Z})=>{let Y=wQ.useMemo(()=>{let $J=qG(),LJ=window.devicePixelRatio||1,JJ=Math.round($J.width*LJ),YJ=Math.round($J.height*LJ);return{canvasWidth:Math.max(100,Math.round(JJ*0.9)),canvasHeight:Math.max(100,Math.round(YJ*0.9)),maxWidth:JJ,maxHeight:YJ}},[]),[K,z]=wQ.useState(Y.canvasWidth),[$,F]=wQ.useState(Y.canvasHeight),[B,j]=wQ.useState(Y.maxWidth),[y,_]=wQ.useState(Y.maxHeight),[b,k]=wQ.useState(!1),[a,DJ]=wQ.useState(!1),[_J,yJ]=wQ.useState(null),[CJ,g]=wQ.useState(null),KJ=wQ.useMemo(()=>{let $J=window.devicePixelRatio||1,LJ=K/$J,JJ=$/$J;if(LJ===0||JJ===0)return 1;let YJ=B/$J,TJ=y/$J,QJ=YJ/LJ,AJ=TJ/JJ;return Math.min(QJ,AJ,1)},[K,$,B,y]);wQ.useEffect(()=>{let $J=()=>{let LJ=qG(),JJ=window.devicePixelRatio||1,YJ=Math.round(LJ.width*JJ),TJ=Math.round(LJ.height*JJ);if(j(YJ),_(TJ),b)z(YJ),F(TJ);else if(_J!==null){let QJ,AJ;if(YJ/TJ>_J)AJ=TJ,QJ=Math.round(AJ*_J);else QJ=YJ,AJ=Math.round(QJ/_J);z(QJ),F(AJ)}};return window.addEventListener("resize",$J),()=>window.removeEventListener("resize",$J)},[b,_J]);let c=wQ.useCallback(($J)=>{let LJ=Math.max(100,Math.round($J));z(LJ),k(!1),yJ(null)},[]),qJ=wQ.useCallback(($J)=>{let LJ=Math.max(100,Math.round($J));F(LJ),k(!1),yJ(null)},[]),d=wQ.useCallback(($J,LJ)=>{let JJ=Math.max(100,Math.round($J)),YJ=Math.max(100,Math.round(LJ));z(JJ),F(YJ),k(!1),yJ(null)},[]),UJ=wQ.useCallback(($J,LJ)=>{let JJ=qG(),YJ=window.devicePixelRatio||1,TJ=$J/LJ,QJ=Math.round(JJ.width*YJ),AJ=Math.round(JJ.height*YJ),BQ,vQ;if(QJ/AJ>TJ)vQ=AJ,BQ=Math.round(vQ*TJ);else BQ=QJ,vQ=Math.round(BQ/TJ);z(BQ),F(vQ),yJ(TJ),k(!1)},[]),SJ=wQ.useCallback(($J)=>{let{width:LJ,height:JJ}=$J;if(LJ>0&&JJ>0)console.log("[CanvasContext] Syncing with actual canvas:",{actual:{width:LJ,height:JJ},current:{width:K,height:$}}),z(LJ),F(JJ),k(!1),yJ(null)},[K,$]),zJ=wQ.useCallback(()=>{if(b&&CJ)z(CJ.width),F(CJ.height),k(!1),g(null);else{g({width:K,height:$});let $J=qG(),LJ=window.devicePixelRatio||1,JJ=Math.round($J.width*LJ),YJ=Math.round($J.height*LJ);z(JJ),F(YJ),yJ(null),k(!0)}},[b,CJ,K,$]),i={canvasWidth:K,canvasHeight:$,maxCanvasWidth:B,maxCanvasHeight:y,scale:KJ,isFittedToScreen:b,isRecording:a,setIsRecording:DJ,setCanvasWidth:c,setCanvasHeight:qJ,setCanvasSize:d,setAspectRatio:UJ,syncWithCanvas:SJ,fitToScreen:zJ};return DM.jsxDEV(LM.Provider,{value:i,children:Z},void 0,!1,void 0,this)},oX=()=>{let Z=wQ.useContext(LM);if(!Z)throw Error("useCanvas must be used within a CanvasProvider");return Z};var A7=zQ(gZ(),1),HM=({getContainer:Z,filename:Y="hyperframe-export",useCanvasCapture:K=!0})=>{let{setIsRecording:z}=oX(),[$,F]=dZ.useState(!1),[B,j]=dZ.useState(!1),[y,_]=dZ.useState(!1),b=dZ.useRef(null),k=dZ.useRef([]);dZ.useEffect(()=>{let g=()=>{let c=Z();if(c&&K){if(c.querySelector("canvas"))return F(!0),j(!0),!0}return!1};if(g())return;let KJ=setInterval(()=>{if(g())clearInterval(KJ)},100);return()=>clearInterval(KJ)},[Z,K]);let a=dZ.useCallback((g,KJ)=>{let c=URL.createObjectURL(g),qJ=document.createElement("a");qJ.href=c,qJ.download=KJ,qJ.rel="noopener",qJ.style.display="none",document.body.appendChild(qJ),qJ.click(),document.body.removeChild(qJ),URL.revokeObjectURL(c)},[]),DJ=dZ.useCallback(async()=>{try{let g=Z();if(!g)throw Error("Container not available.");let KJ=g.querySelector("canvas");if(!KJ||!(KJ instanceof HTMLCanvasElement))throw Error("No canvas element available for capture.");let c=await new Promise((qJ,d)=>{KJ.toBlob((UJ)=>{if(UJ)qJ(UJ);else d(Error("Canvas capture returned an empty blob."))})});if(c)a(c,`${Y}.png`),console.log("PNG captured")}catch(g){console.error("[ExportWidget] Failed to capture image:",g)}},[Z,Y,a]),_J=dZ.useCallback(()=>{if(!b.current){console.warn("[ExportWidget] No active recorder to stop");return}console.log("Stopping recording"),b.current.stop()},[]),yJ=dZ.useCallback(async()=>{try{let g=Z();if(!g)throw Error("Container not available.");let KJ=g.querySelector("canvas");if(!KJ||!(KJ instanceof HTMLCanvasElement))throw Error("No canvas element available for recording.");if(typeof KJ.captureStream!=="function")throw Error("Canvas captureStream API is not supported in this browser.");let c=KJ.captureStream(60),d=[{mimeType:"video/mp4;codecs=avc1",extension:"mp4"},{mimeType:"video/mp4;codecs=h264",extension:"mp4"},{mimeType:"video/mp4;codecs=avc1.42E01E",extension:"mp4"},{mimeType:"video/mp4",extension:"mp4"},{mimeType:"video/webm;codecs=h264",extension:"webm"},{mimeType:"video/webm;codecs=vp9",extension:"webm"},{mimeType:"video/webm;codecs=vp8",extension:"webm"},{mimeType:"video/webm",extension:"webm"}].find((i)=>MediaRecorder.isTypeSupported(i.mimeType));if(!d)d={mimeType:"",extension:"webm"};console.log("[ExportWidget] Using video format:",d.mimeType||"browser default");let UJ={videoBitsPerSecond:5000000};if(d.mimeType)UJ.mimeType=d.mimeType;let SJ=new MediaRecorder(c,UJ),zJ=[];k.current=zJ,SJ.addEventListener("dataavailable",(i)=>{if(i.data?.size)zJ.push(i.data)}),SJ.addEventListener("stop",()=>{let i=d.mimeType||SJ.mimeType||"video/webm",$J=new Blob(zJ,{type:i});console.log("[ExportWidget] Recording complete:",{size:$J.size,type:$J.type,chunks:zJ.length}),a($J,`${Y}.${d.extension}`),c.getTracks().forEach((LJ)=>LJ.stop()),_(!1),z(!1),b.current=null,k.current=[]}),SJ.start(),b.current=SJ,_(!0),z(!0),console.log("Recording started")}catch(g){console.error("[ExportWidget] Failed to start recording:",g),_(!1),z(!1),b.current=null}},[Z,Y,a,z]),CJ=dZ.useCallback(async()=>{if(y)_J();else await yJ()},[y,_J,yJ]);return A7.jsxDEV("div",{className:"export-widget-container absolute top-0 left-0 py-2 px-2 z-[9999]",children:A7.jsxDEV("div",{className:"flex items-center gap-2",children:[A7.jsxDEV("button",{type:"button",className:`inline-flex items-center gap-2 rounded-lg border border-border bg-background px-2 py-1 text-sm text-text transition hover:bg-muted/80 whitespace-nowrap ${!$?"opacity-60 cursor-not-allowed":""}`,onClick:DJ,disabled:!$,title:"Screenshot",children:[A7.jsxDEV("svg",{xmlns:"http://www.w3.org/2000/svg",width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[A7.jsxDEV("path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"},void 0,!1,void 0,this),A7.jsxDEV("circle",{cx:"12",cy:"13",r:"3"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A7.jsxDEV("span",{children:"Screenshot"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A7.jsxDEV("button",{type:"button",className:`inline-flex items-center gap-2 rounded-lg border transition hover:bg-muted/80 whitespace-nowrap px-2 py-1 text-sm ${y?"bg-red-500/20 text-red-400 border-red-500/30":"bg-background text-text border-border"} ${!B?"opacity-60 cursor-not-allowed":""}`,onClick:CJ,disabled:!B,title:y?"Stop Recording":"Record Video",children:[A7.jsxDEV("svg",{xmlns:"http://www.w3.org/2000/svg",width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[A7.jsxDEV("path",{d:"m22 8-6 4 6 4V8Z"},void 0,!1,void 0,this),A7.jsxDEV("rect",{x:"2",y:"6",width:"14",height:"12",rx:"2",ry:"2"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),A7.jsxDEV("span",{children:y?"Stop":"Rec"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)};var UX=zQ(G8(),1);var b7=zQ(G8(),1);var Q7=zQ(gZ(),1),MM=({canvasWidth:Z,canvasHeight:Y,scale:K,onResize:z})=>{let{isRecording:$}=oX(),[F,B]=b7.useState(!1),[j,y]=b7.useState(null),[_,b]=b7.useState({x:0,y:0}),[k,a]=b7.useState({width:0,height:0}),DJ=window.devicePixelRatio||1,_J=b7.useRef(K),yJ=1;b7.useEffect(()=>{_J.current=K},[K]);let CJ=b7.useCallback((KJ,c)=>{if($)return;c.preventDefault(),c.stopPropagation(),B(!0),y(KJ),b({x:c.clientX,y:c.clientY}),a({width:Z,height:Y})},[Z,Y,$]);b7.useEffect(()=>{if(!F||!j)return;let KJ=(d)=>{let UJ=d.clientX-_.x,SJ=d.clientY-_.y,zJ=_J.current||1,i=j.length===2,$J=j==="e"||j==="w",LJ=j==="n"||j==="s",JJ=k.width,YJ=k.height,TJ=j.includes("e")?UJ*DJ/zJ:j.includes("w")?-UJ*DJ/zJ:0,QJ=j.includes("s")?SJ*DJ/zJ:j.includes("n")?-SJ*DJ/zJ:0;if(JJ=k.width+TJ,YJ=k.height+QJ,d.shiftKey){let AJ=Math.max(1,k.width),BQ=Math.max(1,k.height),vQ=TJ/AJ,mZ=QJ/BQ,cQ=($Q,uQ)=>{if(!Number.isFinite($Q)||$Q<=0)return 1/uQ;return $Q};if($J&&!LJ){let $Q=cQ(1+vQ,AJ);JJ=AJ*$Q,YJ=BQ*$Q}else if(LJ&&!$J){let $Q=cQ(1+mZ,BQ);JJ=AJ*$Q,YJ=BQ*$Q}else if(i){let $Q=Math.abs(vQ)>=Math.abs(mZ),uQ=$Q?vQ:mZ,cZ=$Q?AJ:BQ,Z7=cQ(1+uQ,cZ);JJ=AJ*Z7,YJ=BQ*Z7}}JJ=Math.max(1,JJ),YJ=Math.max(1,YJ),z(JJ,YJ)},c=()=>{B(!1),y(null)},qJ=()=>{B(!1),y(null)};return document.addEventListener("mousemove",KJ),document.addEventListener("mouseup",c),document.addEventListener("mouseleave",qJ),()=>{document.removeEventListener("mousemove",KJ),document.removeEventListener("mouseup",c),document.removeEventListener("mouseleave",qJ)}},[F,j,_,k,DJ,z]);let g=({handle:KJ,className:c})=>Q7.jsxDEV("div",{className:`absolute ${c} group ${$?"cursor-not-allowed opacity-0":""}`,onMouseDown:(qJ)=>CJ(KJ,qJ),style:{zIndex:10},title:$?"Canvas resizing is locked during recording":void 0,children:Q7.jsxDEV("div",{className:`w-full h-full transition-opacity bg-accent/20 ${$?"opacity-0":"opacity-0 group-hover:opacity-100"}`},void 0,!1,void 0,this)},void 0,!1,void 0,this);return Q7.jsxDEV(Q7.Fragment,{children:[Q7.jsxDEV(g,{handle:"nw",className:"top-0 left-0 w-3 h-3 cursor-nw-resize"},void 0,!1,void 0,this),Q7.jsxDEV(g,{handle:"ne",className:"top-0 right-0 w-3 h-3 cursor-ne-resize"},void 0,!1,void 0,this),Q7.jsxDEV(g,{handle:"sw",className:"bottom-0 left-0 w-3 h-3 cursor-sw-resize"},void 0,!1,void 0,this),Q7.jsxDEV(g,{handle:"se",className:"bottom-0 right-0 w-3 h-3 cursor-se-resize"},void 0,!1,void 0,this),Q7.jsxDEV(g,{handle:"n",className:"top-0 left-3 right-3 h-1 cursor-n-resize"},void 0,!1,void 0,this),Q7.jsxDEV(g,{handle:"s",className:"bottom-0 left-3 right-3 h-1 cursor-s-resize"},void 0,!1,void 0,this),Q7.jsxDEV(g,{handle:"w",className:"left-0 top-3 bottom-3 w-1 cursor-w-resize"},void 0,!1,void 0,this),Q7.jsxDEV(g,{handle:"e",className:"right-0 top-3 bottom-3 w-1 cursor-e-resize"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};var F4=zQ(gZ(),1),FM=({onReady:Z})=>{let Y=UX.useRef(null),K=UX.useRef(null),{canvasWidth:z,canvasHeight:$,scale:F,setCanvasSize:B,syncWithCanvas:j}=oX(),[y,_]=UX.useState(!1),b=window.devicePixelRatio||1,k=Math.max(1,Math.round(z/b)),a=Math.max(1,Math.round($/b)),DJ=Math.max(1,Math.round(k*F)),_J=Math.max(1,Math.round(a*F));return UX.useEffect(()=>{if(Y.current)Z(Y.current)},[Z]),UX.useEffect(()=>{if(!Y.current||y)return;let yJ=()=>{let KJ=Y.current?.querySelector("canvas");if(KJ&&KJ instanceof HTMLCanvasElement){let{width:c,height:qJ}=KJ;if(c>100&&qJ>100){let d=Math.abs(c-z),UJ=Math.abs(qJ-$);if(d>z*0.1||UJ>$*0.1)console.log("[SandboxContainer] Canvas detected, syncing dimensions"),j(KJ),_(!0)}}};yJ();let CJ=setInterval(yJ,100),g=setTimeout(()=>{clearInterval(CJ),_(!0)},3000);return()=>{clearInterval(CJ),clearTimeout(g)}},[Y,z,$,y,j]),UX.useEffect(()=>{let yJ=new Event("resize");window.dispatchEvent(yJ),console.log("[SandboxContainer] Dispatched resize event:",{canvas:{width:z,height:$},container:{width:k,height:a},display:{width:DJ,height:_J},scale:F})},[z,$,k,a,DJ,_J,F]),F4.jsxDEV("div",{className:"hyper-frame-sandbox-wrapper absolute inset-0 flex items-center justify-center pointer-events-none",children:F4.jsxDEV("div",{ref:K,className:"hyper-frame-sandbox-display-container relative pointer-events-auto",style:{width:`${DJ}px`,height:`${_J}px`,boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)"},children:[F4.jsxDEV(MM,{canvasWidth:z,canvasHeight:$,scale:F,onResize:B},void 0,!1,void 0,this),F4.jsxDEV("div",{ref:Y,className:"hyper-frame-sandbox-container absolute top-0 left-0 flex items-center justify-center",style:{width:`${k}px`,height:`${a}px`,overflow:"hidden",transform:`scale(${F})`,transformOrigin:"top left"}},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)};var G6=zQ(G8(),1);var FQ=zQ(gZ(),1),BM=[{label:"16:9 Landscape",width:1920,height:1080},{label:"9:16 Portrait",width:1080,height:1920},{label:"4:3 Standard",width:1024,height:768},{label:"1:1 Square",width:1080,height:1080},{label:"21:9 Ultrawide",width:2560,height:1080},{label:"3:2 Classic",width:1440,height:960},{label:"---",width:0,height:0},{label:"iPhone 15 Pro",width:1179,height:2556},{label:"iPhone 15 Pro Max",width:1290,height:2796},{label:"iPhone SE",width:750,height:1334},{label:"iPhone 15",width:1170,height:2532},{label:"---",width:0,height:0},{label:'MacBook Air 13"',width:2560,height:1664},{label:'MacBook Pro 14"',width:3024,height:1964},{label:'MacBook Pro 16"',width:3456,height:2234},{label:'iMac 24"',width:4480,height:2520},{label:"Studio Display",width:5120,height:2880}],AM=()=>{let{canvasWidth:Z,canvasHeight:Y,scale:K,isRecording:z,setCanvasWidth:$,setCanvasHeight:F,setAspectRatio:B,fitToScreen:j}=oX(),[y,_]=G6.useState(Z.toString()),[b,k]=G6.useState(Y.toString());G6.useEffect(()=>{_(Z.toString())},[Z]),G6.useEffect(()=>{k(Y.toString())},[Y]);let a=()=>{if(z)return;let zJ=Math.round(parseFloat(y));if(!isNaN(zJ)&&zJ>=100)$(zJ),_(zJ.toString());else _(Z.toString())},DJ=()=>{if(z)return;let zJ=Math.round(parseFloat(b));if(!isNaN(zJ)&&zJ>=100)F(zJ),k(zJ.toString());else k(Y.toString())},_J=(zJ)=>{if(zJ.key==="Enter")a(),zJ.currentTarget.blur()},yJ=(zJ)=>{if(zJ.key==="Enter")DJ(),zJ.currentTarget.blur()},CJ=(zJ)=>{if(z)return;let i=BM.find(($J)=>$J.label===zJ.target.value);if(i&&i.width>0&&i.height>0)B(i.width,i.height)},g=window.devicePixelRatio||1,KJ=Math.round(Z/g*K),c=Math.round(Y/g*K),qJ=`${Z}×${Y}`,d=`${KJ}×${c}`,UJ=K<1,SJ=Math.round(K*100);return FQ.jsxDEV("div",{className:"canvas-size-widget-container absolute top-0 center px-2 py-2 z-[9999] flex items-center gap-2",children:[FQ.jsxDEV("select",{onChange:CJ,className:`rounded border border-border w-[90px] bg-background px-2 py-1 text-sm text-text focus:border-accent focus:outline-none ${z?"opacity-50 cursor-not-allowed":"cursor-pointer"}`,defaultValue:"",disabled:z,title:z?"Canvas resizing is locked during recording":"Choose a preset size",children:[FQ.jsxDEV("option",{value:"",disabled:!0,children:"Presets"},void 0,!1,void 0,this),BM.map((zJ,i)=>zJ.label==="---"?FQ.jsxDEV("option",{disabled:!0,children:"────────"},i,!1,void 0,this):FQ.jsxDEV("option",{value:zJ.label,children:zJ.label},i,!1,void 0,this))]},void 0,!0,void 0,this),FQ.jsxDEV("div",{className:"flex items-center gap-1",children:[FQ.jsxDEV("label",{className:"text-sm text-accent",children:"W:"},void 0,!1,void 0,this),FQ.jsxDEV("input",{value:y,onChange:(zJ)=>_(zJ.target.value),onBlur:a,onKeyDown:_J,className:`rounded border border-border bg-background px-2 py-1 text-sm text-text focus:border-accent focus:outline-none ${z?"opacity-50 cursor-not-allowed":""}`,style:{width:`${Math.max(y.length*8+16,55)}px`},min:"60",step:"1",disabled:z,title:z?"Canvas resizing is locked during recording":"Canvas width"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),FQ.jsxDEV("div",{className:"flex items-center gap-1",children:[FQ.jsxDEV("label",{className:"text-sm text-accent",children:"H:"},void 0,!1,void 0,this),FQ.jsxDEV("input",{value:b,onChange:(zJ)=>k(zJ.target.value),onBlur:DJ,onKeyDown:yJ,className:`rounded border border-border bg-background px-2 py-1 text-sm text-text focus:border-accent focus:outline-none ${z?"opacity-50 cursor-not-allowed":""}`,style:{width:`${Math.max(b.length*8+16,55)}px`},min:"60",step:"1",disabled:z,title:z?"Canvas resizing is locked during recording":"Canvas height"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),FQ.jsxDEV("div",{className:"flex items-center gap-1.5 px-2 py-1 rounded border border-border bg-background/50",title:UJ?`Canvas: ${qJ} → Display: ${d} (scaled to ${SJ}%)`:`Canvas: ${qJ} = Display: ${d} (no scaling)`,style:{display:UJ?"flex":"none"},children:[FQ.jsxDEV("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:UJ?"text-accent":"text-muted",children:[FQ.jsxDEV("circle",{cx:"11",cy:"11",r:"8"},void 0,!1,void 0,this),FQ.jsxDEV("path",{d:"m21 21-4.3-4.3"},void 0,!1,void 0,this),FQ.jsxDEV("line",{x1:"11",y1:"8",x2:"11",y2:"14"},void 0,!1,void 0,this),FQ.jsxDEV("line",{x1:"8",y1:"11",x2:"14",y2:"11"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),FQ.jsxDEV("div",{className:"flex items-center gap-1",children:FQ.jsxDEV("span",{className:`text-xs ${UJ?"text-accent":"text-muted"}`,children:[SJ,"%"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),FQ.jsxDEV("button",{type:"button",className:`inline-flex items-center gap-1 h-[30px] rounded-lg border border-border bg-background px-3 py-2 text-sm text-text transition whitespace-nowrap ${z?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`,onClick:j,disabled:z,title:z?"Canvas resizing is locked during recording":"Fit to screen",children:FQ.jsxDEV("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[FQ.jsxDEV("path",{d:"M8 3H5a2 2 0 0 0-2 2v3"},void 0,!1,void 0,this),FQ.jsxDEV("path",{d:"M21 8V5a2 2 0 0 0-2-2h-3"},void 0,!1,void 0,this),FQ.jsxDEV("path",{d:"M3 16v3a2 2 0 0 0 2 2h3"},void 0,!1,void 0,this),FQ.jsxDEV("path",{d:"M16 21h3a2 2 0 0 0 2-2v-3"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};var d9=zQ(gZ(),1),IM=({onContainerReady:Z,controls:Y,exportWidget:K})=>{let[z,$]=zG.useState(null),F=zG.useCallback((B)=>{$(B),Z(B)},[Z]);return d9.jsxDEV(WM,{children:d9.jsxDEV("div",{className:"hyper-container flex flex-col items-center justify-center",children:[K&&K.enabled&&d9.jsxDEV(HM,{getContainer:()=>z,filename:K.filename,useCanvasCapture:K.useCanvasCapture},void 0,!1,void 0,this),d9.jsxDEV(AM,{},void 0,!1,void 0,this),d9.jsxDEV(FM,{onReady:F},void 0,!1,void 0,this),Y&&d9.jsxDEV(OM,{definitions:Y.definitions,options:Y.options,onChange:Y.onChange,onReady:Y.onReady},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)};class $G{cssBridge=null;config;currentExperience=null;constructor(Z={}){this.config=Z,this.setupMessageHandlers()}setupMessageHandlers(){if(typeof window>"u")return;window.addEventListener("message",(Z)=>{let{type:Y,data:K}=Z.data||{};switch(Y){case"CAPTURE_SCREENSHOT":this.handleCaptureScreenshot(Z.data?.requestId);break;case"HYPERTOOL_SET_PARAMS":this.handleSetParams(K?.params);break;case"HYPERTOOL_GET_PARAMS":this.handleGetParams();break}})}handleCaptureScreenshot(Z){let Y=null;if(this.currentExperience)Y=this.currentExperience.mount.querySelector("canvas");if(!Y){let K=document.querySelectorAll("canvas");if(K.length>0){let z=K[0],$=z.width*z.height;K.forEach((F)=>{let B=F,j=B.width*B.height;if(j>$)z=B,$=j}),Y=z}}if(!Y){this.sendToParent("SCREENSHOT_RESULT",{requestId:Z,noCanvas:!0,error:"No canvas found"});return}try{let K=this.createOptimizedThumbnail(Y,400,0.8);this.sendToParent("SCREENSHOT_RESULT",{requestId:Z,dataUrl:K})}catch(K){this.sendToParent("SCREENSHOT_RESULT",{requestId:Z,error:K instanceof Error?K.message:"Unknown error"})}}handleSetParams(Z){if(!Z||!this.currentExperience)return;this.currentExperience.setParams(Z)}handleGetParams(){let Z=this.currentExperience?.getParams()??{};this.sendToParent("HYPERTOOL_PARAMS_RESPONSE",{params:Z})}sendToParent(Z,Y){window.parent.postMessage({type:Z,...Y},"*")}notifyParamChange(Z){let Y={};for(let[K,z]of Object.entries(Z))if(z===null||typeof z==="string"||typeof z==="number"||typeof z==="boolean")Y[K]=z;else if(typeof z==="object")try{Y[K]=JSON.parse(JSON.stringify(z))}catch{}window.parent.postMessage({type:"HYPERTOOL_PARAMS_CHANGED",source:"hypertool-iframe",data:{params:Y}},"*")}createOptimizedThumbnail(Z,Y,K){let{width:z,height:$}=Z,F=z,B=$;if(z>Y){let _=Y/z;F=Y,B=Math.round($*_)}let j=document.createElement("canvas");j.width=F,j.height=B;let y=j.getContext("2d");if(!y)return Z.toDataURL("image/jpeg",K);return y.imageSmoothingEnabled=!0,y.imageSmoothingQuality="high",y.drawImage(Z,0,0,F,B),j.toDataURL("image/jpeg",K)}mirrorCss(){if(this.cssBridge)return;this.cssBridge=new z$({mirror:this.config.mirrorCss!==!1}),this.cssBridge.start()}async createSandbox(Z){if(this.config.mirrorCss!==!1&&Z.mirrorCss!==!1)this.mirrorCss();let Y=await this.createReactMount(Z),K=new u5({mount:Y.sandboxContainer,paramDefs:Z.controls?.definitions,autoplay:!0,setup:($)=>this.wrapUserSetup(Z.setup,$,Z)});if(this.currentExperience=K,K.on("paramChange",()=>{this.notifyParamChange(K.getParams())}),Z.controls?.definitions)this.wireControlsToExperience(K,Y);if(typeof globalThis.__hypertool_registerParams==="function")globalThis.__hypertool_registerParams(K.params);return this.notifyParamChange(K.getParams()),{container:Y.sandboxContainer,controls:null,params:K.params,destroy:()=>{K.destroy(),Y.destroy()}}}wrapUserSetup(Z,Y,K){let z={mount:Y.mount,params:Y.params,controls:null,exports:{registerImageCapture:()=>{},registerVideoCapture:()=>{},setFilename:Y.exports.setFilename,setVisible:()=>{},useDefaultCanvasCapture:()=>{},destroy:()=>{}},runtime:this,environment:{window:Y.environment.window,document:Y.environment.document,addCleanup:Y.environment.addCleanup,onResize:($,F)=>{Y.environment.window.addEventListener("resize",$,F);let B=()=>Y.environment.window.removeEventListener("resize",$,F);return Y.environment.addCleanup(B),B}}};return Z(z)}wireControlsToExperience(Z,Y){}async createReactMount(Z){let Y=Z.mount,K=$M({target:Y?.target,containerClassName:Y?.containerClassName}),z=PM.createRoot(K.element),$=Z.controls?.definitions?{definitions:Z.controls.definitions,options:Z.controls.options,onChange:(j)=>{if(this.currentExperience&&j?.key!==void 0)this.currentExperience.setParam(j.key,j.value);Z.controls?.onChange?.(j,{})},onReady:(j)=>{if(this.currentExperience){let y=j.params;this.currentExperience.setParams(y)}if(typeof globalThis.__hypertool_registerControls==="function")globalThis.__hypertool_registerControls(j)}}:null,B=await new Promise((j)=>{z.render(jM.default.createElement(IM,{onContainerReady:j,controls:$,exportWidget:{enabled:Z.exportWidget?.enabled!==!1,filename:Z.exportWidget?.filename,position:Z.exportWidget?.position,useCanvasCapture:Z.exportWidget?.useCanvasCapture!==!1}}))});if(typeof Y?.onReady==="function")Y.onReady({container:B});return{sandboxContainer:B,destroy:()=>{if(z.unmount(),K.createdInternally)K.element.remove()}}}}var Q_={mirrorCss:!0},OG=new $G(Q_);function Z_(Z){return new $G(Z)}function NM(Z){return OG.createSandbox(Z)}function wM(){OG.mirrorCss()}if(typeof window<"u"){window.hypertoolControls={createControls:K$,createControlPanel:U$,HypertoolControls:u9,injectThemeVariables:H4,studioTheme:D4};let Z=window.hyperFrame||{};window.hyperFrame={...Z,version:"universal",runtime:OG,createSandbox:NM,mirrorCss:wM},G_()}var B4=null,LG=null;function X_(Z){B4=Z}function Y_(Z){LG=Z}if(typeof globalThis<"u")globalThis.__hypertool_registerParams=X_,globalThis.__hypertool_registerControls=Y_;function G_(){if(typeof window>"u")return;let Z={isRecording:!1,recorder:null,recordedChunks:[]};window.addEventListener("message",(B)=>{if(B.data?.source!=="hypertool-main")return;let{type:j}=B.data;switch(j){case"HYPERTOOL_CAPTURE_PNG":z();break;case"HYPERTOOL_START_RECORDING":$();break;case"HYPERTOOL_STOP_RECORDING":F();break;case"HYPERTOOL_GET_PARAMS":Y();break;case"HYPERTOOL_SET_PARAMS":K(B.data.data?.params);break}});function Y(){window.parent.postMessage({type:"HYPERTOOL_PARAMS_RESPONSE",data:{params:B4?{...B4}:{}}},"*")}function K(B){if(!B||typeof B!=="object"){console.warn("[Runtime] Invalid params received in SET_PARAMS");return}if(console.log("[Runtime] Received SET_PARAMS from parent:",Object.keys(B).length,"values"),B4){for(let[j,y]of Object.entries(B))if(y!==void 0)B4[j]=y}if(LG){for(let[j,y]of Object.entries(B))if(y!==void 0)try{LG.set(j,y)}catch(_){}LG.refresh(),console.log("[Runtime] Controls updated with saved values")}}function z(){let B=document.querySelector("canvas");if(B)B.toBlob((j)=>{if(j)window.parent.postMessage({type:"HYPERTOOL_CAPTURE_RESPONSE",data:{blob:j,filename:"hypertool-capture.png"}},"*")},"image/png");else console.warn("No canvas found for capture")}function $(){console.log("Starting recording...");let B=document.querySelector("canvas");if(B&&typeof B.captureStream==="function"){let j=B.captureStream(60),y=new MediaRecorder(j,{mimeType:"video/webm;codecs=vp9"});Z.recordedChunks=[],y.ondataavailable=(_)=>{if(_.data.size>0)Z.recordedChunks.push(_.data),console.log("Recording data available:",_.data.size,"bytes")},y.onstop=()=>{console.log("Recording stopped, processing...");let _=new Blob(Z.recordedChunks,{type:"video/webm"});console.log("Recording blob size:",_.size,"bytes"),window.parent.postMessage({type:"HYPERTOOL_RECORDING_RESPONSE",data:{blob:_,filename:"hypertool-recording.webm"}},"*"),Z.isRecording=!1,Z.recorder=null},y.start(),Z.recorder=y,Z.isRecording=!0,console.log("Recording started successfully")}else console.warn("Canvas not found or captureStream not supported")}function F(){if(console.log("Stopping recording..."),Z.recorder)Z.recorder.stop(),window.parent.postMessage({type:"HYPERTOOL_RECORDING_STOPPED",data:{}},"*"),console.log("Stop recording message sent");else console.warn("No active recorder to stop")}}export{D4 as studioTheme,OG as runtime,X_ as registerSandboxParams,Y_ as registerControlsInstance,wM as mirrorCss,H4 as injectThemeVariables,NM as createSandbox,K$ as createControls,U$ as createControlPanel,Z_ as configureRuntime,f5 as ParamStore,v5 as ObjectRegistry,u9 as HypertoolControls,u5 as Experience,b5 as EventEmitter};
188
198
 
189
- //# debugId=5F6BB9F4EF18B02864756E2164756E21
199
+
200
+ /* @hypertools/sdk - MIT License - https://hypertools.dev */
201
+
202
+ //# debugId=A9F726608F6E0D0B64756E2164756E21