@plasmicapp/host 0.0.48 → 1.0.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.
@@ -62,6 +62,19 @@ function registerComponent(component, meta) {
62
62
  });
63
63
  }
64
64
 
65
+ var root$2 = globalThis;
66
+
67
+ if (root$2.__PlasmicContextRegistry == null) {
68
+ root$2.__PlasmicContextRegistry = [];
69
+ }
70
+
71
+ function registerContext(component, meta) {
72
+ root$2.__PlasmicContextRegistry.push({
73
+ component: component,
74
+ meta: meta
75
+ });
76
+ }
77
+
65
78
  var _root$__Sub$setRepeat, _root$__Sub;
66
79
  /**
67
80
  * Allows a component from Plasmic Studio to be repeated.
@@ -96,8 +109,8 @@ var repeatedElementFn = function repeatedElementFn(isPrimary, elt) {
96
109
  return elt;
97
110
  };
98
111
 
99
- var root$2 = globalThis;
100
- var setRepeatedElementFn = (_root$__Sub$setRepeat = root$2 == null ? void 0 : (_root$__Sub = root$2.__Sub) == null ? void 0 : _root$__Sub.setRepeatedElementFn) != null ? _root$__Sub$setRepeat : function (fn) {
112
+ var root$3 = globalThis;
113
+ var setRepeatedElementFn = (_root$__Sub$setRepeat = root$3 == null ? void 0 : (_root$__Sub = root$3.__Sub) == null ? void 0 : _root$__Sub.setRepeatedElementFn) != null ? _root$__Sub$setRepeat : function (fn) {
101
114
  repeatedElementFn = fn;
102
115
  };
103
116
 
@@ -113,10 +126,10 @@ function useForceUpdate() {
113
126
  return update;
114
127
  }
115
128
 
116
- var root$3 = globalThis;
129
+ var root$4 = globalThis;
117
130
 
118
- if (root$3.__PlasmicHostVersion == null) {
119
- root$3.__PlasmicHostVersion = "2";
131
+ if (root$4.__PlasmicHostVersion == null) {
132
+ root$4.__PlasmicHostVersion = "2";
120
133
  }
121
134
 
122
135
  var rootChangeListeners = [];
@@ -254,11 +267,11 @@ var PlasmicCanvasHost = function PlasmicCanvasHost(props) {
254
267
  return React.createElement(React.Fragment, null, !enableWebpackHmr && React.createElement(DisableWebpackHmr, null), node);
255
268
  };
256
269
 
257
- if (root$3.__Sub == null) {
270
+ if (root$4.__Sub == null) {
258
271
  // Creating a side effect here by logging, so that vite won't
259
272
  // ignore this block for whatever reason
260
273
  console.log("Plasmic: Setting up app host dependencies");
261
- root$3.__Sub = {
274
+ root$4.__Sub = {
262
275
  React: React,
263
276
  ReactDOM: ReactDOM,
264
277
  setPlasmicRootNode: setPlasmicRootNode,
@@ -331,6 +344,7 @@ function DisableWebpackHmr() {
331
344
  exports.PlasmicCanvasContext = PlasmicCanvasContext;
332
345
  exports.PlasmicCanvasHost = PlasmicCanvasHost;
333
346
  exports.registerComponent = registerComponent;
347
+ exports.registerContext = registerContext;
334
348
  exports.repeatedElement = repeatedElement;
335
349
  exports.unstable_registerFetcher = registerFetcher;
336
350
  //# sourceMappingURL=host.cjs.development.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.cjs.development.js","sources":["../src/data.ts","../src/lang-utils.ts","../src/registerComponent.ts","../src/repeatedElement.ts","../src/useForceUpdate.ts","../src/index.tsx"],"sourcesContent":["import { PrimitiveType } from \"./index\";\nconst root = globalThis as any;\n\nexport type Fetcher = (...args: any[]) => Promise<any>;\n\nexport interface FetcherMeta {\n /**\n * Any unique identifying string for this fetcher.\n */\n name: string;\n /**\n * The Studio-user-friendly display name.\n */\n displayName?: string;\n /**\n * The symbol to import from the importPath.\n */\n importName?: string;\n args: { name: string; type: PrimitiveType }[];\n returns: PrimitiveType;\n /**\n * Either the path to the fetcher relative to `rootDir` or the npm\n * package name\n */\n importPath: string;\n /**\n * Whether it's a default export or named export\n */\n isDefaultExport?: boolean;\n}\n\nexport interface FetcherRegistration {\n fetcher: Fetcher;\n meta: FetcherMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicFetcherRegistry: FetcherRegistration[];\n }\n}\n\nroot.__PlasmicFetcherRegistry = [];\n\nexport function registerFetcher(fetcher: Fetcher, meta: FetcherMeta) {\n root.__PlasmicFetcherRegistry.push({ fetcher, meta });\n}\n","function isString(x: any): x is string {\n return typeof x === \"string\";\n}\n\ntype StringGen = string | (() => string);\n\nexport function ensure<T>(x: T | null | undefined, msg: StringGen = \"\"): T {\n if (x === null || x === undefined) {\n debugger;\n msg = (isString(msg) ? msg : msg()) || \"\";\n throw new Error(\n `Value must not be undefined or null${msg ? `- ${msg}` : \"\"}`\n );\n } else {\n return x;\n }\n}\n","import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\ntype StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\ntype BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\ntype NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\ntype JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\ntype ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\ntype SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n","import { cloneElement, isValidElement } from \"react\";\n\n/**\n * Allows a component from Plasmic Studio to be repeated.\n * `isPrimary` should be true for at most one instance of the component, and\n * indicates which copy of the element will be highlighted when the element is\n * selected in Studio.\n * If `isPrimary` is `false`, and `elt` is a React element (or an array of such),\n * it'll be cloned (using React.cloneElement) and ajusted if it's a component\n * from Plasmic Studio. Otherwise, if `elt` is not a React element, the original\n * value is returned.\n */\nexport default function repeatedElement<T>(isPrimary: boolean, elt: T): T {\n return repeatedElementFn(isPrimary, elt);\n}\n\nlet repeatedElementFn = <T>(isPrimary: boolean, elt: T): T => {\n if (isPrimary) {\n return elt;\n }\n if (Array.isArray(elt)) {\n return (elt.map((v) => repeatedElement(isPrimary, v)) as any) as T;\n }\n if (elt && isValidElement(elt) && typeof elt !== \"string\") {\n return (cloneElement(elt) as any) as T;\n }\n return elt;\n};\n\nconst root = globalThis as any;\nexport const setRepeatedElementFn: (fn: typeof repeatedElement) => void =\n root?.__Sub?.setRepeatedElementFn ??\n function (fn: typeof repeatedElement) {\n repeatedElementFn = fn;\n };\n","import { useCallback, useState } from \"react\";\n\nexport default function useForceUpdate() {\n const [, setTick] = useState(0);\n const update = useCallback(() => {\n setTick((tick) => tick + 1);\n }, []);\n return update;\n}\n","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerFetcher as unstable_registerFetcher } from \"./data\";\nimport { PlasmicElement } from \"./element-types\";\nimport { ensure } from \"./lang-utils\";\nimport registerComponent, {\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n} from \"./registerComponent\";\nimport repeatedElement, { setRepeatedElementFn } from \"./repeatedElement\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\n\nexport { unstable_registerFetcher };\nexport { repeatedElement };\nexport {\n registerComponent,\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n};\nexport { PlasmicElement };\n\ndeclare global {\n interface Window {\n __PlasmicHostVersion: string;\n }\n}\n\nif (root.__PlasmicHostVersion == null) {\n root.__PlasmicHostVersion = \"2\";\n}\n\nconst rootChangeListeners: (() => void)[] = [];\nclass PlasmicRootNodeWrapper {\n constructor(private value: null | React.ReactElement) {}\n set = (val: null | React.ReactElement) => {\n this.value = val;\n rootChangeListeners.forEach((f) => f());\n };\n get = () => this.value;\n}\n\nconst plasmicRootNode = new PlasmicRootNodeWrapper(null);\n\nfunction getPlasmicOrigin() {\n const params = new URL(`https://fakeurl/${location.hash.replace(/#/, \"?\")}`)\n .searchParams;\n return ensure(\n params.get(\"origin\"),\n \"Missing information from Plasmic window.\"\n );\n}\n\nfunction renderStudioIntoIframe() {\n const script = document.createElement(\"script\");\n const plasmicOrigin = getPlasmicOrigin();\n script.src = plasmicOrigin + \"/static/js/studio.js\";\n document.body.appendChild(script);\n}\n\nlet renderCount = 0;\nfunction setPlasmicRootNode(node: React.ReactElement | null) {\n // Keep track of renderCount, which we use as key to ErrorBoundary, so\n // we can reset the error on each render\n renderCount++;\n plasmicRootNode.set(node);\n}\n\n/**\n * React context to detect whether the component is rendered on Plasmic editor.\n */\nexport const PlasmicCanvasContext = React.createContext<boolean>(false);\n\nfunction _PlasmicCanvasHost() {\n // If window.parent is null, then this is a window whose containing iframe\n // has been detached from the DOM (for the top window, window.parent === window).\n // In that case, we shouldn't do anything. If window.parent is null, by the way,\n // location.hash will also be null.\n const isFrameAttached = !!window.parent;\n const isCanvas = !!location.hash?.match(/\\bcanvas=true\\b/);\n const isLive = !!location.hash?.match(/\\blive=true\\b/) || !isFrameAttached;\n const shouldRenderStudio =\n isFrameAttached &&\n !document.querySelector(\"#plasmic-studio-tag\") &&\n !isCanvas &&\n !isLive;\n const forceUpdate = useForceUpdate();\n React.useLayoutEffect(() => {\n rootChangeListeners.push(forceUpdate);\n return () => {\n const index = rootChangeListeners.indexOf(forceUpdate);\n if (index >= 0) {\n rootChangeListeners.splice(index, 1);\n }\n };\n }, [forceUpdate]);\n React.useEffect(() => {\n if (shouldRenderStudio && isFrameAttached && window.parent !== window) {\n renderStudioIntoIframe();\n }\n }, [shouldRenderStudio, isFrameAttached]);\n React.useEffect(() => {\n if (!shouldRenderStudio && !document.querySelector(\"#getlibs\") && isLive) {\n const scriptElt = document.createElement(\"script\");\n scriptElt.id = \"getlibs\";\n scriptElt.src = getPlasmicOrigin() + \"/static/js/getlibs.js\";\n scriptElt.async = false;\n scriptElt.onload = () => {\n (window as any).__GetlibsReadyResolver?.();\n };\n document.head.append(scriptElt);\n }\n }, [shouldRenderStudio]);\n if (!isFrameAttached) {\n return null;\n }\n if (isCanvas || isLive) {\n let appDiv = document.querySelector(\"#plasmic-app.__wab_user-body\");\n if (!appDiv) {\n appDiv = document.createElement(\"div\");\n appDiv.id = \"plasmic-app\";\n appDiv.classList.add(\"__wab_user-body\");\n document.body.appendChild(appDiv);\n }\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={isCanvas}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <p>\n Your app is ready to host Plasmic Studio! <br /> <br />\n On the <a href=\"https://studio.plasmic.app/\">Dashboard</a>, click on the{\" \"}\n <i>Config</i> button, and set{\" \"}\n <code>{location.origin + location.pathname}</code> as the host URL.\n <br />\n <br />\n You can find more information about app-hosting{\" \"}\n <a href=\"https://www.plasmic.app/learn/app-hosting/\">here</a>.\n </p>\n );\n }\n return null;\n}\n\ninterface PlasmicCanvasHostProps {\n /**\n * Webpack hmr uses EventSource to\tlisten to hot reloads, but that\n * resultsin a persistent\tconnection from\teach window. In Plasmic\n * Studio, if a project is configured to use app-hosting with a\n * nextjs or gatsby server running in dev mode, each artboard will\n * be holding a persistent connection to the dev server.\n * Because browsers\thave a limit to\thow many connections can\n * be held\tat a time by domain, this means\tafter X\tartboards, new\n * artboards will freeze and not load.\n *\n * By default, <PlasmicCanvasHost /> will globally mutate\n * window.EventSource to avoid using EventSource for HMR, which you\n * typically don't need for your custom host page. If you do still\n * want to retain HRM, then youc an pass enableWebpackHmr={true}.\n */\n enableWebpackHmr?: boolean;\n}\n\nexport const PlasmicCanvasHost: React.FunctionComponent<PlasmicCanvasHostProps> = (\n props\n) => {\n const { enableWebpackHmr } = props;\n const [node, setNode] = React.useState<React.ReactElement<any, any> | null>(\n null\n );\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n};\n\nif (root.__Sub == null) {\n // Creating a side effect here by logging, so that vite won't\n // ignore this block for whatever reason\n console.log(\"Plasmic: Setting up app host dependencies\");\n root.__Sub = {\n React,\n ReactDOM,\n setPlasmicRootNode,\n registerRenderErrorListener,\n repeatedElement,\n setRepeatedElementFn,\n PlasmicCanvasContext,\n };\n}\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nfunction registerRenderErrorListener(listener: RenderErrorListener) {\n renderErrorListeners.push(listener);\n return () => {\n const index = renderErrorListeners.indexOf(listener);\n if (index >= 0) {\n renderErrorListeners.splice(index, 1);\n }\n };\n}\n\ninterface ErrorBoundaryProps {\n children?: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error) {\n renderErrorListeners.forEach((listener) => listener(error));\n }\n\n render() {\n if (this.state.error) {\n return <div>Error: {`${this.state.error.message}`}</div>;\n } else {\n return this.props.children;\n }\n }\n}\n\nfunction DisableWebpackHmr() {\n if (process.env.NODE_ENV === \"production\") {\n return null;\n }\n return (\n <script\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n if (typeof window !== \"undefined\") {\n const RealEventSource = window.EventSource;\n window.EventSource = function(url, config) {\n if (/[^a-zA-Z]hmr($|[^a-zA-Z])/.test(url)) {\n console.warn(\"Plasmic: disabled EventSource request for\", url);\n return {\n onerror() {}, onmessage() {}, onopen() {}, close() {}\n };\n } else {\n return new RealEventSource(url, config);\n }\n }\n }\n `,\n }}\n ></script>\n );\n}\n"],"names":["root","globalThis","__PlasmicFetcherRegistry","registerFetcher","fetcher","meta","push","isString","x","ensure","msg","undefined","Error","__PlasmicComponentRegistry","registerComponent","component","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","map","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","fn","useForceUpdate","useState","setTick","update","useCallback","tick","__PlasmicHostVersion","rootChangeListeners","PlasmicRootNodeWrapper","value","val","forEach","f","plasmicRootNode","getPlasmicOrigin","params","URL","location","hash","replace","searchParams","get","renderStudioIntoIframe","script","document","createElement","plasmicOrigin","src","body","appendChild","renderCount","setPlasmicRootNode","node","set","PlasmicCanvasContext","React","_PlasmicCanvasHost","isFrameAttached","window","parent","isCanvas","match","isLive","shouldRenderStudio","querySelector","forceUpdate","index","indexOf","splice","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","ReactDOM","ErrorBoundary","key","Provider","href","origin","pathname","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","console","log","registerRenderErrorListener","renderErrorListeners","listener","state","getDerivedStateFromError","error","componentDidCatch","render","message","children","type","dangerouslySetInnerHTML","__html"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,IAAMA,IAAI,GAAGC,UAAb;AAyCAD,IAAI,CAACE,wBAAL,GAAgC,EAAhC;SAEgBC,gBAAgBC,SAAkBC;AAChDL,EAAAA,IAAI,CAACE,wBAAL,CAA8BI,IAA9B,CAAmC;AAAEF,IAAAA,OAAO,EAAPA,OAAF;AAAWC,IAAAA,IAAI,EAAJA;AAAX,GAAnC;AACD;;AC9CD,SAASE,QAAT,CAAkBC,CAAlB;AACE,SAAO,OAAOA,CAAP,KAAa,QAApB;AACD;;AAID,SAAgBC,OAAUD,GAAyBE;MAAAA;AAAAA,IAAAA,MAAiB;;;AAClE,MAAIF,CAAC,KAAK,IAAN,IAAcA,CAAC,KAAKG,SAAxB,EAAmC;AACjC;AACAD,IAAAA,GAAG,GAAG,CAACH,QAAQ,CAACG,GAAD,CAAR,GAAgBA,GAAhB,GAAsBA,GAAG,EAA1B,KAAiC,EAAvC;AACA,UAAM,IAAIE,KAAJ,0CACkCF,GAAG,UAAQA,GAAR,GAAgB,EADrD,EAAN;AAGD,GAND,MAMO;AACL,WAAOF,CAAP;AACD;AACF;;ACVD,IAAMR,MAAI,GAAGC,UAAb;;AA6RA,IAAID,MAAI,CAACa,0BAAL,IAAmC,IAAvC,EAA6C;AAC3Cb,EAAAA,MAAI,CAACa,0BAAL,GAAkC,EAAlC;AACD;;AAED,SAAwBC,kBACtBC,WACAV;AAEAL,EAAAA,MAAI,CAACa,0BAAL,CAAgCP,IAAhC,CAAqC;AAAES,IAAAA,SAAS,EAATA,SAAF;AAAaV,IAAAA,IAAI,EAAJA;AAAb,GAArC;AACD;;;AC1SD;;;;;;;;;;;AAUA,SAAwBW,gBAAmBC,WAAoBC;AAC7D,SAAOC,iBAAiB,CAACF,SAAD,EAAYC,GAAZ,CAAxB;AACD;;AAED,IAAIC,iBAAiB,GAAG,2BAAIF,SAAJ,EAAwBC,GAAxB;AACtB,MAAID,SAAJ,EAAe;AACb,WAAOC,GAAP;AACD;;AACD,MAAIE,KAAK,CAACC,OAAN,CAAcH,GAAd,CAAJ,EAAwB;AACtB,WAAQA,GAAG,CAACI,GAAJ,CAAQ,UAACC,CAAD;AAAA,aAAOP,eAAe,CAACC,SAAD,EAAYM,CAAZ,CAAtB;AAAA,KAAR,CAAR;AACD;;AACD,MAAIL,GAAG,IAAIM,oBAAc,CAACN,GAAD,CAArB,IAA8B,OAAOA,GAAP,KAAe,QAAjD,EAA2D;AACzD,WAAQO,kBAAY,CAACP,GAAD,CAApB;AACD;;AACD,SAAOA,GAAP;AACD,CAXD;;AAaA,IAAMlB,MAAI,GAAGC,UAAb;AACA,AAAO,IAAMyB,oBAAoB,4BAC/B1B,MAD+B,mCAC/BA,MAAI,CAAE2B,KADyB,qBAC/B,YAAaD,oBADkB,oCAE/B,UAAUE,EAAV;AACET,EAAAA,iBAAiB,GAAGS,EAApB;AACD,CAJI;;SC5BiBC;AACtB,kBAAoBC,cAAQ,CAAC,CAAD,CAA5B;AAAA,MAASC,OAAT;;AACA,MAAMC,MAAM,GAAGC,iBAAW,CAAC;AACzBF,IAAAA,OAAO,CAAC,UAACG,IAAD;AAAA,aAAUA,IAAI,GAAG,CAAjB;AAAA,KAAD,CAAP;AACD,GAFyB,EAEvB,EAFuB,CAA1B;AAGA,SAAOF,MAAP;AACD;;ACUD,IAAMhC,MAAI,GAAGC,UAAb;AAEA;AAkBA,IAAID,MAAI,CAACmC,oBAAL,IAA6B,IAAjC,EAAuC;AACrCnC,EAAAA,MAAI,CAACmC,oBAAL,GAA4B,GAA5B;AACD;;AAED,IAAMC,mBAAmB,GAAmB,EAA5C;;IACMC,yBACJ,gCAAoBC,KAApB;;;AAAoB,YAAA,GAAAA,KAAA;;AACpB,UAAA,GAAM,UAACC,GAAD;AACJ,IAAA,KAAI,CAACD,KAAL,GAAaC,GAAb;AACAH,IAAAA,mBAAmB,CAACI,OAApB,CAA4B,UAACC,CAAD;AAAA,aAAOA,CAAC,EAAR;AAAA,KAA5B;AACD,GAHD;;AAIA,UAAA,GAAM;AAAA,WAAM,KAAI,CAACH,KAAX;AAAA,GAAN;AALwD;;AAQ1D,IAAMI,eAAe,gBAAG,IAAIL,sBAAJ,CAA2B,IAA3B,CAAxB;;AAEA,SAASM,gBAAT;AACE,MAAMC,MAAM,GAAG,IAAIC,GAAJ,sBAA2BC,QAAQ,CAACC,IAAT,CAAcC,OAAd,CAAsB,GAAtB,EAA2B,GAA3B,CAA3B,EACZC,YADH;AAEA,SAAOxC,MAAM,CACXmC,MAAM,CAACM,GAAP,CAAW,QAAX,CADW,EAEX,0CAFW,CAAb;AAID;;AAED,SAASC,sBAAT;AACE,MAAMC,MAAM,GAAGC,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAAf;AACA,MAAMC,aAAa,GAAGZ,gBAAgB,EAAtC;AACAS,EAAAA,MAAM,CAACI,GAAP,GAAaD,aAAa,GAAG,sBAA7B;AACAF,EAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0BN,MAA1B;AACD;;AAED,IAAIO,WAAW,GAAG,CAAlB;;AACA,SAASC,kBAAT,CAA4BC,IAA5B;AACE;AACA;AACAF,EAAAA,WAAW;AACXjB,EAAAA,eAAe,CAACoB,GAAhB,CAAoBD,IAApB;AACD;AAED;;;;;AAGA,IAAaE,oBAAoB,gBAAGC,mBAAA,CAA6B,KAA7B,CAA7B;;AAEP,SAASC,kBAAT;;;AACE;AACA;AACA;AACA;AACA,MAAMC,eAAe,GAAG,CAAC,CAACC,MAAM,CAACC,MAAjC;AACA,MAAMC,QAAQ,GAAG,CAAC,oBAACvB,QAAQ,CAACC,IAAV,aAAC,eAAeuB,KAAf,CAAqB,iBAArB,CAAD,CAAlB;AACA,MAAMC,MAAM,GAAG,CAAC,qBAACzB,QAAQ,CAACC,IAAV,aAAC,gBAAeuB,KAAf,CAAqB,eAArB,CAAD,CAAD,IAA2C,CAACJ,eAA3D;AACA,MAAMM,kBAAkB,GACtBN,eAAe,IACf,CAACb,QAAQ,CAACoB,aAAT,CAAuB,qBAAvB,CADD,IAEA,CAACJ,QAFD,IAGA,CAACE,MAJH;AAKA,MAAMG,WAAW,GAAG7C,cAAc,EAAlC;AACAmC,EAAAA,qBAAA,CAAsB;AACpB5B,IAAAA,mBAAmB,CAAC9B,IAApB,CAAyBoE,WAAzB;AACA,WAAO;AACL,UAAMC,KAAK,GAAGvC,mBAAmB,CAACwC,OAApB,CAA4BF,WAA5B,CAAd;;AACA,UAAIC,KAAK,IAAI,CAAb,EAAgB;AACdvC,QAAAA,mBAAmB,CAACyC,MAApB,CAA2BF,KAA3B,EAAkC,CAAlC;AACD;AACF,KALD;AAMD,GARD,EAQG,CAACD,WAAD,CARH;AASAV,EAAAA,eAAA,CAAgB;AACd,QAAIQ,kBAAkB,IAAIN,eAAtB,IAAyCC,MAAM,CAACC,MAAP,KAAkBD,MAA/D,EAAuE;AACrEhB,MAAAA,sBAAsB;AACvB;AACF,GAJD,EAIG,CAACqB,kBAAD,EAAqBN,eAArB,CAJH;AAKAF,EAAAA,eAAA,CAAgB;AACd,QAAI,CAACQ,kBAAD,IAAuB,CAACnB,QAAQ,CAACoB,aAAT,CAAuB,UAAvB,CAAxB,IAA8DF,MAAlE,EAA0E;AACxE,UAAMO,SAAS,GAAGzB,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAAlB;AACAwB,MAAAA,SAAS,CAACC,EAAV,GAAe,SAAf;AACAD,MAAAA,SAAS,CAACtB,GAAV,GAAgBb,gBAAgB,KAAK,uBAArC;AACAmC,MAAAA,SAAS,CAACE,KAAV,GAAkB,KAAlB;;AACAF,MAAAA,SAAS,CAACG,MAAV,GAAmB;AAChBd,QAAAA,MAAc,CAACe,sBAAf,oBAAAf,MAAc,CAACe,sBAAf;AACF,OAFD;;AAGA7B,MAAAA,QAAQ,CAAC8B,IAAT,CAAcC,MAAd,CAAqBN,SAArB;AACD;AACF,GAXD,EAWG,CAACN,kBAAD,CAXH;;AAYA,MAAI,CAACN,eAAL,EAAsB;AACpB,WAAO,IAAP;AACD;;AACD,MAAIG,QAAQ,IAAIE,MAAhB,EAAwB;AACtB,QAAIc,MAAM,GAAGhC,QAAQ,CAACoB,aAAT,CAAuB,8BAAvB,CAAb;;AACA,QAAI,CAACY,MAAL,EAAa;AACXA,MAAAA,MAAM,GAAGhC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAT;AACA+B,MAAAA,MAAM,CAACN,EAAP,GAAY,aAAZ;AACAM,MAAAA,MAAM,CAACC,SAAP,CAAiBC,GAAjB,CAAqB,iBAArB;AACAlC,MAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0B2B,MAA1B;AACD;;AACD,WAAOG,qBAAA,CACLxB,mBAAA,CAACyB,aAAD;AAAeC,MAAAA,GAAG,OAAK/B;KAAvB,EACEK,mBAAA,CAACD,oBAAoB,CAAC4B,QAAtB;AAA+BrD,MAAAA,KAAK,EAAE+B;KAAtC,EACG3B,eAAe,CAACQ,GAAhB,EADH,CADF,CADK,EAMLmC,MANK,EAOL,aAPK,CAAP;AASD;;AACD,MAAIb,kBAAkB,IAAIL,MAAM,CAACC,MAAP,KAAkBD,MAA5C,EAAoD;AAClD,WACEH,mBAAA,IAAA,MAAA,8CAAA,EAC4CA,mBAAA,KAAA,MAAA,CAD5C,KAAA,EACmDA,mBAAA,KAAA,MAAA,CADnD,WAAA,EAESA,mBAAA,IAAA;AAAG4B,MAAAA,IAAI,EAAC;KAAR,aAAA,CAFT,kBAAA,EAE2E,GAF3E,EAGE5B,mBAAA,IAAA,MAAA,UAAA,CAHF,oBAAA,EAGgC,GAHhC,EAIEA,mBAAA,OAAA,MAAA,EAAOlB,QAAQ,CAAC+C,MAAT,GAAkB/C,QAAQ,CAACgD,QAAlC,CAJF,qBAAA,EAKE9B,mBAAA,KAAA,MAAA,CALF,EAMEA,mBAAA,KAAA,MAAA,CANF,mDAAA,EAOkD,GAPlD,EAQEA,mBAAA,IAAA;AAAG4B,MAAAA,IAAI,EAAC;KAAR,QAAA,CARF,KAAA,CADF;AAYD;;AACD,SAAO,IAAP;AACD;;AAqBD,IAAaG,iBAAiB,GAAoD,SAArEA,iBAAqE,CAChFC,KADgF;AAGhF,MAAQC,gBAAR,GAA6BD,KAA7B,CAAQC,gBAAR;;AACA,wBAAwBjC,cAAA,CACtB,IADsB,CAAxB;AAAA,MAAOH,IAAP;AAAA,MAAaqC,OAAb;;AAGAlC,EAAAA,eAAA,CAAgB;AACdkC,IAAAA,OAAO,CAAClC,mBAAA,CAACC,kBAAD,MAAA,CAAD,CAAP;AACD,GAFD,EAEG,EAFH;AAGA,SACED,mBAAA,eAAA,MAAA,EACG,CAACiC,gBAAD,IAAqBjC,mBAAA,CAACmC,iBAAD,MAAA,CADxB,EAEGtC,IAFH,CADF;AAMD,CAhBM;;AAkBP,IAAI7D,MAAI,CAAC2B,KAAL,IAAc,IAAlB,EAAwB;AACtB;AACA;AACAyE,EAAAA,OAAO,CAACC,GAAR,CAAY,2CAAZ;AACArG,EAAAA,MAAI,CAAC2B,KAAL,GAAa;AACXqC,IAAAA,KAAK,EAALA,KADW;AAEXwB,IAAAA,QAAQ,EAARA,QAFW;AAGX5B,IAAAA,kBAAkB,EAAlBA,kBAHW;AAIX0C,IAAAA,2BAA2B,EAA3BA,2BAJW;AAKXtF,IAAAA,eAAe,EAAfA,eALW;AAMXU,IAAAA,oBAAoB,EAApBA,oBANW;AAOXqC,IAAAA,oBAAoB,EAApBA;AAPW,GAAb;AASD;;AAGD,IAAMwC,oBAAoB,GAA0B,EAApD;;AACA,SAASD,2BAAT,CAAqCE,QAArC;AACED,EAAAA,oBAAoB,CAACjG,IAArB,CAA0BkG,QAA1B;AACA,SAAO;AACL,QAAM7B,KAAK,GAAG4B,oBAAoB,CAAC3B,OAArB,CAA6B4B,QAA7B,CAAd;;AACA,QAAI7B,KAAK,IAAI,CAAb,EAAgB;AACd4B,MAAAA,oBAAoB,CAAC1B,MAArB,CAA4BF,KAA5B,EAAmC,CAAnC;AACD;AACF,GALD;AAMD;;IAUKc;;;AAIJ,yBAAYO,KAAZ;;;AACE,yCAAMA,KAAN;AACA,WAAKS,KAAL,GAAa,EAAb;;AACD;;gBAEMC,2BAAP,kCAAgCC,KAAhC;AACE,WAAO;AAAEA,MAAAA,KAAK,EAALA;AAAF,KAAP;AACD;;;;SAEDC,oBAAA,2BAAkBD,KAAlB;AACEJ,IAAAA,oBAAoB,CAAC/D,OAArB,CAA6B,UAACgE,QAAD;AAAA,aAAcA,QAAQ,CAACG,KAAD,CAAtB;AAAA,KAA7B;AACD;;SAEDE,SAAA;AACE,QAAI,KAAKJ,KAAL,CAAWE,KAAf,EAAsB;AACpB,aAAO3C,mBAAA,MAAA,MAAA,WAAA,OAAgB,KAAKyC,KAAL,CAAWE,KAAX,CAAiBG,OAAjC,CAAP;AACD,KAFD,MAEO;AACL,aAAO,KAAKd,KAAL,CAAWe,QAAlB;AACD;AACF;;;EAvByB/C;;AA0B5B,SAASmC,iBAAT;AACE;AAGA,SACEnC,mBAAA,SAAA;AACEgD,IAAAA,IAAI,EAAC;AACLC,IAAAA,uBAAuB,EAAE;AACvBC,MAAAA,MAAM;AADiB;GAF3B,CADF;AAsBD;;;;;;;;"}
1
+ {"version":3,"file":"host.cjs.development.js","sources":["../src/data.ts","../src/lang-utils.ts","../src/registerComponent.ts","../src/registerContext.ts","../src/repeatedElement.ts","../src/useForceUpdate.ts","../src/index.tsx"],"sourcesContent":["import { PrimitiveType } from \"./index\";\nconst root = globalThis as any;\n\nexport type Fetcher = (...args: any[]) => Promise<any>;\n\nexport interface FetcherMeta {\n /**\n * Any unique identifying string for this fetcher.\n */\n name: string;\n /**\n * The Studio-user-friendly display name.\n */\n displayName?: string;\n /**\n * The symbol to import from the importPath.\n */\n importName?: string;\n args: { name: string; type: PrimitiveType }[];\n returns: PrimitiveType;\n /**\n * Either the path to the fetcher relative to `rootDir` or the npm\n * package name\n */\n importPath: string;\n /**\n * Whether it's a default export or named export\n */\n isDefaultExport?: boolean;\n}\n\nexport interface FetcherRegistration {\n fetcher: Fetcher;\n meta: FetcherMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicFetcherRegistry: FetcherRegistration[];\n }\n}\n\nroot.__PlasmicFetcherRegistry = [];\n\nexport function registerFetcher(fetcher: Fetcher, meta: FetcherMeta) {\n root.__PlasmicFetcherRegistry.push({ fetcher, meta });\n}\n","function isString(x: any): x is string {\n return typeof x === \"string\";\n}\n\ntype StringGen = string | (() => string);\n\nexport function ensure<T>(x: T | null | undefined, msg: StringGen = \"\"): T {\n if (x === null || x === undefined) {\n debugger;\n msg = (isString(msg) ? msg : msg()) || \"\";\n throw new Error(\n `Value must not be undefined or null${msg ? `- ${msg}` : \"\"}`\n );\n } else {\n return x;\n }\n}\n","import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\nexport type StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\nexport type NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\nexport type ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\nexport interface ModalProps {\n show?: boolean;\n children?: React.ReactNode;\n onClose: () => void;\n style?: CSSProperties;\n}\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n /**\n * Full screen modal component\n */\n FullscreenModal: React.ComponentType<ModalProps>;\n /**\n * Modal component for the side pane\n */\n SideModal: React.ComponentType<ModalProps>;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\nexport type SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n /**\n * Registered name of parent component, used for grouping related components.\n */\n parentComponentName?: string;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n","import {\n BooleanType,\n ChoiceType,\n CustomType,\n JSONLikeType,\n NumberType,\n StringType,\n SupportControlled,\n} from \"./registerComponent\";\n\nconst root = globalThis as any;\n\nexport type PropType<P> = SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | CustomType<P>\n>;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n StringType<P> | ChoiceType<P> | JSONLikeType<P> | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\nexport interface ContextMeta<P> {\n /**\n * Any unique string name used to identify that context. Each context\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the context in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the context properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the context in the generated code.\n * It can be the name of the package that contains the context, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the context is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n}\n\nexport interface ContextRegistration {\n component: React.ComponentType<any>;\n meta: ContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: ContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerContext<T extends React.ComponentType<any>>(\n component: T,\n meta: ContextMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicContextRegistry.push({ component, meta });\n}\n","import { cloneElement, isValidElement } from \"react\";\n\n/**\n * Allows a component from Plasmic Studio to be repeated.\n * `isPrimary` should be true for at most one instance of the component, and\n * indicates which copy of the element will be highlighted when the element is\n * selected in Studio.\n * If `isPrimary` is `false`, and `elt` is a React element (or an array of such),\n * it'll be cloned (using React.cloneElement) and ajusted if it's a component\n * from Plasmic Studio. Otherwise, if `elt` is not a React element, the original\n * value is returned.\n */\nexport default function repeatedElement<T>(isPrimary: boolean, elt: T): T {\n return repeatedElementFn(isPrimary, elt);\n}\n\nlet repeatedElementFn = <T>(isPrimary: boolean, elt: T): T => {\n if (isPrimary) {\n return elt;\n }\n if (Array.isArray(elt)) {\n return (elt.map((v) => repeatedElement(isPrimary, v)) as any) as T;\n }\n if (elt && isValidElement(elt) && typeof elt !== \"string\") {\n return (cloneElement(elt) as any) as T;\n }\n return elt;\n};\n\nconst root = globalThis as any;\nexport const setRepeatedElementFn: (fn: typeof repeatedElement) => void =\n root?.__Sub?.setRepeatedElementFn ??\n function (fn: typeof repeatedElement) {\n repeatedElementFn = fn;\n };\n","import { useCallback, useState } from \"react\";\n\nexport default function useForceUpdate() {\n const [, setTick] = useState(0);\n const update = useCallback(() => {\n setTick((tick) => tick + 1);\n }, []);\n return update;\n}\n","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerFetcher as unstable_registerFetcher } from \"./data\";\nimport { PlasmicElement } from \"./element-types\";\nimport { ensure } from \"./lang-utils\";\nimport registerComponent, {\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n} from \"./registerComponent\";\nimport registerContext, {\n ContextMeta,\n ContextRegistration,\n PropType as ContextPropType,\n} from \"./registerContext\";\nimport repeatedElement, { setRepeatedElementFn } from \"./repeatedElement\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\n\nexport { unstable_registerFetcher };\nexport { repeatedElement };\nexport {\n registerComponent,\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n};\nexport { registerContext, ContextMeta, ContextRegistration, ContextPropType };\nexport { PlasmicElement };\n\ndeclare global {\n interface Window {\n __PlasmicHostVersion: string;\n }\n}\n\nif (root.__PlasmicHostVersion == null) {\n root.__PlasmicHostVersion = \"2\";\n}\n\nconst rootChangeListeners: (() => void)[] = [];\nclass PlasmicRootNodeWrapper {\n constructor(private value: null | React.ReactElement) {}\n set = (val: null | React.ReactElement) => {\n this.value = val;\n rootChangeListeners.forEach(f => f());\n };\n get = () => this.value;\n}\n\nconst plasmicRootNode = new PlasmicRootNodeWrapper(null);\n\nfunction getPlasmicOrigin() {\n const params = new URL(`https://fakeurl/${location.hash.replace(/#/, \"?\")}`)\n .searchParams;\n return ensure(\n params.get(\"origin\"),\n \"Missing information from Plasmic window.\"\n );\n}\n\nfunction renderStudioIntoIframe() {\n const script = document.createElement(\"script\");\n const plasmicOrigin = getPlasmicOrigin();\n script.src = plasmicOrigin + \"/static/js/studio.js\";\n document.body.appendChild(script);\n}\n\nlet renderCount = 0;\nfunction setPlasmicRootNode(node: React.ReactElement | null) {\n // Keep track of renderCount, which we use as key to ErrorBoundary, so\n // we can reset the error on each render\n renderCount++;\n plasmicRootNode.set(node);\n}\n\n/**\n * React context to detect whether the component is rendered on Plasmic editor.\n */\nexport const PlasmicCanvasContext = React.createContext<boolean>(false);\n\nfunction _PlasmicCanvasHost() {\n // If window.parent is null, then this is a window whose containing iframe\n // has been detached from the DOM (for the top window, window.parent === window).\n // In that case, we shouldn't do anything. If window.parent is null, by the way,\n // location.hash will also be null.\n const isFrameAttached = !!window.parent;\n const isCanvas = !!location.hash?.match(/\\bcanvas=true\\b/);\n const isLive = !!location.hash?.match(/\\blive=true\\b/) || !isFrameAttached;\n const shouldRenderStudio =\n isFrameAttached &&\n !document.querySelector(\"#plasmic-studio-tag\") &&\n !isCanvas &&\n !isLive;\n const forceUpdate = useForceUpdate();\n React.useLayoutEffect(() => {\n rootChangeListeners.push(forceUpdate);\n return () => {\n const index = rootChangeListeners.indexOf(forceUpdate);\n if (index >= 0) {\n rootChangeListeners.splice(index, 1);\n }\n };\n }, [forceUpdate]);\n React.useEffect(() => {\n if (shouldRenderStudio && isFrameAttached && window.parent !== window) {\n renderStudioIntoIframe();\n }\n }, [shouldRenderStudio, isFrameAttached]);\n React.useEffect(() => {\n if (!shouldRenderStudio && !document.querySelector(\"#getlibs\") && isLive) {\n const scriptElt = document.createElement(\"script\");\n scriptElt.id = \"getlibs\";\n scriptElt.src = getPlasmicOrigin() + \"/static/js/getlibs.js\";\n scriptElt.async = false;\n scriptElt.onload = () => {\n (window as any).__GetlibsReadyResolver?.();\n };\n document.head.append(scriptElt);\n }\n }, [shouldRenderStudio]);\n if (!isFrameAttached) {\n return null;\n }\n if (isCanvas || isLive) {\n let appDiv = document.querySelector(\"#plasmic-app.__wab_user-body\");\n if (!appDiv) {\n appDiv = document.createElement(\"div\");\n appDiv.id = \"plasmic-app\";\n appDiv.classList.add(\"__wab_user-body\");\n document.body.appendChild(appDiv);\n }\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={isCanvas}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <p>\n Your app is ready to host Plasmic Studio! <br /> <br />\n On the <a href=\"https://studio.plasmic.app/\">Dashboard</a>, click on the{\" \"}\n <i>Config</i> button, and set{\" \"}\n <code>{location.origin + location.pathname}</code> as the host URL.\n <br />\n <br />\n You can find more information about app-hosting{\" \"}\n <a href=\"https://www.plasmic.app/learn/app-hosting/\">here</a>.\n </p>\n );\n }\n return null;\n}\n\ninterface PlasmicCanvasHostProps {\n /**\n * Webpack hmr uses EventSource to\tlisten to hot reloads, but that\n * resultsin a persistent\tconnection from\teach window. In Plasmic\n * Studio, if a project is configured to use app-hosting with a\n * nextjs or gatsby server running in dev mode, each artboard will\n * be holding a persistent connection to the dev server.\n * Because browsers\thave a limit to\thow many connections can\n * be held\tat a time by domain, this means\tafter X\tartboards, new\n * artboards will freeze and not load.\n *\n * By default, <PlasmicCanvasHost /> will globally mutate\n * window.EventSource to avoid using EventSource for HMR, which you\n * typically don't need for your custom host page. If you do still\n * want to retain HRM, then youc an pass enableWebpackHmr={true}.\n */\n enableWebpackHmr?: boolean;\n}\n\nexport const PlasmicCanvasHost: React.FunctionComponent<PlasmicCanvasHostProps> = props => {\n const { enableWebpackHmr } = props;\n const [node, setNode] = React.useState<React.ReactElement<any, any> | null>(\n null\n );\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n};\n\nif (root.__Sub == null) {\n // Creating a side effect here by logging, so that vite won't\n // ignore this block for whatever reason\n console.log(\"Plasmic: Setting up app host dependencies\");\n root.__Sub = {\n React,\n ReactDOM,\n setPlasmicRootNode,\n registerRenderErrorListener,\n repeatedElement,\n setRepeatedElementFn,\n PlasmicCanvasContext,\n };\n}\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nfunction registerRenderErrorListener(listener: RenderErrorListener) {\n renderErrorListeners.push(listener);\n return () => {\n const index = renderErrorListeners.indexOf(listener);\n if (index >= 0) {\n renderErrorListeners.splice(index, 1);\n }\n };\n}\n\ninterface ErrorBoundaryProps {\n children?: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error) {\n renderErrorListeners.forEach(listener => listener(error));\n }\n\n render() {\n if (this.state.error) {\n return <div>Error: {`${this.state.error.message}`}</div>;\n } else {\n return this.props.children;\n }\n }\n}\n\nfunction DisableWebpackHmr() {\n if (process.env.NODE_ENV === \"production\") {\n return null;\n }\n return (\n <script\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n if (typeof window !== \"undefined\") {\n const RealEventSource = window.EventSource;\n window.EventSource = function(url, config) {\n if (/[^a-zA-Z]hmr($|[^a-zA-Z])/.test(url)) {\n console.warn(\"Plasmic: disabled EventSource request for\", url);\n return {\n onerror() {}, onmessage() {}, onopen() {}, close() {}\n };\n } else {\n return new RealEventSource(url, config);\n }\n }\n }\n `,\n }}\n ></script>\n );\n}\n"],"names":["root","globalThis","__PlasmicFetcherRegistry","registerFetcher","fetcher","meta","push","isString","x","ensure","msg","undefined","Error","__PlasmicComponentRegistry","registerComponent","component","__PlasmicContextRegistry","registerContext","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","map","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","fn","useForceUpdate","useState","setTick","update","useCallback","tick","__PlasmicHostVersion","rootChangeListeners","PlasmicRootNodeWrapper","value","val","forEach","f","plasmicRootNode","getPlasmicOrigin","params","URL","location","hash","replace","searchParams","get","renderStudioIntoIframe","script","document","createElement","plasmicOrigin","src","body","appendChild","renderCount","setPlasmicRootNode","node","set","PlasmicCanvasContext","React","_PlasmicCanvasHost","isFrameAttached","window","parent","isCanvas","match","isLive","shouldRenderStudio","querySelector","forceUpdate","index","indexOf","splice","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","ReactDOM","ErrorBoundary","key","Provider","href","origin","pathname","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","console","log","registerRenderErrorListener","renderErrorListeners","listener","state","getDerivedStateFromError","error","componentDidCatch","render","message","children","type","dangerouslySetInnerHTML","__html"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,IAAMA,IAAI,GAAGC,UAAb;AAyCAD,IAAI,CAACE,wBAAL,GAAgC,EAAhC;SAEgBC,gBAAgBC,SAAkBC;AAChDL,EAAAA,IAAI,CAACE,wBAAL,CAA8BI,IAA9B,CAAmC;AAAEF,IAAAA,OAAO,EAAPA,OAAF;AAAWC,IAAAA,IAAI,EAAJA;AAAX,GAAnC;AACD;;AC9CD,SAASE,QAAT,CAAkBC,CAAlB;AACE,SAAO,OAAOA,CAAP,KAAa,QAApB;AACD;;AAID,SAAgBC,OAAUD,GAAyBE;MAAAA;AAAAA,IAAAA,MAAiB;;;AAClE,MAAIF,CAAC,KAAK,IAAN,IAAcA,CAAC,KAAKG,SAAxB,EAAmC;AACjC;AACAD,IAAAA,GAAG,GAAG,CAACH,QAAQ,CAACG,GAAD,CAAR,GAAgBA,GAAhB,GAAsBA,GAAG,EAA1B,KAAiC,EAAvC;AACA,UAAM,IAAIE,KAAJ,0CACkCF,GAAG,UAAQA,GAAR,GAAgB,EADrD,EAAN;AAGD,GAND,MAMO;AACL,WAAOF,CAAP;AACD;AACF;;ACVD,IAAMR,MAAI,GAAGC,UAAb;;AAgTA,IAAID,MAAI,CAACa,0BAAL,IAAmC,IAAvC,EAA6C;AAC3Cb,EAAAA,MAAI,CAACa,0BAAL,GAAkC,EAAlC;AACD;;AAED,SAAwBC,kBACtBC,WACAV;AAEAL,EAAAA,MAAI,CAACa,0BAAL,CAAgCP,IAAhC,CAAqC;AAAES,IAAAA,SAAS,EAATA,SAAF;AAAaV,IAAAA,IAAI,EAAJA;AAAb,GAArC;AACD;;ACrTD,IAAML,MAAI,GAAGC,UAAb;;AA8EA,IAAID,MAAI,CAACgB,wBAAL,IAAiC,IAArC,EAA2C;AACzChB,EAAAA,MAAI,CAACgB,wBAAL,GAAgC,EAAhC;AACD;;AAED,SAAwBC,gBACtBF,WACAV;AAEAL,EAAAA,MAAI,CAACgB,wBAAL,CAA8BV,IAA9B,CAAmC;AAAES,IAAAA,SAAS,EAATA,SAAF;AAAaV,IAAAA,IAAI,EAAJA;AAAb,GAAnC;AACD;;;AC/FD;;;;;;;;;;;AAUA,SAAwBa,gBAAmBC,WAAoBC;AAC7D,SAAOC,iBAAiB,CAACF,SAAD,EAAYC,GAAZ,CAAxB;AACD;;AAED,IAAIC,iBAAiB,GAAG,2BAAIF,SAAJ,EAAwBC,GAAxB;AACtB,MAAID,SAAJ,EAAe;AACb,WAAOC,GAAP;AACD;;AACD,MAAIE,KAAK,CAACC,OAAN,CAAcH,GAAd,CAAJ,EAAwB;AACtB,WAAQA,GAAG,CAACI,GAAJ,CAAQ,UAACC,CAAD;AAAA,aAAOP,eAAe,CAACC,SAAD,EAAYM,CAAZ,CAAtB;AAAA,KAAR,CAAR;AACD;;AACD,MAAIL,GAAG,IAAIM,oBAAc,CAACN,GAAD,CAArB,IAA8B,OAAOA,GAAP,KAAe,QAAjD,EAA2D;AACzD,WAAQO,kBAAY,CAACP,GAAD,CAApB;AACD;;AACD,SAAOA,GAAP;AACD,CAXD;;AAaA,IAAMpB,MAAI,GAAGC,UAAb;AACA,AAAO,IAAM2B,oBAAoB,4BAC/B5B,MAD+B,mCAC/BA,MAAI,CAAE6B,KADyB,qBAC/B,YAAaD,oBADkB,oCAE/B,UAAUE,EAAV;AACET,EAAAA,iBAAiB,GAAGS,EAApB;AACD,CAJI;;SC5BiBC;AACtB,kBAAoBC,cAAQ,CAAC,CAAD,CAA5B;AAAA,MAASC,OAAT;;AACA,MAAMC,MAAM,GAAGC,iBAAW,CAAC;AACzBF,IAAAA,OAAO,CAAC,UAACG,IAAD;AAAA,aAAUA,IAAI,GAAG,CAAjB;AAAA,KAAD,CAAP;AACD,GAFyB,EAEvB,EAFuB,CAA1B;AAGA,SAAOF,MAAP;AACD;;ACeD,IAAMlC,MAAI,GAAGC,UAAb;AAEA;AAmBA,IAAID,MAAI,CAACqC,oBAAL,IAA6B,IAAjC,EAAuC;AACrCrC,EAAAA,MAAI,CAACqC,oBAAL,GAA4B,GAA5B;AACD;;AAED,IAAMC,mBAAmB,GAAmB,EAA5C;;IACMC,yBACJ,gCAAoBC,KAApB;;;AAAoB,YAAA,GAAAA,KAAA;;AACpB,UAAA,GAAM,UAACC,GAAD;AACJ,IAAA,KAAI,CAACD,KAAL,GAAaC,GAAb;AACAH,IAAAA,mBAAmB,CAACI,OAApB,CAA4B,UAAAC,CAAC;AAAA,aAAIA,CAAC,EAAL;AAAA,KAA7B;AACD,GAHD;;AAIA,UAAA,GAAM;AAAA,WAAM,KAAI,CAACH,KAAX;AAAA,GAAN;AALwD;;AAQ1D,IAAMI,eAAe,gBAAG,IAAIL,sBAAJ,CAA2B,IAA3B,CAAxB;;AAEA,SAASM,gBAAT;AACE,MAAMC,MAAM,GAAG,IAAIC,GAAJ,sBAA2BC,QAAQ,CAACC,IAAT,CAAcC,OAAd,CAAsB,GAAtB,EAA2B,GAA3B,CAA3B,EACZC,YADH;AAEA,SAAO1C,MAAM,CACXqC,MAAM,CAACM,GAAP,CAAW,QAAX,CADW,EAEX,0CAFW,CAAb;AAID;;AAED,SAASC,sBAAT;AACE,MAAMC,MAAM,GAAGC,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAAf;AACA,MAAMC,aAAa,GAAGZ,gBAAgB,EAAtC;AACAS,EAAAA,MAAM,CAACI,GAAP,GAAaD,aAAa,GAAG,sBAA7B;AACAF,EAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0BN,MAA1B;AACD;;AAED,IAAIO,WAAW,GAAG,CAAlB;;AACA,SAASC,kBAAT,CAA4BC,IAA5B;AACE;AACA;AACAF,EAAAA,WAAW;AACXjB,EAAAA,eAAe,CAACoB,GAAhB,CAAoBD,IAApB;AACD;AAED;;;;;AAGA,IAAaE,oBAAoB,gBAAGC,mBAAA,CAA6B,KAA7B,CAA7B;;AAEP,SAASC,kBAAT;;;AACE;AACA;AACA;AACA;AACA,MAAMC,eAAe,GAAG,CAAC,CAACC,MAAM,CAACC,MAAjC;AACA,MAAMC,QAAQ,GAAG,CAAC,oBAACvB,QAAQ,CAACC,IAAV,aAAC,eAAeuB,KAAf,CAAqB,iBAArB,CAAD,CAAlB;AACA,MAAMC,MAAM,GAAG,CAAC,qBAACzB,QAAQ,CAACC,IAAV,aAAC,gBAAeuB,KAAf,CAAqB,eAArB,CAAD,CAAD,IAA2C,CAACJ,eAA3D;AACA,MAAMM,kBAAkB,GACtBN,eAAe,IACf,CAACb,QAAQ,CAACoB,aAAT,CAAuB,qBAAvB,CADD,IAEA,CAACJ,QAFD,IAGA,CAACE,MAJH;AAKA,MAAMG,WAAW,GAAG7C,cAAc,EAAlC;AACAmC,EAAAA,qBAAA,CAAsB;AACpB5B,IAAAA,mBAAmB,CAAChC,IAApB,CAAyBsE,WAAzB;AACA,WAAO;AACL,UAAMC,KAAK,GAAGvC,mBAAmB,CAACwC,OAApB,CAA4BF,WAA5B,CAAd;;AACA,UAAIC,KAAK,IAAI,CAAb,EAAgB;AACdvC,QAAAA,mBAAmB,CAACyC,MAApB,CAA2BF,KAA3B,EAAkC,CAAlC;AACD;AACF,KALD;AAMD,GARD,EAQG,CAACD,WAAD,CARH;AASAV,EAAAA,eAAA,CAAgB;AACd,QAAIQ,kBAAkB,IAAIN,eAAtB,IAAyCC,MAAM,CAACC,MAAP,KAAkBD,MAA/D,EAAuE;AACrEhB,MAAAA,sBAAsB;AACvB;AACF,GAJD,EAIG,CAACqB,kBAAD,EAAqBN,eAArB,CAJH;AAKAF,EAAAA,eAAA,CAAgB;AACd,QAAI,CAACQ,kBAAD,IAAuB,CAACnB,QAAQ,CAACoB,aAAT,CAAuB,UAAvB,CAAxB,IAA8DF,MAAlE,EAA0E;AACxE,UAAMO,SAAS,GAAGzB,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAAlB;AACAwB,MAAAA,SAAS,CAACC,EAAV,GAAe,SAAf;AACAD,MAAAA,SAAS,CAACtB,GAAV,GAAgBb,gBAAgB,KAAK,uBAArC;AACAmC,MAAAA,SAAS,CAACE,KAAV,GAAkB,KAAlB;;AACAF,MAAAA,SAAS,CAACG,MAAV,GAAmB;AAChBd,QAAAA,MAAc,CAACe,sBAAf,oBAAAf,MAAc,CAACe,sBAAf;AACF,OAFD;;AAGA7B,MAAAA,QAAQ,CAAC8B,IAAT,CAAcC,MAAd,CAAqBN,SAArB;AACD;AACF,GAXD,EAWG,CAACN,kBAAD,CAXH;;AAYA,MAAI,CAACN,eAAL,EAAsB;AACpB,WAAO,IAAP;AACD;;AACD,MAAIG,QAAQ,IAAIE,MAAhB,EAAwB;AACtB,QAAIc,MAAM,GAAGhC,QAAQ,CAACoB,aAAT,CAAuB,8BAAvB,CAAb;;AACA,QAAI,CAACY,MAAL,EAAa;AACXA,MAAAA,MAAM,GAAGhC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAT;AACA+B,MAAAA,MAAM,CAACN,EAAP,GAAY,aAAZ;AACAM,MAAAA,MAAM,CAACC,SAAP,CAAiBC,GAAjB,CAAqB,iBAArB;AACAlC,MAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0B2B,MAA1B;AACD;;AACD,WAAOG,qBAAA,CACLxB,mBAAA,CAACyB,aAAD;AAAeC,MAAAA,GAAG,OAAK/B;KAAvB,EACEK,mBAAA,CAACD,oBAAoB,CAAC4B,QAAtB;AAA+BrD,MAAAA,KAAK,EAAE+B;KAAtC,EACG3B,eAAe,CAACQ,GAAhB,EADH,CADF,CADK,EAMLmC,MANK,EAOL,aAPK,CAAP;AASD;;AACD,MAAIb,kBAAkB,IAAIL,MAAM,CAACC,MAAP,KAAkBD,MAA5C,EAAoD;AAClD,WACEH,mBAAA,IAAA,MAAA,8CAAA,EAC4CA,mBAAA,KAAA,MAAA,CAD5C,KAAA,EACmDA,mBAAA,KAAA,MAAA,CADnD,WAAA,EAESA,mBAAA,IAAA;AAAG4B,MAAAA,IAAI,EAAC;KAAR,aAAA,CAFT,kBAAA,EAE2E,GAF3E,EAGE5B,mBAAA,IAAA,MAAA,UAAA,CAHF,oBAAA,EAGgC,GAHhC,EAIEA,mBAAA,OAAA,MAAA,EAAOlB,QAAQ,CAAC+C,MAAT,GAAkB/C,QAAQ,CAACgD,QAAlC,CAJF,qBAAA,EAKE9B,mBAAA,KAAA,MAAA,CALF,EAMEA,mBAAA,KAAA,MAAA,CANF,mDAAA,EAOkD,GAPlD,EAQEA,mBAAA,IAAA;AAAG4B,MAAAA,IAAI,EAAC;KAAR,QAAA,CARF,KAAA,CADF;AAYD;;AACD,SAAO,IAAP;AACD;;AAqBD,IAAaG,iBAAiB,GAAoD,SAArEA,iBAAqE,CAAAC,KAAK;AACrF,MAAQC,gBAAR,GAA6BD,KAA7B,CAAQC,gBAAR;;AACA,wBAAwBjC,cAAA,CACtB,IADsB,CAAxB;AAAA,MAAOH,IAAP;AAAA,MAAaqC,OAAb;;AAGAlC,EAAAA,eAAA,CAAgB;AACdkC,IAAAA,OAAO,CAAClC,mBAAA,CAACC,kBAAD,MAAA,CAAD,CAAP;AACD,GAFD,EAEG,EAFH;AAGA,SACED,mBAAA,eAAA,MAAA,EACG,CAACiC,gBAAD,IAAqBjC,mBAAA,CAACmC,iBAAD,MAAA,CADxB,EAEGtC,IAFH,CADF;AAMD,CAdM;;AAgBP,IAAI/D,MAAI,CAAC6B,KAAL,IAAc,IAAlB,EAAwB;AACtB;AACA;AACAyE,EAAAA,OAAO,CAACC,GAAR,CAAY,2CAAZ;AACAvG,EAAAA,MAAI,CAAC6B,KAAL,GAAa;AACXqC,IAAAA,KAAK,EAALA,KADW;AAEXwB,IAAAA,QAAQ,EAARA,QAFW;AAGX5B,IAAAA,kBAAkB,EAAlBA,kBAHW;AAIX0C,IAAAA,2BAA2B,EAA3BA,2BAJW;AAKXtF,IAAAA,eAAe,EAAfA,eALW;AAMXU,IAAAA,oBAAoB,EAApBA,oBANW;AAOXqC,IAAAA,oBAAoB,EAApBA;AAPW,GAAb;AASD;;AAGD,IAAMwC,oBAAoB,GAA0B,EAApD;;AACA,SAASD,2BAAT,CAAqCE,QAArC;AACED,EAAAA,oBAAoB,CAACnG,IAArB,CAA0BoG,QAA1B;AACA,SAAO;AACL,QAAM7B,KAAK,GAAG4B,oBAAoB,CAAC3B,OAArB,CAA6B4B,QAA7B,CAAd;;AACA,QAAI7B,KAAK,IAAI,CAAb,EAAgB;AACd4B,MAAAA,oBAAoB,CAAC1B,MAArB,CAA4BF,KAA5B,EAAmC,CAAnC;AACD;AACF,GALD;AAMD;;IAUKc;;;AAIJ,yBAAYO,KAAZ;;;AACE,yCAAMA,KAAN;AACA,WAAKS,KAAL,GAAa,EAAb;;AACD;;gBAEMC,2BAAP,kCAAgCC,KAAhC;AACE,WAAO;AAAEA,MAAAA,KAAK,EAALA;AAAF,KAAP;AACD;;;;SAEDC,oBAAA,2BAAkBD,KAAlB;AACEJ,IAAAA,oBAAoB,CAAC/D,OAArB,CAA6B,UAAAgE,QAAQ;AAAA,aAAIA,QAAQ,CAACG,KAAD,CAAZ;AAAA,KAArC;AACD;;SAEDE,SAAA;AACE,QAAI,KAAKJ,KAAL,CAAWE,KAAf,EAAsB;AACpB,aAAO3C,mBAAA,MAAA,MAAA,WAAA,OAAgB,KAAKyC,KAAL,CAAWE,KAAX,CAAiBG,OAAjC,CAAP;AACD,KAFD,MAEO;AACL,aAAO,KAAKd,KAAL,CAAWe,QAAlB;AACD;AACF;;;EAvByB/C;;AA0B5B,SAASmC,iBAAT;AACE;AAGA,SACEnC,mBAAA,SAAA;AACEgD,IAAAA,IAAI,EAAC;AACLC,IAAAA,uBAAuB,EAAE;AACvBC,MAAAA,MAAM;AADiB;GAF3B,CADF;AAsBD;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("@plasmicapp/preamble");var e=require("react"),t=require("react-dom");function n(e,t){return(n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var r=globalThis;r.__PlasmicFetcherRegistry=[];var o,a,i=globalThis;function l(e,t){return c(e,t)}null==i.__PlasmicComponentRegistry&&(i.__PlasmicComponentRegistry=[]);var c=function(t,n){return t?n:Array.isArray(n)?n.map((function(e){return l(t,e)})):n&&e.isValidElement(n)&&"string"!=typeof n?e.cloneElement(n):n},u=globalThis,s=null!=(o=null==u||null==(a=u.__Sub)?void 0:a.setRepeatedElementFn)?o:function(e){c=e},p=globalThis;null==p.__PlasmicHostVersion&&(p.__PlasmicHostVersion="2");var m=[],d=new function(e){var t=this;this.value=null,this.set=function(e){t.value=e,m.forEach((function(e){return e()}))},this.get=function(){return t.value}}(null);function f(){return function(e,t){if(void 0===t&&(t=""),null==e)throw t=(function(e){return"string"==typeof e}(t)?t:t())||"",new Error("Value must not be undefined or null"+(t?"- "+t:""));return e}(new URL("https://fakeurl/"+location.hash.replace(/#/,"?")).searchParams.get("origin"),"Missing information from Plasmic window.")}var h=0,b=e.createContext(!1);function _(){var n,r,o,a=!!window.parent,i=!(null==(n=location.hash)||!n.match(/\bcanvas=true\b/)),l=!(null==(r=location.hash)||!r.match(/\blive=true\b/))||!a,c=a&&!document.querySelector("#plasmic-studio-tag")&&!i&&!l,u=(o=e.useState(0)[1],e.useCallback((function(){o((function(e){return e+1}))}),[]));if(e.useLayoutEffect((function(){return m.push(u),function(){var e=m.indexOf(u);e>=0&&m.splice(e,1)}}),[u]),e.useEffect((function(){var e,t;c&&a&&window.parent!==window&&(e=document.createElement("script"),t=f(),e.src=t+"/static/js/studio.js",document.body.appendChild(e))}),[c,a]),e.useEffect((function(){if(!c&&!document.querySelector("#getlibs")&&l){var e=document.createElement("script");e.id="getlibs",e.src=f()+"/static/js/getlibs.js",e.async=!1,e.onload=function(){null==window.__GetlibsReadyResolver||window.__GetlibsReadyResolver()},document.head.append(e)}}),[c]),!a)return null;if(i||l){var s=document.querySelector("#plasmic-app.__wab_user-body");return s||((s=document.createElement("div")).id="plasmic-app",s.classList.add("__wab_user-body"),document.body.appendChild(s)),t.createPortal(e.createElement(E,{key:""+h},e.createElement(b.Provider,{value:i},d.get())),s,"plasmic-app")}return c&&window.parent===window?e.createElement("p",null,"Your app is ready to host Plasmic Studio! ",e.createElement("br",null)," ",e.createElement("br",null),"On the ",e.createElement("a",{href:"https://studio.plasmic.app/"},"Dashboard"),", click on the"," ",e.createElement("i",null,"Config")," button, and set"," ",e.createElement("code",null,location.origin+location.pathname)," as the host URL.",e.createElement("br",null),e.createElement("br",null),"You can find more information about app-hosting"," ",e.createElement("a",{href:"https://www.plasmic.app/learn/app-hosting/"},"here"),"."):null}null==p.__Sub&&(console.log("Plasmic: Setting up app host dependencies"),p.__Sub={React:e,ReactDOM:t,setPlasmicRootNode:function(e){h++,d.set(e)},registerRenderErrorListener:function(e){return v.push(e),function(){var t=v.indexOf(e);t>=0&&v.splice(t,1)}},repeatedElement:l,setRepeatedElementFn:s,PlasmicCanvasContext:b});var v=[],E=function(t){var r,o;function a(e){var n;return(n=t.call(this,e)||this).state={},n}o=t,(r=a).prototype=Object.create(o.prototype),r.prototype.constructor=r,n(r,o),a.getDerivedStateFromError=function(e){return{error:e}};var i=a.prototype;return i.componentDidCatch=function(e){v.forEach((function(t){return t(e)}))},i.render=function(){return this.state.error?e.createElement("div",null,"Error: ",""+this.state.error.message):this.props.children},a}(e.Component);function g(){return null}exports.PlasmicCanvasContext=b,exports.PlasmicCanvasHost=function(t){var n=t.enableWebpackHmr,r=e.useState(null),o=r[0],a=r[1];return e.useEffect((function(){a(e.createElement(_,null))}),[]),e.createElement(e.Fragment,null,!n&&e.createElement(g,null),o)},exports.registerComponent=function(e,t){i.__PlasmicComponentRegistry.push({component:e,meta:t})},exports.repeatedElement=l,exports.unstable_registerFetcher=function(e,t){r.__PlasmicFetcherRegistry.push({fetcher:e,meta:t})};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("@plasmicapp/preamble");var e=require("react"),t=require("react-dom");function n(e,t){return(n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var r=globalThis;r.__PlasmicFetcherRegistry=[];var o=globalThis;null==o.__PlasmicComponentRegistry&&(o.__PlasmicComponentRegistry=[]);var a,i,l=globalThis;function s(e,t){return c(e,t)}null==l.__PlasmicContextRegistry&&(l.__PlasmicContextRegistry=[]);var c=function(t,n){return t?n:Array.isArray(n)?n.map((function(e){return s(t,e)})):n&&e.isValidElement(n)&&"string"!=typeof n?e.cloneElement(n):n},u=globalThis,p=null!=(a=null==u||null==(i=u.__Sub)?void 0:i.setRepeatedElementFn)?a:function(e){c=e},m=globalThis;null==m.__PlasmicHostVersion&&(m.__PlasmicHostVersion="2");var d=[],f=new function(e){var t=this;this.value=null,this.set=function(e){t.value=e,d.forEach((function(e){return e()}))},this.get=function(){return t.value}}(null);function h(){return function(e,t){if(void 0===t&&(t=""),null==e)throw t=(function(e){return"string"==typeof e}(t)?t:t())||"",new Error("Value must not be undefined or null"+(t?"- "+t:""));return e}(new URL("https://fakeurl/"+location.hash.replace(/#/,"?")).searchParams.get("origin"),"Missing information from Plasmic window.")}var _=0,b=e.createContext(!1);function g(){var n,r,o,a=!!window.parent,i=!(null==(n=location.hash)||!n.match(/\bcanvas=true\b/)),l=!(null==(r=location.hash)||!r.match(/\blive=true\b/))||!a,s=a&&!document.querySelector("#plasmic-studio-tag")&&!i&&!l,c=(o=e.useState(0)[1],e.useCallback((function(){o((function(e){return e+1}))}),[]));if(e.useLayoutEffect((function(){return d.push(c),function(){var e=d.indexOf(c);e>=0&&d.splice(e,1)}}),[c]),e.useEffect((function(){var e,t;s&&a&&window.parent!==window&&(e=document.createElement("script"),t=h(),e.src=t+"/static/js/studio.js",document.body.appendChild(e))}),[s,a]),e.useEffect((function(){if(!s&&!document.querySelector("#getlibs")&&l){var e=document.createElement("script");e.id="getlibs",e.src=h()+"/static/js/getlibs.js",e.async=!1,e.onload=function(){null==window.__GetlibsReadyResolver||window.__GetlibsReadyResolver()},document.head.append(e)}}),[s]),!a)return null;if(i||l){var u=document.querySelector("#plasmic-app.__wab_user-body");return u||((u=document.createElement("div")).id="plasmic-app",u.classList.add("__wab_user-body"),document.body.appendChild(u)),t.createPortal(e.createElement(E,{key:""+_},e.createElement(b.Provider,{value:i},f.get())),u,"plasmic-app")}return s&&window.parent===window?e.createElement("p",null,"Your app is ready to host Plasmic Studio! ",e.createElement("br",null)," ",e.createElement("br",null),"On the ",e.createElement("a",{href:"https://studio.plasmic.app/"},"Dashboard"),", click on the"," ",e.createElement("i",null,"Config")," button, and set"," ",e.createElement("code",null,location.origin+location.pathname)," as the host URL.",e.createElement("br",null),e.createElement("br",null),"You can find more information about app-hosting"," ",e.createElement("a",{href:"https://www.plasmic.app/learn/app-hosting/"},"here"),"."):null}null==m.__Sub&&(console.log("Plasmic: Setting up app host dependencies"),m.__Sub={React:e,ReactDOM:t,setPlasmicRootNode:function(e){_++,f.set(e)},registerRenderErrorListener:function(e){return v.push(e),function(){var t=v.indexOf(e);t>=0&&v.splice(t,1)}},repeatedElement:s,setRepeatedElementFn:p,PlasmicCanvasContext:b});var v=[],E=function(t){var r,o;function a(e){var n;return(n=t.call(this,e)||this).state={},n}o=t,(r=a).prototype=Object.create(o.prototype),r.prototype.constructor=r,n(r,o),a.getDerivedStateFromError=function(e){return{error:e}};var i=a.prototype;return i.componentDidCatch=function(e){v.forEach((function(t){return t(e)}))},i.render=function(){return this.state.error?e.createElement("div",null,"Error: ",""+this.state.error.message):this.props.children},a}(e.Component);function y(){return null}exports.PlasmicCanvasContext=b,exports.PlasmicCanvasHost=function(t){var n=t.enableWebpackHmr,r=e.useState(null),o=r[0],a=r[1];return e.useEffect((function(){a(e.createElement(g,null))}),[]),e.createElement(e.Fragment,null,!n&&e.createElement(y,null),o)},exports.registerComponent=function(e,t){o.__PlasmicComponentRegistry.push({component:e,meta:t})},exports.registerContext=function(e,t){l.__PlasmicContextRegistry.push({component:e,meta:t})},exports.repeatedElement=s,exports.unstable_registerFetcher=function(e,t){r.__PlasmicFetcherRegistry.push({fetcher:e,meta:t})};
2
2
  //# sourceMappingURL=host.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.cjs.production.min.js","sources":["../src/data.ts","../src/registerComponent.ts","../src/repeatedElement.ts","../src/index.tsx","../src/lang-utils.ts","../src/useForceUpdate.ts"],"sourcesContent":["import { PrimitiveType } from \"./index\";\nconst root = globalThis as any;\n\nexport type Fetcher = (...args: any[]) => Promise<any>;\n\nexport interface FetcherMeta {\n /**\n * Any unique identifying string for this fetcher.\n */\n name: string;\n /**\n * The Studio-user-friendly display name.\n */\n displayName?: string;\n /**\n * The symbol to import from the importPath.\n */\n importName?: string;\n args: { name: string; type: PrimitiveType }[];\n returns: PrimitiveType;\n /**\n * Either the path to the fetcher relative to `rootDir` or the npm\n * package name\n */\n importPath: string;\n /**\n * Whether it's a default export or named export\n */\n isDefaultExport?: boolean;\n}\n\nexport interface FetcherRegistration {\n fetcher: Fetcher;\n meta: FetcherMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicFetcherRegistry: FetcherRegistration[];\n }\n}\n\nroot.__PlasmicFetcherRegistry = [];\n\nexport function registerFetcher(fetcher: Fetcher, meta: FetcherMeta) {\n root.__PlasmicFetcherRegistry.push({ fetcher, meta });\n}\n","import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\ntype StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\ntype BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\ntype NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\ntype JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\ntype ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\ntype SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n","import { cloneElement, isValidElement } from \"react\";\n\n/**\n * Allows a component from Plasmic Studio to be repeated.\n * `isPrimary` should be true for at most one instance of the component, and\n * indicates which copy of the element will be highlighted when the element is\n * selected in Studio.\n * If `isPrimary` is `false`, and `elt` is a React element (or an array of such),\n * it'll be cloned (using React.cloneElement) and ajusted if it's a component\n * from Plasmic Studio. Otherwise, if `elt` is not a React element, the original\n * value is returned.\n */\nexport default function repeatedElement<T>(isPrimary: boolean, elt: T): T {\n return repeatedElementFn(isPrimary, elt);\n}\n\nlet repeatedElementFn = <T>(isPrimary: boolean, elt: T): T => {\n if (isPrimary) {\n return elt;\n }\n if (Array.isArray(elt)) {\n return (elt.map((v) => repeatedElement(isPrimary, v)) as any) as T;\n }\n if (elt && isValidElement(elt) && typeof elt !== \"string\") {\n return (cloneElement(elt) as any) as T;\n }\n return elt;\n};\n\nconst root = globalThis as any;\nexport const setRepeatedElementFn: (fn: typeof repeatedElement) => void =\n root?.__Sub?.setRepeatedElementFn ??\n function (fn: typeof repeatedElement) {\n repeatedElementFn = fn;\n };\n","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerFetcher as unstable_registerFetcher } from \"./data\";\nimport { PlasmicElement } from \"./element-types\";\nimport { ensure } from \"./lang-utils\";\nimport registerComponent, {\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n} from \"./registerComponent\";\nimport repeatedElement, { setRepeatedElementFn } from \"./repeatedElement\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\n\nexport { unstable_registerFetcher };\nexport { repeatedElement };\nexport {\n registerComponent,\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n};\nexport { PlasmicElement };\n\ndeclare global {\n interface Window {\n __PlasmicHostVersion: string;\n }\n}\n\nif (root.__PlasmicHostVersion == null) {\n root.__PlasmicHostVersion = \"2\";\n}\n\nconst rootChangeListeners: (() => void)[] = [];\nclass PlasmicRootNodeWrapper {\n constructor(private value: null | React.ReactElement) {}\n set = (val: null | React.ReactElement) => {\n this.value = val;\n rootChangeListeners.forEach((f) => f());\n };\n get = () => this.value;\n}\n\nconst plasmicRootNode = new PlasmicRootNodeWrapper(null);\n\nfunction getPlasmicOrigin() {\n const params = new URL(`https://fakeurl/${location.hash.replace(/#/, \"?\")}`)\n .searchParams;\n return ensure(\n params.get(\"origin\"),\n \"Missing information from Plasmic window.\"\n );\n}\n\nfunction renderStudioIntoIframe() {\n const script = document.createElement(\"script\");\n const plasmicOrigin = getPlasmicOrigin();\n script.src = plasmicOrigin + \"/static/js/studio.js\";\n document.body.appendChild(script);\n}\n\nlet renderCount = 0;\nfunction setPlasmicRootNode(node: React.ReactElement | null) {\n // Keep track of renderCount, which we use as key to ErrorBoundary, so\n // we can reset the error on each render\n renderCount++;\n plasmicRootNode.set(node);\n}\n\n/**\n * React context to detect whether the component is rendered on Plasmic editor.\n */\nexport const PlasmicCanvasContext = React.createContext<boolean>(false);\n\nfunction _PlasmicCanvasHost() {\n // If window.parent is null, then this is a window whose containing iframe\n // has been detached from the DOM (for the top window, window.parent === window).\n // In that case, we shouldn't do anything. If window.parent is null, by the way,\n // location.hash will also be null.\n const isFrameAttached = !!window.parent;\n const isCanvas = !!location.hash?.match(/\\bcanvas=true\\b/);\n const isLive = !!location.hash?.match(/\\blive=true\\b/) || !isFrameAttached;\n const shouldRenderStudio =\n isFrameAttached &&\n !document.querySelector(\"#plasmic-studio-tag\") &&\n !isCanvas &&\n !isLive;\n const forceUpdate = useForceUpdate();\n React.useLayoutEffect(() => {\n rootChangeListeners.push(forceUpdate);\n return () => {\n const index = rootChangeListeners.indexOf(forceUpdate);\n if (index >= 0) {\n rootChangeListeners.splice(index, 1);\n }\n };\n }, [forceUpdate]);\n React.useEffect(() => {\n if (shouldRenderStudio && isFrameAttached && window.parent !== window) {\n renderStudioIntoIframe();\n }\n }, [shouldRenderStudio, isFrameAttached]);\n React.useEffect(() => {\n if (!shouldRenderStudio && !document.querySelector(\"#getlibs\") && isLive) {\n const scriptElt = document.createElement(\"script\");\n scriptElt.id = \"getlibs\";\n scriptElt.src = getPlasmicOrigin() + \"/static/js/getlibs.js\";\n scriptElt.async = false;\n scriptElt.onload = () => {\n (window as any).__GetlibsReadyResolver?.();\n };\n document.head.append(scriptElt);\n }\n }, [shouldRenderStudio]);\n if (!isFrameAttached) {\n return null;\n }\n if (isCanvas || isLive) {\n let appDiv = document.querySelector(\"#plasmic-app.__wab_user-body\");\n if (!appDiv) {\n appDiv = document.createElement(\"div\");\n appDiv.id = \"plasmic-app\";\n appDiv.classList.add(\"__wab_user-body\");\n document.body.appendChild(appDiv);\n }\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={isCanvas}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <p>\n Your app is ready to host Plasmic Studio! <br /> <br />\n On the <a href=\"https://studio.plasmic.app/\">Dashboard</a>, click on the{\" \"}\n <i>Config</i> button, and set{\" \"}\n <code>{location.origin + location.pathname}</code> as the host URL.\n <br />\n <br />\n You can find more information about app-hosting{\" \"}\n <a href=\"https://www.plasmic.app/learn/app-hosting/\">here</a>.\n </p>\n );\n }\n return null;\n}\n\ninterface PlasmicCanvasHostProps {\n /**\n * Webpack hmr uses EventSource to\tlisten to hot reloads, but that\n * resultsin a persistent\tconnection from\teach window. In Plasmic\n * Studio, if a project is configured to use app-hosting with a\n * nextjs or gatsby server running in dev mode, each artboard will\n * be holding a persistent connection to the dev server.\n * Because browsers\thave a limit to\thow many connections can\n * be held\tat a time by domain, this means\tafter X\tartboards, new\n * artboards will freeze and not load.\n *\n * By default, <PlasmicCanvasHost /> will globally mutate\n * window.EventSource to avoid using EventSource for HMR, which you\n * typically don't need for your custom host page. If you do still\n * want to retain HRM, then youc an pass enableWebpackHmr={true}.\n */\n enableWebpackHmr?: boolean;\n}\n\nexport const PlasmicCanvasHost: React.FunctionComponent<PlasmicCanvasHostProps> = (\n props\n) => {\n const { enableWebpackHmr } = props;\n const [node, setNode] = React.useState<React.ReactElement<any, any> | null>(\n null\n );\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n};\n\nif (root.__Sub == null) {\n // Creating a side effect here by logging, so that vite won't\n // ignore this block for whatever reason\n console.log(\"Plasmic: Setting up app host dependencies\");\n root.__Sub = {\n React,\n ReactDOM,\n setPlasmicRootNode,\n registerRenderErrorListener,\n repeatedElement,\n setRepeatedElementFn,\n PlasmicCanvasContext,\n };\n}\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nfunction registerRenderErrorListener(listener: RenderErrorListener) {\n renderErrorListeners.push(listener);\n return () => {\n const index = renderErrorListeners.indexOf(listener);\n if (index >= 0) {\n renderErrorListeners.splice(index, 1);\n }\n };\n}\n\ninterface ErrorBoundaryProps {\n children?: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error) {\n renderErrorListeners.forEach((listener) => listener(error));\n }\n\n render() {\n if (this.state.error) {\n return <div>Error: {`${this.state.error.message}`}</div>;\n } else {\n return this.props.children;\n }\n }\n}\n\nfunction DisableWebpackHmr() {\n if (process.env.NODE_ENV === \"production\") {\n return null;\n }\n return (\n <script\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n if (typeof window !== \"undefined\") {\n const RealEventSource = window.EventSource;\n window.EventSource = function(url, config) {\n if (/[^a-zA-Z]hmr($|[^a-zA-Z])/.test(url)) {\n console.warn(\"Plasmic: disabled EventSource request for\", url);\n return {\n onerror() {}, onmessage() {}, onopen() {}, close() {}\n };\n } else {\n return new RealEventSource(url, config);\n }\n }\n }\n `,\n }}\n ></script>\n );\n}\n","function isString(x: any): x is string {\n return typeof x === \"string\";\n}\n\ntype StringGen = string | (() => string);\n\nexport function ensure<T>(x: T | null | undefined, msg: StringGen = \"\"): T {\n if (x === null || x === undefined) {\n debugger;\n msg = (isString(msg) ? msg : msg()) || \"\";\n throw new Error(\n `Value must not be undefined or null${msg ? `- ${msg}` : \"\"}`\n );\n } else {\n return x;\n }\n}\n","import { useCallback, useState } from \"react\";\n\nexport default function useForceUpdate() {\n const [, setTick] = useState(0);\n const update = useCallback(() => {\n setTick((tick) => tick + 1);\n }, []);\n return update;\n}\n"],"names":["root","globalThis","__PlasmicFetcherRegistry","repeatedElement","isPrimary","elt","repeatedElementFn","__PlasmicComponentRegistry","Array","isArray","map","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","_root$__Sub","fn","__PlasmicHostVersion","rootChangeListeners","plasmicRootNode","value","val","_this","forEach","f","getPlasmicOrigin","x","msg","isString","Error","ensure","URL","location","hash","replace","searchParams","get","renderCount","PlasmicCanvasContext","React","_PlasmicCanvasHost","setTick","isFrameAttached","window","parent","isCanvas","_location$hash","match","isLive","_location$hash2","shouldRenderStudio","document","querySelector","forceUpdate","useState","useCallback","tick","push","index","indexOf","splice","script","plasmicOrigin","createElement","src","body","appendChild","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","ReactDOM","ErrorBoundary","key","Provider","href","origin","pathname","console","log","setPlasmicRootNode","node","set","registerRenderErrorListener","listener","renderErrorListeners","props","state","getDerivedStateFromError","error","componentDidCatch","render","this","message","children","DisableWebpackHmr","enableWebpackHmr","setNode","component","meta","fetcher"],"mappings":"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"}
1
+ {"version":3,"file":"host.cjs.production.min.js","sources":["../src/data.ts","../src/registerComponent.ts","../src/registerContext.ts","../src/repeatedElement.ts","../src/index.tsx","../src/lang-utils.ts","../src/useForceUpdate.ts"],"sourcesContent":["import { PrimitiveType } from \"./index\";\nconst root = globalThis as any;\n\nexport type Fetcher = (...args: any[]) => Promise<any>;\n\nexport interface FetcherMeta {\n /**\n * Any unique identifying string for this fetcher.\n */\n name: string;\n /**\n * The Studio-user-friendly display name.\n */\n displayName?: string;\n /**\n * The symbol to import from the importPath.\n */\n importName?: string;\n args: { name: string; type: PrimitiveType }[];\n returns: PrimitiveType;\n /**\n * Either the path to the fetcher relative to `rootDir` or the npm\n * package name\n */\n importPath: string;\n /**\n * Whether it's a default export or named export\n */\n isDefaultExport?: boolean;\n}\n\nexport interface FetcherRegistration {\n fetcher: Fetcher;\n meta: FetcherMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicFetcherRegistry: FetcherRegistration[];\n }\n}\n\nroot.__PlasmicFetcherRegistry = [];\n\nexport function registerFetcher(fetcher: Fetcher, meta: FetcherMeta) {\n root.__PlasmicFetcherRegistry.push({ fetcher, meta });\n}\n","import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\nexport type StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\nexport type NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\nexport type ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\nexport interface ModalProps {\n show?: boolean;\n children?: React.ReactNode;\n onClose: () => void;\n style?: CSSProperties;\n}\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n /**\n * Full screen modal component\n */\n FullscreenModal: React.ComponentType<ModalProps>;\n /**\n * Modal component for the side pane\n */\n SideModal: React.ComponentType<ModalProps>;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\nexport type SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n /**\n * Registered name of parent component, used for grouping related components.\n */\n parentComponentName?: string;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n","import {\n BooleanType,\n ChoiceType,\n CustomType,\n JSONLikeType,\n NumberType,\n StringType,\n SupportControlled,\n} from \"./registerComponent\";\n\nconst root = globalThis as any;\n\nexport type PropType<P> = SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | CustomType<P>\n>;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n StringType<P> | ChoiceType<P> | JSONLikeType<P> | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\nexport interface ContextMeta<P> {\n /**\n * Any unique string name used to identify that context. Each context\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the context in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the context properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the context in the generated code.\n * It can be the name of the package that contains the context, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the context is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n}\n\nexport interface ContextRegistration {\n component: React.ComponentType<any>;\n meta: ContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: ContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerContext<T extends React.ComponentType<any>>(\n component: T,\n meta: ContextMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicContextRegistry.push({ component, meta });\n}\n","import { cloneElement, isValidElement } from \"react\";\n\n/**\n * Allows a component from Plasmic Studio to be repeated.\n * `isPrimary` should be true for at most one instance of the component, and\n * indicates which copy of the element will be highlighted when the element is\n * selected in Studio.\n * If `isPrimary` is `false`, and `elt` is a React element (or an array of such),\n * it'll be cloned (using React.cloneElement) and ajusted if it's a component\n * from Plasmic Studio. Otherwise, if `elt` is not a React element, the original\n * value is returned.\n */\nexport default function repeatedElement<T>(isPrimary: boolean, elt: T): T {\n return repeatedElementFn(isPrimary, elt);\n}\n\nlet repeatedElementFn = <T>(isPrimary: boolean, elt: T): T => {\n if (isPrimary) {\n return elt;\n }\n if (Array.isArray(elt)) {\n return (elt.map((v) => repeatedElement(isPrimary, v)) as any) as T;\n }\n if (elt && isValidElement(elt) && typeof elt !== \"string\") {\n return (cloneElement(elt) as any) as T;\n }\n return elt;\n};\n\nconst root = globalThis as any;\nexport const setRepeatedElementFn: (fn: typeof repeatedElement) => void =\n root?.__Sub?.setRepeatedElementFn ??\n function (fn: typeof repeatedElement) {\n repeatedElementFn = fn;\n };\n","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerFetcher as unstable_registerFetcher } from \"./data\";\nimport { PlasmicElement } from \"./element-types\";\nimport { ensure } from \"./lang-utils\";\nimport registerComponent, {\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n} from \"./registerComponent\";\nimport registerContext, {\n ContextMeta,\n ContextRegistration,\n PropType as ContextPropType,\n} from \"./registerContext\";\nimport repeatedElement, { setRepeatedElementFn } from \"./repeatedElement\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\n\nexport { unstable_registerFetcher };\nexport { repeatedElement };\nexport {\n registerComponent,\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n};\nexport { registerContext, ContextMeta, ContextRegistration, ContextPropType };\nexport { PlasmicElement };\n\ndeclare global {\n interface Window {\n __PlasmicHostVersion: string;\n }\n}\n\nif (root.__PlasmicHostVersion == null) {\n root.__PlasmicHostVersion = \"2\";\n}\n\nconst rootChangeListeners: (() => void)[] = [];\nclass PlasmicRootNodeWrapper {\n constructor(private value: null | React.ReactElement) {}\n set = (val: null | React.ReactElement) => {\n this.value = val;\n rootChangeListeners.forEach(f => f());\n };\n get = () => this.value;\n}\n\nconst plasmicRootNode = new PlasmicRootNodeWrapper(null);\n\nfunction getPlasmicOrigin() {\n const params = new URL(`https://fakeurl/${location.hash.replace(/#/, \"?\")}`)\n .searchParams;\n return ensure(\n params.get(\"origin\"),\n \"Missing information from Plasmic window.\"\n );\n}\n\nfunction renderStudioIntoIframe() {\n const script = document.createElement(\"script\");\n const plasmicOrigin = getPlasmicOrigin();\n script.src = plasmicOrigin + \"/static/js/studio.js\";\n document.body.appendChild(script);\n}\n\nlet renderCount = 0;\nfunction setPlasmicRootNode(node: React.ReactElement | null) {\n // Keep track of renderCount, which we use as key to ErrorBoundary, so\n // we can reset the error on each render\n renderCount++;\n plasmicRootNode.set(node);\n}\n\n/**\n * React context to detect whether the component is rendered on Plasmic editor.\n */\nexport const PlasmicCanvasContext = React.createContext<boolean>(false);\n\nfunction _PlasmicCanvasHost() {\n // If window.parent is null, then this is a window whose containing iframe\n // has been detached from the DOM (for the top window, window.parent === window).\n // In that case, we shouldn't do anything. If window.parent is null, by the way,\n // location.hash will also be null.\n const isFrameAttached = !!window.parent;\n const isCanvas = !!location.hash?.match(/\\bcanvas=true\\b/);\n const isLive = !!location.hash?.match(/\\blive=true\\b/) || !isFrameAttached;\n const shouldRenderStudio =\n isFrameAttached &&\n !document.querySelector(\"#plasmic-studio-tag\") &&\n !isCanvas &&\n !isLive;\n const forceUpdate = useForceUpdate();\n React.useLayoutEffect(() => {\n rootChangeListeners.push(forceUpdate);\n return () => {\n const index = rootChangeListeners.indexOf(forceUpdate);\n if (index >= 0) {\n rootChangeListeners.splice(index, 1);\n }\n };\n }, [forceUpdate]);\n React.useEffect(() => {\n if (shouldRenderStudio && isFrameAttached && window.parent !== window) {\n renderStudioIntoIframe();\n }\n }, [shouldRenderStudio, isFrameAttached]);\n React.useEffect(() => {\n if (!shouldRenderStudio && !document.querySelector(\"#getlibs\") && isLive) {\n const scriptElt = document.createElement(\"script\");\n scriptElt.id = \"getlibs\";\n scriptElt.src = getPlasmicOrigin() + \"/static/js/getlibs.js\";\n scriptElt.async = false;\n scriptElt.onload = () => {\n (window as any).__GetlibsReadyResolver?.();\n };\n document.head.append(scriptElt);\n }\n }, [shouldRenderStudio]);\n if (!isFrameAttached) {\n return null;\n }\n if (isCanvas || isLive) {\n let appDiv = document.querySelector(\"#plasmic-app.__wab_user-body\");\n if (!appDiv) {\n appDiv = document.createElement(\"div\");\n appDiv.id = \"plasmic-app\";\n appDiv.classList.add(\"__wab_user-body\");\n document.body.appendChild(appDiv);\n }\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={isCanvas}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <p>\n Your app is ready to host Plasmic Studio! <br /> <br />\n On the <a href=\"https://studio.plasmic.app/\">Dashboard</a>, click on the{\" \"}\n <i>Config</i> button, and set{\" \"}\n <code>{location.origin + location.pathname}</code> as the host URL.\n <br />\n <br />\n You can find more information about app-hosting{\" \"}\n <a href=\"https://www.plasmic.app/learn/app-hosting/\">here</a>.\n </p>\n );\n }\n return null;\n}\n\ninterface PlasmicCanvasHostProps {\n /**\n * Webpack hmr uses EventSource to\tlisten to hot reloads, but that\n * resultsin a persistent\tconnection from\teach window. In Plasmic\n * Studio, if a project is configured to use app-hosting with a\n * nextjs or gatsby server running in dev mode, each artboard will\n * be holding a persistent connection to the dev server.\n * Because browsers\thave a limit to\thow many connections can\n * be held\tat a time by domain, this means\tafter X\tartboards, new\n * artboards will freeze and not load.\n *\n * By default, <PlasmicCanvasHost /> will globally mutate\n * window.EventSource to avoid using EventSource for HMR, which you\n * typically don't need for your custom host page. If you do still\n * want to retain HRM, then youc an pass enableWebpackHmr={true}.\n */\n enableWebpackHmr?: boolean;\n}\n\nexport const PlasmicCanvasHost: React.FunctionComponent<PlasmicCanvasHostProps> = props => {\n const { enableWebpackHmr } = props;\n const [node, setNode] = React.useState<React.ReactElement<any, any> | null>(\n null\n );\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n};\n\nif (root.__Sub == null) {\n // Creating a side effect here by logging, so that vite won't\n // ignore this block for whatever reason\n console.log(\"Plasmic: Setting up app host dependencies\");\n root.__Sub = {\n React,\n ReactDOM,\n setPlasmicRootNode,\n registerRenderErrorListener,\n repeatedElement,\n setRepeatedElementFn,\n PlasmicCanvasContext,\n };\n}\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nfunction registerRenderErrorListener(listener: RenderErrorListener) {\n renderErrorListeners.push(listener);\n return () => {\n const index = renderErrorListeners.indexOf(listener);\n if (index >= 0) {\n renderErrorListeners.splice(index, 1);\n }\n };\n}\n\ninterface ErrorBoundaryProps {\n children?: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error) {\n renderErrorListeners.forEach(listener => listener(error));\n }\n\n render() {\n if (this.state.error) {\n return <div>Error: {`${this.state.error.message}`}</div>;\n } else {\n return this.props.children;\n }\n }\n}\n\nfunction DisableWebpackHmr() {\n if (process.env.NODE_ENV === \"production\") {\n return null;\n }\n return (\n <script\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n if (typeof window !== \"undefined\") {\n const RealEventSource = window.EventSource;\n window.EventSource = function(url, config) {\n if (/[^a-zA-Z]hmr($|[^a-zA-Z])/.test(url)) {\n console.warn(\"Plasmic: disabled EventSource request for\", url);\n return {\n onerror() {}, onmessage() {}, onopen() {}, close() {}\n };\n } else {\n return new RealEventSource(url, config);\n }\n }\n }\n `,\n }}\n ></script>\n );\n}\n","function isString(x: any): x is string {\n return typeof x === \"string\";\n}\n\ntype StringGen = string | (() => string);\n\nexport function ensure<T>(x: T | null | undefined, msg: StringGen = \"\"): T {\n if (x === null || x === undefined) {\n debugger;\n msg = (isString(msg) ? msg : msg()) || \"\";\n throw new Error(\n `Value must not be undefined or null${msg ? `- ${msg}` : \"\"}`\n );\n } else {\n return x;\n }\n}\n","import { useCallback, useState } from \"react\";\n\nexport default function useForceUpdate() {\n const [, setTick] = useState(0);\n const update = useCallback(() => {\n setTick((tick) => tick + 1);\n }, []);\n return update;\n}\n"],"names":["root","globalThis","__PlasmicFetcherRegistry","__PlasmicComponentRegistry","repeatedElement","isPrimary","elt","repeatedElementFn","__PlasmicContextRegistry","Array","isArray","map","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","_root$__Sub","fn","__PlasmicHostVersion","rootChangeListeners","plasmicRootNode","value","val","_this","forEach","f","getPlasmicOrigin","x","msg","isString","Error","ensure","URL","location","hash","replace","searchParams","get","renderCount","PlasmicCanvasContext","React","_PlasmicCanvasHost","setTick","isFrameAttached","window","parent","isCanvas","_location$hash","match","isLive","_location$hash2","shouldRenderStudio","document","querySelector","forceUpdate","useState","useCallback","tick","push","index","indexOf","splice","script","plasmicOrigin","createElement","src","body","appendChild","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","ReactDOM","ErrorBoundary","key","Provider","href","origin","pathname","console","log","setPlasmicRootNode","node","set","registerRenderErrorListener","listener","renderErrorListeners","props","state","getDerivedStateFromError","error","componentDidCatch","render","this","message","children","DisableWebpackHmr","enableWebpackHmr","setNode","component","meta","fetcher"],"mappings":"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"}
package/dist/host.esm.js CHANGED
@@ -60,6 +60,19 @@ function registerComponent(component, meta) {
60
60
  });
61
61
  }
62
62
 
63
+ var root$2 = globalThis;
64
+
65
+ if (root$2.__PlasmicContextRegistry == null) {
66
+ root$2.__PlasmicContextRegistry = [];
67
+ }
68
+
69
+ function registerContext(component, meta) {
70
+ root$2.__PlasmicContextRegistry.push({
71
+ component: component,
72
+ meta: meta
73
+ });
74
+ }
75
+
63
76
  var _root$__Sub$setRepeat, _root$__Sub;
64
77
  /**
65
78
  * Allows a component from Plasmic Studio to be repeated.
@@ -94,8 +107,8 @@ var repeatedElementFn = function repeatedElementFn(isPrimary, elt) {
94
107
  return elt;
95
108
  };
96
109
 
97
- var root$2 = globalThis;
98
- var setRepeatedElementFn = (_root$__Sub$setRepeat = root$2 == null ? void 0 : (_root$__Sub = root$2.__Sub) == null ? void 0 : _root$__Sub.setRepeatedElementFn) != null ? _root$__Sub$setRepeat : function (fn) {
110
+ var root$3 = globalThis;
111
+ var setRepeatedElementFn = (_root$__Sub$setRepeat = root$3 == null ? void 0 : (_root$__Sub = root$3.__Sub) == null ? void 0 : _root$__Sub.setRepeatedElementFn) != null ? _root$__Sub$setRepeat : function (fn) {
99
112
  repeatedElementFn = fn;
100
113
  };
101
114
 
@@ -111,10 +124,10 @@ function useForceUpdate() {
111
124
  return update;
112
125
  }
113
126
 
114
- var root$3 = globalThis;
127
+ var root$4 = globalThis;
115
128
 
116
- if (root$3.__PlasmicHostVersion == null) {
117
- root$3.__PlasmicHostVersion = "2";
129
+ if (root$4.__PlasmicHostVersion == null) {
130
+ root$4.__PlasmicHostVersion = "2";
118
131
  }
119
132
 
120
133
  var rootChangeListeners = [];
@@ -252,11 +265,11 @@ var PlasmicCanvasHost = function PlasmicCanvasHost(props) {
252
265
  return createElement(Fragment, null, !enableWebpackHmr && createElement(DisableWebpackHmr, null), node);
253
266
  };
254
267
 
255
- if (root$3.__Sub == null) {
268
+ if (root$4.__Sub == null) {
256
269
  // Creating a side effect here by logging, so that vite won't
257
270
  // ignore this block for whatever reason
258
271
  console.log("Plasmic: Setting up app host dependencies");
259
- root$3.__Sub = {
272
+ root$4.__Sub = {
260
273
  React: React,
261
274
  ReactDOM: ReactDOM,
262
275
  setPlasmicRootNode: setPlasmicRootNode,
@@ -329,5 +342,5 @@ function DisableWebpackHmr() {
329
342
  });
330
343
  }
331
344
 
332
- export { PlasmicCanvasContext, PlasmicCanvasHost, registerComponent, repeatedElement, registerFetcher as unstable_registerFetcher };
345
+ export { PlasmicCanvasContext, PlasmicCanvasHost, registerComponent, registerContext, repeatedElement, registerFetcher as unstable_registerFetcher };
333
346
  //# sourceMappingURL=host.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.esm.js","sources":["../src/data.ts","../src/lang-utils.ts","../src/registerComponent.ts","../src/repeatedElement.ts","../src/useForceUpdate.ts","../src/index.tsx"],"sourcesContent":["import { PrimitiveType } from \"./index\";\nconst root = globalThis as any;\n\nexport type Fetcher = (...args: any[]) => Promise<any>;\n\nexport interface FetcherMeta {\n /**\n * Any unique identifying string for this fetcher.\n */\n name: string;\n /**\n * The Studio-user-friendly display name.\n */\n displayName?: string;\n /**\n * The symbol to import from the importPath.\n */\n importName?: string;\n args: { name: string; type: PrimitiveType }[];\n returns: PrimitiveType;\n /**\n * Either the path to the fetcher relative to `rootDir` or the npm\n * package name\n */\n importPath: string;\n /**\n * Whether it's a default export or named export\n */\n isDefaultExport?: boolean;\n}\n\nexport interface FetcherRegistration {\n fetcher: Fetcher;\n meta: FetcherMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicFetcherRegistry: FetcherRegistration[];\n }\n}\n\nroot.__PlasmicFetcherRegistry = [];\n\nexport function registerFetcher(fetcher: Fetcher, meta: FetcherMeta) {\n root.__PlasmicFetcherRegistry.push({ fetcher, meta });\n}\n","function isString(x: any): x is string {\n return typeof x === \"string\";\n}\n\ntype StringGen = string | (() => string);\n\nexport function ensure<T>(x: T | null | undefined, msg: StringGen = \"\"): T {\n if (x === null || x === undefined) {\n debugger;\n msg = (isString(msg) ? msg : msg()) || \"\";\n throw new Error(\n `Value must not be undefined or null${msg ? `- ${msg}` : \"\"}`\n );\n } else {\n return x;\n }\n}\n","import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\ntype StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\ntype BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\ntype NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\ntype JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\ntype ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\ntype SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n","import { cloneElement, isValidElement } from \"react\";\n\n/**\n * Allows a component from Plasmic Studio to be repeated.\n * `isPrimary` should be true for at most one instance of the component, and\n * indicates which copy of the element will be highlighted when the element is\n * selected in Studio.\n * If `isPrimary` is `false`, and `elt` is a React element (or an array of such),\n * it'll be cloned (using React.cloneElement) and ajusted if it's a component\n * from Plasmic Studio. Otherwise, if `elt` is not a React element, the original\n * value is returned.\n */\nexport default function repeatedElement<T>(isPrimary: boolean, elt: T): T {\n return repeatedElementFn(isPrimary, elt);\n}\n\nlet repeatedElementFn = <T>(isPrimary: boolean, elt: T): T => {\n if (isPrimary) {\n return elt;\n }\n if (Array.isArray(elt)) {\n return (elt.map((v) => repeatedElement(isPrimary, v)) as any) as T;\n }\n if (elt && isValidElement(elt) && typeof elt !== \"string\") {\n return (cloneElement(elt) as any) as T;\n }\n return elt;\n};\n\nconst root = globalThis as any;\nexport const setRepeatedElementFn: (fn: typeof repeatedElement) => void =\n root?.__Sub?.setRepeatedElementFn ??\n function (fn: typeof repeatedElement) {\n repeatedElementFn = fn;\n };\n","import { useCallback, useState } from \"react\";\n\nexport default function useForceUpdate() {\n const [, setTick] = useState(0);\n const update = useCallback(() => {\n setTick((tick) => tick + 1);\n }, []);\n return update;\n}\n","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerFetcher as unstable_registerFetcher } from \"./data\";\nimport { PlasmicElement } from \"./element-types\";\nimport { ensure } from \"./lang-utils\";\nimport registerComponent, {\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n} from \"./registerComponent\";\nimport repeatedElement, { setRepeatedElementFn } from \"./repeatedElement\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\n\nexport { unstable_registerFetcher };\nexport { repeatedElement };\nexport {\n registerComponent,\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n};\nexport { PlasmicElement };\n\ndeclare global {\n interface Window {\n __PlasmicHostVersion: string;\n }\n}\n\nif (root.__PlasmicHostVersion == null) {\n root.__PlasmicHostVersion = \"2\";\n}\n\nconst rootChangeListeners: (() => void)[] = [];\nclass PlasmicRootNodeWrapper {\n constructor(private value: null | React.ReactElement) {}\n set = (val: null | React.ReactElement) => {\n this.value = val;\n rootChangeListeners.forEach((f) => f());\n };\n get = () => this.value;\n}\n\nconst plasmicRootNode = new PlasmicRootNodeWrapper(null);\n\nfunction getPlasmicOrigin() {\n const params = new URL(`https://fakeurl/${location.hash.replace(/#/, \"?\")}`)\n .searchParams;\n return ensure(\n params.get(\"origin\"),\n \"Missing information from Plasmic window.\"\n );\n}\n\nfunction renderStudioIntoIframe() {\n const script = document.createElement(\"script\");\n const plasmicOrigin = getPlasmicOrigin();\n script.src = plasmicOrigin + \"/static/js/studio.js\";\n document.body.appendChild(script);\n}\n\nlet renderCount = 0;\nfunction setPlasmicRootNode(node: React.ReactElement | null) {\n // Keep track of renderCount, which we use as key to ErrorBoundary, so\n // we can reset the error on each render\n renderCount++;\n plasmicRootNode.set(node);\n}\n\n/**\n * React context to detect whether the component is rendered on Plasmic editor.\n */\nexport const PlasmicCanvasContext = React.createContext<boolean>(false);\n\nfunction _PlasmicCanvasHost() {\n // If window.parent is null, then this is a window whose containing iframe\n // has been detached from the DOM (for the top window, window.parent === window).\n // In that case, we shouldn't do anything. If window.parent is null, by the way,\n // location.hash will also be null.\n const isFrameAttached = !!window.parent;\n const isCanvas = !!location.hash?.match(/\\bcanvas=true\\b/);\n const isLive = !!location.hash?.match(/\\blive=true\\b/) || !isFrameAttached;\n const shouldRenderStudio =\n isFrameAttached &&\n !document.querySelector(\"#plasmic-studio-tag\") &&\n !isCanvas &&\n !isLive;\n const forceUpdate = useForceUpdate();\n React.useLayoutEffect(() => {\n rootChangeListeners.push(forceUpdate);\n return () => {\n const index = rootChangeListeners.indexOf(forceUpdate);\n if (index >= 0) {\n rootChangeListeners.splice(index, 1);\n }\n };\n }, [forceUpdate]);\n React.useEffect(() => {\n if (shouldRenderStudio && isFrameAttached && window.parent !== window) {\n renderStudioIntoIframe();\n }\n }, [shouldRenderStudio, isFrameAttached]);\n React.useEffect(() => {\n if (!shouldRenderStudio && !document.querySelector(\"#getlibs\") && isLive) {\n const scriptElt = document.createElement(\"script\");\n scriptElt.id = \"getlibs\";\n scriptElt.src = getPlasmicOrigin() + \"/static/js/getlibs.js\";\n scriptElt.async = false;\n scriptElt.onload = () => {\n (window as any).__GetlibsReadyResolver?.();\n };\n document.head.append(scriptElt);\n }\n }, [shouldRenderStudio]);\n if (!isFrameAttached) {\n return null;\n }\n if (isCanvas || isLive) {\n let appDiv = document.querySelector(\"#plasmic-app.__wab_user-body\");\n if (!appDiv) {\n appDiv = document.createElement(\"div\");\n appDiv.id = \"plasmic-app\";\n appDiv.classList.add(\"__wab_user-body\");\n document.body.appendChild(appDiv);\n }\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={isCanvas}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <p>\n Your app is ready to host Plasmic Studio! <br /> <br />\n On the <a href=\"https://studio.plasmic.app/\">Dashboard</a>, click on the{\" \"}\n <i>Config</i> button, and set{\" \"}\n <code>{location.origin + location.pathname}</code> as the host URL.\n <br />\n <br />\n You can find more information about app-hosting{\" \"}\n <a href=\"https://www.plasmic.app/learn/app-hosting/\">here</a>.\n </p>\n );\n }\n return null;\n}\n\ninterface PlasmicCanvasHostProps {\n /**\n * Webpack hmr uses EventSource to\tlisten to hot reloads, but that\n * resultsin a persistent\tconnection from\teach window. In Plasmic\n * Studio, if a project is configured to use app-hosting with a\n * nextjs or gatsby server running in dev mode, each artboard will\n * be holding a persistent connection to the dev server.\n * Because browsers\thave a limit to\thow many connections can\n * be held\tat a time by domain, this means\tafter X\tartboards, new\n * artboards will freeze and not load.\n *\n * By default, <PlasmicCanvasHost /> will globally mutate\n * window.EventSource to avoid using EventSource for HMR, which you\n * typically don't need for your custom host page. If you do still\n * want to retain HRM, then youc an pass enableWebpackHmr={true}.\n */\n enableWebpackHmr?: boolean;\n}\n\nexport const PlasmicCanvasHost: React.FunctionComponent<PlasmicCanvasHostProps> = (\n props\n) => {\n const { enableWebpackHmr } = props;\n const [node, setNode] = React.useState<React.ReactElement<any, any> | null>(\n null\n );\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n};\n\nif (root.__Sub == null) {\n // Creating a side effect here by logging, so that vite won't\n // ignore this block for whatever reason\n console.log(\"Plasmic: Setting up app host dependencies\");\n root.__Sub = {\n React,\n ReactDOM,\n setPlasmicRootNode,\n registerRenderErrorListener,\n repeatedElement,\n setRepeatedElementFn,\n PlasmicCanvasContext,\n };\n}\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nfunction registerRenderErrorListener(listener: RenderErrorListener) {\n renderErrorListeners.push(listener);\n return () => {\n const index = renderErrorListeners.indexOf(listener);\n if (index >= 0) {\n renderErrorListeners.splice(index, 1);\n }\n };\n}\n\ninterface ErrorBoundaryProps {\n children?: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error) {\n renderErrorListeners.forEach((listener) => listener(error));\n }\n\n render() {\n if (this.state.error) {\n return <div>Error: {`${this.state.error.message}`}</div>;\n } else {\n return this.props.children;\n }\n }\n}\n\nfunction DisableWebpackHmr() {\n if (process.env.NODE_ENV === \"production\") {\n return null;\n }\n return (\n <script\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n if (typeof window !== \"undefined\") {\n const RealEventSource = window.EventSource;\n window.EventSource = function(url, config) {\n if (/[^a-zA-Z]hmr($|[^a-zA-Z])/.test(url)) {\n console.warn(\"Plasmic: disabled EventSource request for\", url);\n return {\n onerror() {}, onmessage() {}, onopen() {}, close() {}\n };\n } else {\n return new RealEventSource(url, config);\n }\n }\n }\n `,\n }}\n ></script>\n );\n}\n"],"names":["root","globalThis","__PlasmicFetcherRegistry","registerFetcher","fetcher","meta","push","isString","x","ensure","msg","undefined","Error","__PlasmicComponentRegistry","registerComponent","component","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","map","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","fn","useForceUpdate","useState","setTick","update","useCallback","tick","__PlasmicHostVersion","rootChangeListeners","PlasmicRootNodeWrapper","value","val","forEach","f","plasmicRootNode","getPlasmicOrigin","params","URL","location","hash","replace","searchParams","get","renderStudioIntoIframe","script","document","createElement","plasmicOrigin","src","body","appendChild","renderCount","setPlasmicRootNode","node","set","PlasmicCanvasContext","React","_PlasmicCanvasHost","isFrameAttached","window","parent","isCanvas","match","isLive","shouldRenderStudio","querySelector","forceUpdate","index","indexOf","splice","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","ReactDOM","ErrorBoundary","key","Provider","href","origin","pathname","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","console","log","registerRenderErrorListener","renderErrorListeners","listener","state","getDerivedStateFromError","error","componentDidCatch","render","message","children","process","env","NODE_ENV","type","dangerouslySetInnerHTML","__html"],"mappings":"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"}
1
+ {"version":3,"file":"host.esm.js","sources":["../src/data.ts","../src/lang-utils.ts","../src/registerComponent.ts","../src/registerContext.ts","../src/repeatedElement.ts","../src/useForceUpdate.ts","../src/index.tsx"],"sourcesContent":["import { PrimitiveType } from \"./index\";\nconst root = globalThis as any;\n\nexport type Fetcher = (...args: any[]) => Promise<any>;\n\nexport interface FetcherMeta {\n /**\n * Any unique identifying string for this fetcher.\n */\n name: string;\n /**\n * The Studio-user-friendly display name.\n */\n displayName?: string;\n /**\n * The symbol to import from the importPath.\n */\n importName?: string;\n args: { name: string; type: PrimitiveType }[];\n returns: PrimitiveType;\n /**\n * Either the path to the fetcher relative to `rootDir` or the npm\n * package name\n */\n importPath: string;\n /**\n * Whether it's a default export or named export\n */\n isDefaultExport?: boolean;\n}\n\nexport interface FetcherRegistration {\n fetcher: Fetcher;\n meta: FetcherMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicFetcherRegistry: FetcherRegistration[];\n }\n}\n\nroot.__PlasmicFetcherRegistry = [];\n\nexport function registerFetcher(fetcher: Fetcher, meta: FetcherMeta) {\n root.__PlasmicFetcherRegistry.push({ fetcher, meta });\n}\n","function isString(x: any): x is string {\n return typeof x === \"string\";\n}\n\ntype StringGen = string | (() => string);\n\nexport function ensure<T>(x: T | null | undefined, msg: StringGen = \"\"): T {\n if (x === null || x === undefined) {\n debugger;\n msg = (isString(msg) ? msg : msg()) || \"\";\n throw new Error(\n `Value must not be undefined or null${msg ? `- ${msg}` : \"\"}`\n );\n } else {\n return x;\n }\n}\n","import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\nexport type StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\nexport type NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\nexport type ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\nexport interface ModalProps {\n show?: boolean;\n children?: React.ReactNode;\n onClose: () => void;\n style?: CSSProperties;\n}\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n /**\n * Full screen modal component\n */\n FullscreenModal: React.ComponentType<ModalProps>;\n /**\n * Modal component for the side pane\n */\n SideModal: React.ComponentType<ModalProps>;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\nexport type SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n /**\n * Registered name of parent component, used for grouping related components.\n */\n parentComponentName?: string;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n","import {\n BooleanType,\n ChoiceType,\n CustomType,\n JSONLikeType,\n NumberType,\n StringType,\n SupportControlled,\n} from \"./registerComponent\";\n\nconst root = globalThis as any;\n\nexport type PropType<P> = SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | CustomType<P>\n>;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n StringType<P> | ChoiceType<P> | JSONLikeType<P> | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\nexport interface ContextMeta<P> {\n /**\n * Any unique string name used to identify that context. Each context\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the context in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the context properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the context in the generated code.\n * It can be the name of the package that contains the context, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the context is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n}\n\nexport interface ContextRegistration {\n component: React.ComponentType<any>;\n meta: ContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: ContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerContext<T extends React.ComponentType<any>>(\n component: T,\n meta: ContextMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicContextRegistry.push({ component, meta });\n}\n","import { cloneElement, isValidElement } from \"react\";\n\n/**\n * Allows a component from Plasmic Studio to be repeated.\n * `isPrimary` should be true for at most one instance of the component, and\n * indicates which copy of the element will be highlighted when the element is\n * selected in Studio.\n * If `isPrimary` is `false`, and `elt` is a React element (or an array of such),\n * it'll be cloned (using React.cloneElement) and ajusted if it's a component\n * from Plasmic Studio. Otherwise, if `elt` is not a React element, the original\n * value is returned.\n */\nexport default function repeatedElement<T>(isPrimary: boolean, elt: T): T {\n return repeatedElementFn(isPrimary, elt);\n}\n\nlet repeatedElementFn = <T>(isPrimary: boolean, elt: T): T => {\n if (isPrimary) {\n return elt;\n }\n if (Array.isArray(elt)) {\n return (elt.map((v) => repeatedElement(isPrimary, v)) as any) as T;\n }\n if (elt && isValidElement(elt) && typeof elt !== \"string\") {\n return (cloneElement(elt) as any) as T;\n }\n return elt;\n};\n\nconst root = globalThis as any;\nexport const setRepeatedElementFn: (fn: typeof repeatedElement) => void =\n root?.__Sub?.setRepeatedElementFn ??\n function (fn: typeof repeatedElement) {\n repeatedElementFn = fn;\n };\n","import { useCallback, useState } from \"react\";\n\nexport default function useForceUpdate() {\n const [, setTick] = useState(0);\n const update = useCallback(() => {\n setTick((tick) => tick + 1);\n }, []);\n return update;\n}\n","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerFetcher as unstable_registerFetcher } from \"./data\";\nimport { PlasmicElement } from \"./element-types\";\nimport { ensure } from \"./lang-utils\";\nimport registerComponent, {\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n} from \"./registerComponent\";\nimport registerContext, {\n ContextMeta,\n ContextRegistration,\n PropType as ContextPropType,\n} from \"./registerContext\";\nimport repeatedElement, { setRepeatedElementFn } from \"./repeatedElement\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\n\nexport { unstable_registerFetcher };\nexport { repeatedElement };\nexport {\n registerComponent,\n ComponentMeta,\n ComponentRegistration,\n ComponentTemplates,\n PrimitiveType,\n PropType,\n};\nexport { registerContext, ContextMeta, ContextRegistration, ContextPropType };\nexport { PlasmicElement };\n\ndeclare global {\n interface Window {\n __PlasmicHostVersion: string;\n }\n}\n\nif (root.__PlasmicHostVersion == null) {\n root.__PlasmicHostVersion = \"2\";\n}\n\nconst rootChangeListeners: (() => void)[] = [];\nclass PlasmicRootNodeWrapper {\n constructor(private value: null | React.ReactElement) {}\n set = (val: null | React.ReactElement) => {\n this.value = val;\n rootChangeListeners.forEach(f => f());\n };\n get = () => this.value;\n}\n\nconst plasmicRootNode = new PlasmicRootNodeWrapper(null);\n\nfunction getPlasmicOrigin() {\n const params = new URL(`https://fakeurl/${location.hash.replace(/#/, \"?\")}`)\n .searchParams;\n return ensure(\n params.get(\"origin\"),\n \"Missing information from Plasmic window.\"\n );\n}\n\nfunction renderStudioIntoIframe() {\n const script = document.createElement(\"script\");\n const plasmicOrigin = getPlasmicOrigin();\n script.src = plasmicOrigin + \"/static/js/studio.js\";\n document.body.appendChild(script);\n}\n\nlet renderCount = 0;\nfunction setPlasmicRootNode(node: React.ReactElement | null) {\n // Keep track of renderCount, which we use as key to ErrorBoundary, so\n // we can reset the error on each render\n renderCount++;\n plasmicRootNode.set(node);\n}\n\n/**\n * React context to detect whether the component is rendered on Plasmic editor.\n */\nexport const PlasmicCanvasContext = React.createContext<boolean>(false);\n\nfunction _PlasmicCanvasHost() {\n // If window.parent is null, then this is a window whose containing iframe\n // has been detached from the DOM (for the top window, window.parent === window).\n // In that case, we shouldn't do anything. If window.parent is null, by the way,\n // location.hash will also be null.\n const isFrameAttached = !!window.parent;\n const isCanvas = !!location.hash?.match(/\\bcanvas=true\\b/);\n const isLive = !!location.hash?.match(/\\blive=true\\b/) || !isFrameAttached;\n const shouldRenderStudio =\n isFrameAttached &&\n !document.querySelector(\"#plasmic-studio-tag\") &&\n !isCanvas &&\n !isLive;\n const forceUpdate = useForceUpdate();\n React.useLayoutEffect(() => {\n rootChangeListeners.push(forceUpdate);\n return () => {\n const index = rootChangeListeners.indexOf(forceUpdate);\n if (index >= 0) {\n rootChangeListeners.splice(index, 1);\n }\n };\n }, [forceUpdate]);\n React.useEffect(() => {\n if (shouldRenderStudio && isFrameAttached && window.parent !== window) {\n renderStudioIntoIframe();\n }\n }, [shouldRenderStudio, isFrameAttached]);\n React.useEffect(() => {\n if (!shouldRenderStudio && !document.querySelector(\"#getlibs\") && isLive) {\n const scriptElt = document.createElement(\"script\");\n scriptElt.id = \"getlibs\";\n scriptElt.src = getPlasmicOrigin() + \"/static/js/getlibs.js\";\n scriptElt.async = false;\n scriptElt.onload = () => {\n (window as any).__GetlibsReadyResolver?.();\n };\n document.head.append(scriptElt);\n }\n }, [shouldRenderStudio]);\n if (!isFrameAttached) {\n return null;\n }\n if (isCanvas || isLive) {\n let appDiv = document.querySelector(\"#plasmic-app.__wab_user-body\");\n if (!appDiv) {\n appDiv = document.createElement(\"div\");\n appDiv.id = \"plasmic-app\";\n appDiv.classList.add(\"__wab_user-body\");\n document.body.appendChild(appDiv);\n }\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={isCanvas}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <p>\n Your app is ready to host Plasmic Studio! <br /> <br />\n On the <a href=\"https://studio.plasmic.app/\">Dashboard</a>, click on the{\" \"}\n <i>Config</i> button, and set{\" \"}\n <code>{location.origin + location.pathname}</code> as the host URL.\n <br />\n <br />\n You can find more information about app-hosting{\" \"}\n <a href=\"https://www.plasmic.app/learn/app-hosting/\">here</a>.\n </p>\n );\n }\n return null;\n}\n\ninterface PlasmicCanvasHostProps {\n /**\n * Webpack hmr uses EventSource to\tlisten to hot reloads, but that\n * resultsin a persistent\tconnection from\teach window. In Plasmic\n * Studio, if a project is configured to use app-hosting with a\n * nextjs or gatsby server running in dev mode, each artboard will\n * be holding a persistent connection to the dev server.\n * Because browsers\thave a limit to\thow many connections can\n * be held\tat a time by domain, this means\tafter X\tartboards, new\n * artboards will freeze and not load.\n *\n * By default, <PlasmicCanvasHost /> will globally mutate\n * window.EventSource to avoid using EventSource for HMR, which you\n * typically don't need for your custom host page. If you do still\n * want to retain HRM, then youc an pass enableWebpackHmr={true}.\n */\n enableWebpackHmr?: boolean;\n}\n\nexport const PlasmicCanvasHost: React.FunctionComponent<PlasmicCanvasHostProps> = props => {\n const { enableWebpackHmr } = props;\n const [node, setNode] = React.useState<React.ReactElement<any, any> | null>(\n null\n );\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n};\n\nif (root.__Sub == null) {\n // Creating a side effect here by logging, so that vite won't\n // ignore this block for whatever reason\n console.log(\"Plasmic: Setting up app host dependencies\");\n root.__Sub = {\n React,\n ReactDOM,\n setPlasmicRootNode,\n registerRenderErrorListener,\n repeatedElement,\n setRepeatedElementFn,\n PlasmicCanvasContext,\n };\n}\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nfunction registerRenderErrorListener(listener: RenderErrorListener) {\n renderErrorListeners.push(listener);\n return () => {\n const index = renderErrorListeners.indexOf(listener);\n if (index >= 0) {\n renderErrorListeners.splice(index, 1);\n }\n };\n}\n\ninterface ErrorBoundaryProps {\n children?: React.ReactNode;\n}\n\ninterface ErrorBoundaryState {\n error?: Error;\n}\n\nclass ErrorBoundary extends React.Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {};\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error) {\n renderErrorListeners.forEach(listener => listener(error));\n }\n\n render() {\n if (this.state.error) {\n return <div>Error: {`${this.state.error.message}`}</div>;\n } else {\n return this.props.children;\n }\n }\n}\n\nfunction DisableWebpackHmr() {\n if (process.env.NODE_ENV === \"production\") {\n return null;\n }\n return (\n <script\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n if (typeof window !== \"undefined\") {\n const RealEventSource = window.EventSource;\n window.EventSource = function(url, config) {\n if (/[^a-zA-Z]hmr($|[^a-zA-Z])/.test(url)) {\n console.warn(\"Plasmic: disabled EventSource request for\", url);\n return {\n onerror() {}, onmessage() {}, onopen() {}, close() {}\n };\n } else {\n return new RealEventSource(url, config);\n }\n }\n }\n `,\n }}\n ></script>\n );\n}\n"],"names":["root","globalThis","__PlasmicFetcherRegistry","registerFetcher","fetcher","meta","push","isString","x","ensure","msg","undefined","Error","__PlasmicComponentRegistry","registerComponent","component","__PlasmicContextRegistry","registerContext","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","map","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","fn","useForceUpdate","useState","setTick","update","useCallback","tick","__PlasmicHostVersion","rootChangeListeners","PlasmicRootNodeWrapper","value","val","forEach","f","plasmicRootNode","getPlasmicOrigin","params","URL","location","hash","replace","searchParams","get","renderStudioIntoIframe","script","document","createElement","plasmicOrigin","src","body","appendChild","renderCount","setPlasmicRootNode","node","set","PlasmicCanvasContext","React","_PlasmicCanvasHost","isFrameAttached","window","parent","isCanvas","match","isLive","shouldRenderStudio","querySelector","forceUpdate","index","indexOf","splice","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","ReactDOM","ErrorBoundary","key","Provider","href","origin","pathname","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","console","log","registerRenderErrorListener","renderErrorListeners","listener","state","getDerivedStateFromError","error","componentDidCatch","render","message","children","process","env","NODE_ENV","type","dangerouslySetInnerHTML","__html"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,10 +3,12 @@ import * as React from "react";
3
3
  import { registerFetcher as unstable_registerFetcher } from "./data";
4
4
  import { PlasmicElement } from "./element-types";
5
5
  import registerComponent, { ComponentMeta, ComponentRegistration, ComponentTemplates, PrimitiveType, PropType } from "./registerComponent";
6
+ import registerContext, { ContextMeta, ContextRegistration, PropType as ContextPropType } from "./registerContext";
6
7
  import repeatedElement from "./repeatedElement";
7
8
  export { unstable_registerFetcher };
8
9
  export { repeatedElement };
9
10
  export { registerComponent, ComponentMeta, ComponentRegistration, ComponentTemplates, PrimitiveType, PropType, };
11
+ export { registerContext, ContextMeta, ContextRegistration, ContextPropType };
10
12
  export { PlasmicElement };
11
13
  declare global {
12
14
  interface Window {
@@ -24,12 +24,12 @@ interface PropTypeBase<P> {
24
24
  description?: string;
25
25
  hidden?: ContextDependentConfig<P, boolean>;
26
26
  }
27
- declare type StringType<P> = "string" | ({
27
+ export declare type StringType<P> = "string" | ({
28
28
  type: "string";
29
29
  defaultValue?: string;
30
30
  defaultValueHint?: string;
31
31
  } & PropTypeBase<P>);
32
- declare type BooleanType<P> = "boolean" | ({
32
+ export declare type BooleanType<P> = "boolean" | ({
33
33
  type: "boolean";
34
34
  defaultValue?: boolean;
35
35
  defaultValueHint?: boolean;
@@ -39,7 +39,7 @@ interface NumberTypeBase<P> extends PropTypeBase<P> {
39
39
  defaultValue?: number;
40
40
  defaultValueHint?: number;
41
41
  }
42
- declare type NumberType<P> = "number" | (({
42
+ export declare type NumberType<P> = "number" | (({
43
43
  control?: "default";
44
44
  min?: number | ContextDependentConfig<P, number>;
45
45
  max?: number | ContextDependentConfig<P, number>;
@@ -49,7 +49,7 @@ declare type NumberType<P> = "number" | (({
49
49
  max: number | ContextDependentConfig<P, number>;
50
50
  step?: number | ContextDependentConfig<P, number>;
51
51
  }) & NumberTypeBase<P>);
52
- declare type JSONLikeType<P> = "object" | ({
52
+ export declare type JSONLikeType<P> = "object" | ({
53
53
  type: "object";
54
54
  /**
55
55
  * Expects a JSON-compatible value
@@ -67,7 +67,7 @@ interface ChoiceTypeBase<P> extends PropTypeBase<P> {
67
67
  value: string;
68
68
  }[]>;
69
69
  }
70
- declare type ChoiceType<P> = ({
70
+ export declare type ChoiceType<P> = ({
71
71
  defaultValue?: string;
72
72
  defaultValueHint?: string;
73
73
  multiSelect?: false;
@@ -76,6 +76,12 @@ declare type ChoiceType<P> = ({
76
76
  defaultValueHint?: string[];
77
77
  multiSelect: true;
78
78
  }) & ChoiceTypeBase<P>;
79
+ export interface ModalProps {
80
+ show?: boolean;
81
+ children?: React.ReactNode;
82
+ onClose: () => void;
83
+ style?: CSSProperties;
84
+ }
79
85
  interface CustomControlProps<P> {
80
86
  componentProps: P;
81
87
  /**
@@ -89,6 +95,14 @@ interface CustomControlProps<P> {
89
95
  * Sets the value to be passed to the prop. Expects a JSON-compatible value.
90
96
  */
91
97
  updateValue: (newVal: any) => void;
98
+ /**
99
+ * Full screen modal component
100
+ */
101
+ FullscreenModal: React.ComponentType<ModalProps>;
102
+ /**
103
+ * Modal component for the side pane
104
+ */
105
+ SideModal: React.ComponentType<ModalProps>;
92
106
  }
93
107
  export declare type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;
94
108
  export declare type CustomType<P> = CustomControl<P> | ({
@@ -126,7 +140,7 @@ declare type ControlTypeBase = {
126
140
  */
127
141
  uncontrolledProp?: string;
128
142
  };
129
- declare type SupportControlled<T> = Extract<T, String | CustomControl<any>> | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);
143
+ export declare type SupportControlled<T> = Extract<T, String | CustomControl<any>> | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);
130
144
  export declare type PropType<P> = SupportControlled<StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P> | ChoiceType<P> | ImageUrlType<P> | CustomType<P>> | SlotType;
131
145
  declare type RestrictPropType<T, P> = T extends string ? SupportControlled<StringType<P> | ChoiceType<P> | JSONLikeType<P> | ImageUrlType<P> | CustomType<P>> : T extends boolean ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>> : T extends number ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>> : PropType<P>;
132
146
  declare type DistributedKeyOf<T> = T extends any ? keyof T : never;
@@ -198,6 +212,10 @@ export interface ComponentMeta<P> {
198
212
  * Component templates to start with on Plasmic.
199
213
  */
200
214
  templates?: ComponentTemplates<P>;
215
+ /**
216
+ * Registered name of parent component, used for grouping related components.
217
+ */
218
+ parentComponentName?: string;
201
219
  }
202
220
  export interface ComponentRegistration {
203
221
  component: React.ComponentType<any>;
@@ -0,0 +1,61 @@
1
+ /// <reference types="react" />
2
+ import { BooleanType, ChoiceType, CustomType, JSONLikeType, NumberType, StringType, SupportControlled } from "./registerComponent";
3
+ export declare type PropType<P> = SupportControlled<StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P> | ChoiceType<P> | CustomType<P>>;
4
+ declare type RestrictPropType<T, P> = T extends string ? SupportControlled<StringType<P> | ChoiceType<P> | JSONLikeType<P> | CustomType<P>> : T extends boolean ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>> : T extends number ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>> : PropType<P>;
5
+ declare type DistributedKeyOf<T> = T extends any ? keyof T : never;
6
+ export interface ContextMeta<P> {
7
+ /**
8
+ * Any unique string name used to identify that context. Each context
9
+ * should be registered with a different `meta.name`, even if they have the
10
+ * same name in the code.
11
+ */
12
+ name: string;
13
+ /**
14
+ * The name to be displayed for the context in Studio. Optional: if not
15
+ * specified, `meta.name` is used.
16
+ */
17
+ displayName?: string;
18
+ /**
19
+ * The javascript name to be used when generating code. Optional: if not
20
+ * provided, `meta.name` is used.
21
+ */
22
+ importName?: string;
23
+ /**
24
+ * An object describing the context properties to be used in Studio.
25
+ * For each `prop`, there should be an entry `meta.props[prop]` describing
26
+ * its type.
27
+ */
28
+ props: {
29
+ [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P>;
30
+ } & {
31
+ [prop: string]: PropType<P>;
32
+ };
33
+ /**
34
+ * The path to be used when importing the context in the generated code.
35
+ * It can be the name of the package that contains the context, or the path
36
+ * to the file in the project (relative to the root directory).
37
+ */
38
+ importPath: string;
39
+ /**
40
+ * Whether the context is the default export from that path. Optional: if
41
+ * not specified, it's considered `false`.
42
+ */
43
+ isDefaultExport?: boolean;
44
+ /**
45
+ * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`
46
+ * to interact with components, so it's not used in the generated code.
47
+ * Optional: If not provided, the usual `ref` is used.
48
+ */
49
+ refProp?: string;
50
+ }
51
+ export interface ContextRegistration {
52
+ component: React.ComponentType<any>;
53
+ meta: ContextMeta<any>;
54
+ }
55
+ declare global {
56
+ interface Window {
57
+ __PlasmicContextRegistry: ContextRegistration[];
58
+ }
59
+ }
60
+ export default function registerContext<T extends React.ComponentType<any>>(component: T, meta: ContextMeta<React.ComponentProps<T>>): void;
61
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasmicapp/host",
3
- "version": "0.0.48",
3
+ "version": "1.0.1",
4
4
  "description": "plasmic library for app hosting",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "analyze": "size-limit --why"
30
30
  },
31
31
  "dependencies": {
32
- "@plasmicapp/preamble": "0.0.32",
32
+ "@plasmicapp/preamble": "0.0.36",
33
33
  "window-or-global": "^1.0.1"
34
34
  },
35
35
  "devDependencies": {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/registerComponent.ts"],"sourcesContent":["import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\ntype StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\ntype BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\ntype NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\ntype JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\ntype ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\ntype SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n"],"names":[],"mappings":";;;;AAMA,IAAM,IAAI,GAAG,UAAiB,CAAC;AA6R/B,IAAI,IAAI,CAAC,0BAA0B,IAAI,IAAI,EAAE;IAC3C,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;CACtC;SAEuB,iBAAiB,CACvC,SAAY,EACZ,IAA4C;IAE5C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,SAAS,WAAA,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;AAC5D;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/registerComponent.ts"],"sourcesContent":["import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\nexport type StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\nexport type NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\nexport type ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\nexport interface ModalProps {\n show?: boolean;\n children?: React.ReactNode;\n onClose: () => void;\n style?: CSSProperties;\n}\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n /**\n * Full screen modal component\n */\n FullscreenModal: React.ComponentType<ModalProps>;\n /**\n * Modal component for the side pane\n */\n SideModal: React.ComponentType<ModalProps>;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\nexport type SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n /**\n * Registered name of parent component, used for grouping related components.\n */\n parentComponentName?: string;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n"],"names":[],"mappings":";;;;AAMA,IAAM,IAAI,GAAG,UAAiB,CAAC;AAgT/B,IAAI,IAAI,CAAC,0BAA0B,IAAI,IAAI,EAAE;IAC3C,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;CACtC;SAEuB,iBAAiB,CACvC,SAAY,EACZ,IAA4C;IAE5C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,SAAS,WAAA,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;AAC5D;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/registerComponent.ts"],"sourcesContent":["import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\ntype StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\ntype BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\ntype NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\ntype JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\ntype ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\ntype SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n"],"names":[],"mappings":"AAMA,IAAM,IAAI,GAAG,UAAiB,CAAC;AA6R/B,IAAI,IAAI,CAAC,0BAA0B,IAAI,IAAI,EAAE;IAC3C,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;CACtC;SAEuB,iBAAiB,CACvC,SAAY,EACZ,IAA4C;IAE5C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,SAAS,WAAA,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;AAC5D;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/registerComponent.ts"],"sourcesContent":["import {\n CodeComponentElement,\n CSSProperties,\n PlasmicElement,\n} from \"./element-types\";\n\nconst root = globalThis as any;\n\nexport interface CanvasComponentProps<Data = any> {\n /**\n * This prop is only provided within the canvas of Plasmic Studio.\n * Allows the component to set data to be consumed by the props' controls.\n */\n setControlContextData?: (data: Data) => void;\n}\n\ntype InferDataType<P> = P extends CanvasComponentProps<infer Data> ? Data : any;\n\n/**\n * Config option that takes the context (e.g., props) of the component instance\n * to dynamically set its value.\n */\ntype ContextDependentConfig<P, R> = (\n props: P,\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null\n) => R;\n\ninterface PropTypeBase<P> {\n displayName?: string;\n description?: string;\n hidden?: ContextDependentConfig<P, boolean>;\n}\n\nexport type StringType<P> =\n | \"string\"\n | ({\n type: \"string\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n defaultValue?: boolean;\n defaultValueHint?: boolean;\n } & PropTypeBase<P>);\n\ninterface NumberTypeBase<P> extends PropTypeBase<P> {\n type: \"number\";\n defaultValue?: number;\n defaultValueHint?: number;\n}\n\nexport type NumberType<P> =\n | \"number\"\n | ((\n | {\n control?: \"default\";\n min?: number | ContextDependentConfig<P, number>;\n max?: number | ContextDependentConfig<P, number>;\n }\n | {\n control: \"slider\";\n min: number | ContextDependentConfig<P, number>;\n max: number | ContextDependentConfig<P, number>;\n step?: number | ContextDependentConfig<P, number>;\n }\n ) &\n NumberTypeBase<P>);\n\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n defaultValueHint?: any;\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[] \n | {label:string, value:string}[] \n | ContextDependentConfig<P, string[] | {label:string, value:string}[]>;\n}\n\nexport type ChoiceType<P> = (\n | {\n defaultValue?: string;\n defaultValueHint?: string;\n multiSelect?: false;\n }\n | {\n defaultValue?: string[];\n defaultValueHint?: string[];\n multiSelect: true;\n }\n) &\n ChoiceTypeBase<P>;\n\nexport interface ModalProps {\n show?: boolean;\n children?: React.ReactNode;\n onClose: () => void;\n style?: CSSProperties;\n}\n\ninterface CustomControlProps<P> {\n componentProps: P;\n /**\n * `contextData` can be `null` if the prop controls are rendering before\n * the component instance itself (it will re-render once the component\n * calls `setControlContextData`)\n */\n contextData: InferDataType<P> | null;\n value: any;\n /**\n * Sets the value to be passed to the prop. Expects a JSON-compatible value.\n */\n updateValue: (newVal: any) => void;\n /**\n * Full screen modal component\n */\n FullscreenModal: React.ComponentType<ModalProps>;\n /**\n * Modal component for the side pane\n */\n SideModal: React.ComponentType<ModalProps>;\n}\nexport type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;\n\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n /**\n * Expects a JSON-compatible value\n */\n defaultValue?: any;\n } & PropTypeBase<P>);\n\ntype SlotType =\n | \"slot\"\n | {\n type: \"slot\";\n /**\n * The unique names of all code components that can be placed in the slot\n */\n allowedComponents?: string[];\n defaultValue?: PlasmicElement | PlasmicElement[];\n /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n };\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n defaultValue?: string;\n defaultValueHint?: string;\n } & PropTypeBase<P>);\n\nexport type PrimitiveType<P = any> = Extract<\n StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P>,\n String\n>;\n\ntype ControlTypeBase =\n | {\n editOnly?: false;\n }\n | {\n editOnly: true;\n /**\n * The prop where the values should be mapped to\n */\n uncontrolledProp?: string;\n };\n\nexport type SupportControlled<T> =\n | Extract<T, String | CustomControl<any>>\n | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);\n\nexport type PropType<P> =\n | SupportControlled<\n | StringType<P>\n | BooleanType<P>\n | NumberType<P>\n | JSONLikeType<P>\n | ChoiceType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n | SlotType;\n\ntype RestrictPropType<T, P> = T extends string\n ? SupportControlled<\n | StringType<P>\n | ChoiceType<P>\n | JSONLikeType<P>\n | ImageUrlType<P>\n | CustomType<P>\n >\n : T extends boolean\n ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>>\n : T extends number\n ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>>\n : PropType<P>;\n\ntype DistributedKeyOf<T> = T extends any ? keyof T : never;\n\ninterface ComponentTemplate<P>\n extends Omit<CodeComponentElement<P>, \"type\" | \"name\"> {\n /**\n * A preview picture for the template.\n */\n previewImg?: string;\n}\n\nexport interface ComponentTemplates<P> {\n [name: string]: ComponentTemplate<P>;\n}\n\nexport interface ComponentMeta<P> {\n /**\n * Any unique string name used to identify that component. Each component\n * should be registered with a different `meta.name`, even if they have the\n * same name in the code.\n */\n name: string;\n /**\n * The name to be displayed for the component in Studio. Optional: if not\n * specified, `meta.name` is used.\n */\n displayName?: string;\n /**\n * The javascript name to be used when generating code. Optional: if not\n * provided, `meta.name` is used.\n */\n importName?: string;\n /**\n * An object describing the component properties to be used in Studio.\n * For each `prop`, there should be an entry `meta.props[prop]` describing\n * its type.\n */\n props: { [prop in DistributedKeyOf<P>]?: RestrictPropType<P[prop], P> } & {\n [prop: string]: PropType<P>;\n };\n /**\n * The path to be used when importing the component in the generated code.\n * It can be the name of the package that contains the component, or the path\n * to the file in the project (relative to the root directory).\n */\n importPath: string;\n /**\n * Whether the component is the default export from that path. Optional: if\n * not specified, it's considered `false`.\n */\n isDefaultExport?: boolean;\n /**\n * The prop that expects the CSS classes with styles to be applied to the\n * component. Optional: if not specified, Plasmic will expect it to be\n * `className`. Notice that if the component does not accept CSS classes, the\n * component will not be able to receive styles from the Studio.\n */\n classNameProp?: string;\n /**\n * The prop that receives and forwards a React `ref`. Plasmic only uses `ref`\n * to interact with components, so it's not used in the generated code.\n * Optional: If not provided, the usual `ref` is used.\n */\n refProp?: string;\n /**\n * Default styles to start with when instantiating the component in Plasmic.\n */\n defaultStyles?: CSSProperties;\n /**\n * Component templates to start with on Plasmic.\n */\n templates?: ComponentTemplates<P>;\n /**\n * Registered name of parent component, used for grouping related components.\n */\n parentComponentName?: string;\n}\n\nexport interface ComponentRegistration {\n component: React.ComponentType<any>;\n meta: ComponentMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicComponentRegistry: ComponentRegistration[];\n }\n}\n\nif (root.__PlasmicComponentRegistry == null) {\n root.__PlasmicComponentRegistry = [];\n}\n\nexport default function registerComponent<T extends React.ComponentType<any>>(\n component: T,\n meta: ComponentMeta<React.ComponentProps<T>>\n) {\n root.__PlasmicComponentRegistry.push({ component, meta });\n}\n"],"names":[],"mappings":"AAMA,IAAM,IAAI,GAAG,UAAiB,CAAC;AAgT/B,IAAI,IAAI,CAAC,0BAA0B,IAAI,IAAI,EAAE;IAC3C,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;CACtC;SAEuB,iBAAiB,CACvC,SAAY,EACZ,IAA4C;IAE5C,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,SAAS,WAAA,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;AAC5D;;;;"}
@@ -24,12 +24,12 @@ interface PropTypeBase<P> {
24
24
  description?: string;
25
25
  hidden?: ContextDependentConfig<P, boolean>;
26
26
  }
27
- declare type StringType<P> = "string" | ({
27
+ export declare type StringType<P> = "string" | ({
28
28
  type: "string";
29
29
  defaultValue?: string;
30
30
  defaultValueHint?: string;
31
31
  } & PropTypeBase<P>);
32
- declare type BooleanType<P> = "boolean" | ({
32
+ export declare type BooleanType<P> = "boolean" | ({
33
33
  type: "boolean";
34
34
  defaultValue?: boolean;
35
35
  defaultValueHint?: boolean;
@@ -39,7 +39,7 @@ interface NumberTypeBase<P> extends PropTypeBase<P> {
39
39
  defaultValue?: number;
40
40
  defaultValueHint?: number;
41
41
  }
42
- declare type NumberType<P> = "number" | (({
42
+ export declare type NumberType<P> = "number" | (({
43
43
  control?: "default";
44
44
  min?: number | ContextDependentConfig<P, number>;
45
45
  max?: number | ContextDependentConfig<P, number>;
@@ -49,7 +49,7 @@ declare type NumberType<P> = "number" | (({
49
49
  max: number | ContextDependentConfig<P, number>;
50
50
  step?: number | ContextDependentConfig<P, number>;
51
51
  }) & NumberTypeBase<P>);
52
- declare type JSONLikeType<P> = "object" | ({
52
+ export declare type JSONLikeType<P> = "object" | ({
53
53
  type: "object";
54
54
  /**
55
55
  * Expects a JSON-compatible value
@@ -67,7 +67,7 @@ interface ChoiceTypeBase<P> extends PropTypeBase<P> {
67
67
  value: string;
68
68
  }[]>;
69
69
  }
70
- declare type ChoiceType<P> = ({
70
+ export declare type ChoiceType<P> = ({
71
71
  defaultValue?: string;
72
72
  defaultValueHint?: string;
73
73
  multiSelect?: false;
@@ -76,6 +76,12 @@ declare type ChoiceType<P> = ({
76
76
  defaultValueHint?: string[];
77
77
  multiSelect: true;
78
78
  }) & ChoiceTypeBase<P>;
79
+ export interface ModalProps {
80
+ show?: boolean;
81
+ children?: React.ReactNode;
82
+ onClose: () => void;
83
+ style?: CSSProperties;
84
+ }
79
85
  interface CustomControlProps<P> {
80
86
  componentProps: P;
81
87
  /**
@@ -89,6 +95,14 @@ interface CustomControlProps<P> {
89
95
  * Sets the value to be passed to the prop. Expects a JSON-compatible value.
90
96
  */
91
97
  updateValue: (newVal: any) => void;
98
+ /**
99
+ * Full screen modal component
100
+ */
101
+ FullscreenModal: React.ComponentType<ModalProps>;
102
+ /**
103
+ * Modal component for the side pane
104
+ */
105
+ SideModal: React.ComponentType<ModalProps>;
92
106
  }
93
107
  export declare type CustomControl<P> = React.ComponentType<CustomControlProps<P>>;
94
108
  export declare type CustomType<P> = CustomControl<P> | ({
@@ -126,7 +140,7 @@ declare type ControlTypeBase = {
126
140
  */
127
141
  uncontrolledProp?: string;
128
142
  };
129
- declare type SupportControlled<T> = Extract<T, String | CustomControl<any>> | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);
143
+ export declare type SupportControlled<T> = Extract<T, String | CustomControl<any>> | (Exclude<T, String | CustomControl<any>> & ControlTypeBase);
130
144
  export declare type PropType<P> = SupportControlled<StringType<P> | BooleanType<P> | NumberType<P> | JSONLikeType<P> | ChoiceType<P> | ImageUrlType<P> | CustomType<P>> | SlotType;
131
145
  declare type RestrictPropType<T, P> = T extends string ? SupportControlled<StringType<P> | ChoiceType<P> | JSONLikeType<P> | ImageUrlType<P> | CustomType<P>> : T extends boolean ? SupportControlled<BooleanType<P> | JSONLikeType<P> | CustomType<P>> : T extends number ? SupportControlled<NumberType<P> | JSONLikeType<P> | CustomType<P>> : PropType<P>;
132
146
  declare type DistributedKeyOf<T> = T extends any ? keyof T : never;
@@ -198,6 +212,10 @@ export interface ComponentMeta<P> {
198
212
  * Component templates to start with on Plasmic.
199
213
  */
200
214
  templates?: ComponentTemplates<P>;
215
+ /**
216
+ * Registered name of parent component, used for grouping related components.
217
+ */
218
+ parentComponentName?: string;
201
219
  }
202
220
  export interface ComponentRegistration {
203
221
  component: React.ComponentType<any>;