@plasmicapp/host 1.0.43 → 1.0.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/exports.d.ts CHANGED
@@ -4,4 +4,5 @@ export { PlasmicElement } from "./element-types";
4
4
  export { registerFetcher as unstable_registerFetcher } from "./fetcher";
5
5
  export { ComponentMeta, ComponentRegistration, ComponentTemplates, default as registerComponent, PrimitiveType, PropType, } from "./registerComponent";
6
6
  export { default as registerGlobalContext, GlobalContextMeta, GlobalContextRegistration, PropType as GlobalContextPropType, } from "./registerGlobalContext";
7
+ export { BasicTrait, ChoiceTrait, default as registerTrait, TraitMeta, TraitRegistration, } from "./registerTrait";
7
8
  export { default as repeatedElement } from "./repeatedElement";
@@ -430,6 +430,19 @@ function registerGlobalContext(component, meta) {
430
430
  });
431
431
  }
432
432
 
433
+ var root$4 = globalThis;
434
+
435
+ if (root$4.__PlasmicTraitRegistry == null) {
436
+ root$4.__PlasmicTraitRegistry = [];
437
+ }
438
+
439
+ function registerTrait(trait, meta) {
440
+ root$4.__PlasmicTraitRegistry.push({
441
+ trait: trait,
442
+ meta: meta
443
+ });
444
+ }
445
+
433
446
  var _root$__Sub$setRepeat, _root$__Sub;
434
447
  /**
435
448
  * Allows a component from Plasmic Studio to be repeated.
@@ -464,8 +477,8 @@ var repeatedElementFn = function repeatedElementFn(isPrimary, elt) {
464
477
  return elt;
465
478
  };
466
479
 
467
- var root$4 = globalThis;
468
- var setRepeatedElementFn = (_root$__Sub$setRepeat = root$4 == null ? void 0 : (_root$__Sub = root$4.__Sub) == null ? void 0 : _root$__Sub.setRepeatedElementFn) != null ? _root$__Sub$setRepeat : function (fn) {
480
+ var root$5 = globalThis;
481
+ var setRepeatedElementFn = (_root$__Sub$setRepeat = root$5 == null ? void 0 : (_root$__Sub = root$5.__Sub) == null ? void 0 : _root$__Sub.setRepeatedElementFn) != null ? _root$__Sub$setRepeat : function (fn) {
469
482
  repeatedElementFn = fn;
470
483
  };
471
484
 
@@ -479,6 +492,7 @@ var hostModule = {
479
492
  unstable_registerFetcher: registerFetcher,
480
493
  registerComponent: registerComponent,
481
494
  registerGlobalContext: registerGlobalContext,
495
+ registerTrait: registerTrait,
482
496
  repeatedElement: repeatedElement,
483
497
  DataContext: DataContext,
484
498
  applySelector: applySelector,
@@ -489,13 +503,13 @@ var hostModule = {
489
503
  DataCtxReader: DataCtxReader
490
504
  };
491
505
 
492
- var root$5 = globalThis;
506
+ var root$6 = globalThis;
493
507
 
494
- if (root$5.__Sub == null) {
508
+ if (root$6.__Sub == null) {
495
509
  // Creating a side effect here by logging, so that vite won't
496
510
  // ignore this block for whatever reason
497
511
  console.log("Plasmic: Setting up app host dependencies");
498
- root$5.__Sub = /*#__PURE__*/_extends({
512
+ root$6.__Sub = /*#__PURE__*/_extends({
499
513
  React: React,
500
514
  ReactDOM: ReactDOM,
501
515
  hostModule: hostModule,
@@ -519,6 +533,7 @@ exports.PlasmicCanvasHost = PlasmicCanvasHost;
519
533
  exports.applySelector = applySelector;
520
534
  exports.registerComponent = registerComponent;
521
535
  exports.registerGlobalContext = registerGlobalContext;
536
+ exports.registerTrait = registerTrait;
522
537
  exports.repeatedElement = repeatedElement;
523
538
  exports.unstable_registerFetcher = registerFetcher;
524
539
  exports.useDataEnv = useDataEnv;
@@ -1 +1 @@
1
- {"version":3,"file":"host.cjs.development.js","sources":["../src/lang-utils.ts","../src/useForceUpdate.ts","../src/canvas-host.tsx","../src/common.ts","../src/data.tsx","../src/fetcher.ts","../src/registerComponent.ts","../src/registerGlobalContext.ts","../src/repeatedElement.ts","../src/index.ts"],"sourcesContent":["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","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { ensure } from \"./lang-utils\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\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;\nexport function 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 * If not, return false.\n * If so, return an object with more information about the component\n */\nexport const PlasmicCanvasContext =\n React.createContext<\n | {\n componentName: string | null;\n }\n | boolean\n >(false);\nexport const usePlasmicCanvasContext = () =>\n React.useContext(PlasmicCanvasContext);\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 const locationHash = new URLSearchParams(location.hash);\n const plasmicContextValue = isCanvas\n ? {\n componentName: locationHash.get(\"componentName\"),\n }\n : false;\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={plasmicContextValue}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <iframe\n src={`https://docs.plasmic.app/app-content/app-host-ready#appHostUrl=${encodeURIComponent(\n location.href\n )}`}\n style={{\n width: \"100vw\",\n height: \"100vh\",\n border: \"none\",\n position: \"fixed\",\n top: 0,\n left: 0,\n zIndex: 99999999,\n }}\n ></iframe>\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 const { enableWebpackHmr } = props;\n const [node, setNode] =\n React.useState<React.ReactElement<any, any> | null>(null);\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n };\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nexport function 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","export const tuple = <T extends any[]>(...args: T): T => args;\n","import React, { createContext, ReactNode, useContext } from \"react\";\nimport { tuple } from \"./common\";\n\nexport type DataDict = Record<string, any>;\n\nexport const DataContext = createContext<DataDict | undefined>(undefined);\n\nexport function applySelector(\n rawData: DataDict | undefined,\n selector: string | undefined\n): any {\n if (!selector) {\n return undefined;\n }\n let curData = rawData;\n for (const key of selector.split(\".\")) {\n curData = curData?.[key];\n }\n return curData;\n}\n\nexport type SelectorDict = Record<string, string | undefined>;\n\nexport function useSelector(selector: string | undefined): any {\n const rawData = useDataEnv();\n return applySelector(rawData, selector);\n}\n\nexport function useSelectors(selectors: SelectorDict = {}): any {\n const rawData = useDataEnv();\n return Object.fromEntries(\n Object.entries(selectors)\n .filter(([key, selector]) => !!key && !!selector)\n .map(([key, selector]) => tuple(key, applySelector(rawData, selector)))\n );\n}\n\nexport function useDataEnv() {\n return useContext(DataContext);\n}\n\nexport interface DataProviderProps {\n name?: string;\n data?: any;\n children?: ReactNode;\n}\n\nexport function DataProvider({ name, data, children }: DataProviderProps) {\n const existingEnv = useDataEnv() ?? {};\n if (!name) {\n return <>{children}</>;\n } else {\n return (\n <DataContext.Provider value={{ ...existingEnv, [name]: data }}>\n {children}\n </DataContext.Provider>\n );\n }\n}\n\nexport function DataCtxReader({\n children,\n}: {\n children: ($ctx: DataDict | undefined) => ReactNode;\n}) {\n const $ctx = useDataEnv();\n return children($ctx);\n}\n","import { PrimitiveType } from \"./registerComponent\";\n\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 readOnly?: boolean | ContextDependentConfig<P, boolean>;\n}\n\ntype DefaultValueOrExpr<P, T> =\n | {\n defaultExpr?: undefined;\n defaultExprHint?: undefined;\n defaultValue?: T;\n defaultValueHint?: T | ContextDependentConfig<P, T | undefined>;\n }\n | {\n defaultValue?: undefined;\n defaultValueHint?: undefined;\n defaultExpr?: string;\n defaultExprHint?: string;\n };\n\ntype StringTypeBase<P> = PropTypeBase<P> & DefaultValueOrExpr<P, string>;\n\nexport type StringType<P> =\n | \"string\"\n | ((\n | {\n type: \"string\";\n control?: \"default\" | \"large\";\n }\n | {\n type: \"code\";\n lang: \"css\" | \"html\" | \"javascript\" | \"json\";\n }\n | {\n type: \"code\";\n lang: \"graphql\";\n endpoint: string | ContextDependentConfig<P, string>;\n method?: string | ContextDependentConfig<P, string>;\n headers?: object | ContextDependentConfig<P, object>;\n variables?: object | ContextDependentConfig<P, object>;\n }\n ) &\n StringTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n } & DefaultValueOrExpr<P, boolean> &\n PropTypeBase<P>);\n\ntype NumberTypeBase<P> = PropTypeBase<P> &\n DefaultValueOrExpr<P, number> & {\n type: \"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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n } & DefaultValueOrExpr<P, any> &\n PropTypeBase<P>)\n | ({\n type: \"array\";\n } & DefaultValueOrExpr<P, any[]> &\n PropTypeBase<P>)\n | ({\n type: \"dataSource\";\n dataSource: \"airtable\" | \"cms\";\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n | ContextDependentConfig<\n P,\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n >;\n}\n\nexport type ChoiceType<P> = (\n | ({\n multiSelect?: false;\n } & DefaultValueOrExpr<P, string>)\n | ({\n multiSelect: true;\n } & DefaultValueOrExpr<P, string[]>)\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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n } & PropTypeBase<P> &\n DefaultValueOrExpr<P, any>);\n\ntype SlotType<P> =\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 /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n /**\n * Whether the slot is repeated, i.e., is rendered multiple times using\n * repeatedElement().\n */\n isRepeated?: boolean;\n } & Omit<\n DefaultValueOrExpr<P, PlasmicElement | PlasmicElement[]>,\n \"defaultValueHint\" | \"defaultExpr\" | \"defaultExprHint\"\n >);\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n } & DefaultValueOrExpr<P, 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<P>;\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 description of the component to be shown in Studio.\n */\n description?: 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 * Whether the component can be used as an attachment to an element.\n */\n isAttachment?: boolean;\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 GlobalContextMeta<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 description of the context to be shown in Studio.\n */\n description?: 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 GlobalContextRegistration {\n component: React.ComponentType<any>;\n meta: GlobalContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: GlobalContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerGlobalContext<\n T extends React.ComponentType<any>\n>(component: T, meta: GlobalContextMeta<React.ComponentProps<T>>) {\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 * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerRenderErrorListener, setPlasmicRootNode } from \"./canvas-host\";\nimport * as hostModule from \"./exports\";\nimport { setRepeatedElementFn } from \"./repeatedElement\";\n\n// All exports must come from \"./exports\"\nexport * from \"./exports\";\n\nconst root = globalThis as any;\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 hostModule,\n hostUtils: {\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n },\n\n // For backwards compatibility:\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n ...hostModule,\n };\n}\n"],"names":["isString","x","ensure","msg","undefined","Error","useForceUpdate","useState","setTick","update","useCallback","tick","root","globalThis","__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","usePlasmicCanvasContext","_PlasmicCanvasHost","isFrameAttached","window","parent","isCanvas","match","isLive","shouldRenderStudio","querySelector","forceUpdate","push","index","indexOf","splice","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","locationHash","URLSearchParams","plasmicContextValue","componentName","ReactDOM","ErrorBoundary","key","Provider","encodeURIComponent","href","style","width","height","border","position","top","left","zIndex","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","renderErrorListeners","registerRenderErrorListener","listener","state","getDerivedStateFromError","error","componentDidCatch","render","message","children","type","dangerouslySetInnerHTML","__html","tuple","args","DataContext","createContext","applySelector","rawData","selector","curData","split","useSelector","useDataEnv","useSelectors","selectors","Object","fromEntries","entries","filter","map","useContext","DataProvider","name","data","existingEnv","DataCtxReader","$ctx","__PlasmicFetcherRegistry","registerFetcher","fetcher","meta","__PlasmicComponentRegistry","registerComponent","component","__PlasmicContextRegistry","registerGlobalContext","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","fn","console","log","hostModule","hostUtils"],"mappings":"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"}
1
+ {"version":3,"file":"host.cjs.development.js","sources":["../src/lang-utils.ts","../src/useForceUpdate.ts","../src/canvas-host.tsx","../src/common.ts","../src/data.tsx","../src/fetcher.ts","../src/registerComponent.ts","../src/registerGlobalContext.ts","../src/registerTrait.ts","../src/repeatedElement.ts","../src/index.ts"],"sourcesContent":["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","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { ensure } from \"./lang-utils\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\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;\nexport function 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 * If not, return false.\n * If so, return an object with more information about the component\n */\nexport const PlasmicCanvasContext =\n React.createContext<\n | {\n componentName: string | null;\n }\n | boolean\n >(false);\nexport const usePlasmicCanvasContext = () =>\n React.useContext(PlasmicCanvasContext);\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 const locationHash = new URLSearchParams(location.hash);\n const plasmicContextValue = isCanvas\n ? {\n componentName: locationHash.get(\"componentName\"),\n }\n : false;\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={plasmicContextValue}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <iframe\n src={`https://docs.plasmic.app/app-content/app-host-ready#appHostUrl=${encodeURIComponent(\n location.href\n )}`}\n style={{\n width: \"100vw\",\n height: \"100vh\",\n border: \"none\",\n position: \"fixed\",\n top: 0,\n left: 0,\n zIndex: 99999999,\n }}\n ></iframe>\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 const { enableWebpackHmr } = props;\n const [node, setNode] =\n React.useState<React.ReactElement<any, any> | null>(null);\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n };\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nexport function 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","export const tuple = <T extends any[]>(...args: T): T => args;\n","import React, { createContext, ReactNode, useContext } from \"react\";\nimport { tuple } from \"./common\";\n\nexport type DataDict = Record<string, any>;\n\nexport const DataContext = createContext<DataDict | undefined>(undefined);\n\nexport function applySelector(\n rawData: DataDict | undefined,\n selector: string | undefined\n): any {\n if (!selector) {\n return undefined;\n }\n let curData = rawData;\n for (const key of selector.split(\".\")) {\n curData = curData?.[key];\n }\n return curData;\n}\n\nexport type SelectorDict = Record<string, string | undefined>;\n\nexport function useSelector(selector: string | undefined): any {\n const rawData = useDataEnv();\n return applySelector(rawData, selector);\n}\n\nexport function useSelectors(selectors: SelectorDict = {}): any {\n const rawData = useDataEnv();\n return Object.fromEntries(\n Object.entries(selectors)\n .filter(([key, selector]) => !!key && !!selector)\n .map(([key, selector]) => tuple(key, applySelector(rawData, selector)))\n );\n}\n\nexport function useDataEnv() {\n return useContext(DataContext);\n}\n\nexport interface DataProviderProps {\n name?: string;\n data?: any;\n children?: ReactNode;\n}\n\nexport function DataProvider({ name, data, children }: DataProviderProps) {\n const existingEnv = useDataEnv() ?? {};\n if (!name) {\n return <>{children}</>;\n } else {\n return (\n <DataContext.Provider value={{ ...existingEnv, [name]: data }}>\n {children}\n </DataContext.Provider>\n );\n }\n}\n\nexport function DataCtxReader({\n children,\n}: {\n children: ($ctx: DataDict | undefined) => ReactNode;\n}) {\n const $ctx = useDataEnv();\n return children($ctx);\n}\n","import { PrimitiveType } from \"./registerComponent\";\n\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 readOnly?: boolean | ContextDependentConfig<P, boolean>;\n}\n\ntype DefaultValueOrExpr<P, T> =\n | {\n defaultExpr?: undefined;\n defaultExprHint?: undefined;\n defaultValue?: T;\n defaultValueHint?: T | ContextDependentConfig<P, T | undefined>;\n }\n | {\n defaultValue?: undefined;\n defaultValueHint?: undefined;\n defaultExpr?: string;\n defaultExprHint?: string;\n };\n\ntype StringTypeBase<P> = PropTypeBase<P> & DefaultValueOrExpr<P, string>;\n\nexport type StringType<P> =\n | \"string\"\n | ((\n | {\n type: \"string\";\n control?: \"default\" | \"large\";\n }\n | {\n type: \"code\";\n lang: \"css\" | \"html\" | \"javascript\" | \"json\";\n }\n | {\n type: \"code\";\n lang: \"graphql\";\n endpoint: string | ContextDependentConfig<P, string>;\n method?: string | ContextDependentConfig<P, string>;\n headers?: object | ContextDependentConfig<P, object>;\n variables?: object | ContextDependentConfig<P, object>;\n }\n ) &\n StringTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n } & DefaultValueOrExpr<P, boolean> &\n PropTypeBase<P>);\n\ntype NumberTypeBase<P> = PropTypeBase<P> &\n DefaultValueOrExpr<P, number> & {\n type: \"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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n } & DefaultValueOrExpr<P, any> &\n PropTypeBase<P>)\n | ({\n type: \"array\";\n } & DefaultValueOrExpr<P, any[]> &\n PropTypeBase<P>)\n | ({\n type: \"dataSource\";\n dataSource: \"airtable\" | \"cms\";\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n | ContextDependentConfig<\n P,\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n >;\n}\n\nexport type ChoiceType<P> = (\n | ({\n multiSelect?: false;\n } & DefaultValueOrExpr<P, string>)\n | ({\n multiSelect: true;\n } & DefaultValueOrExpr<P, string[]>)\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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n } & PropTypeBase<P> &\n DefaultValueOrExpr<P, any>);\n\ntype SlotType<P> =\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 /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n /**\n * Whether the slot is repeated, i.e., is rendered multiple times using\n * repeatedElement().\n */\n isRepeated?: boolean;\n } & Omit<\n DefaultValueOrExpr<P, PlasmicElement | PlasmicElement[]>,\n \"defaultValueHint\" | \"defaultExpr\" | \"defaultExprHint\"\n >);\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n } & DefaultValueOrExpr<P, 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<P>;\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 description of the component to be shown in Studio.\n */\n description?: 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 * Whether the component can be used as an attachment to an element.\n */\n isAttachment?: boolean;\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 GlobalContextMeta<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 description of the context to be shown in Studio.\n */\n description?: 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 GlobalContextRegistration {\n component: React.ComponentType<any>;\n meta: GlobalContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: GlobalContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerGlobalContext<\n T extends React.ComponentType<any>\n>(component: T, meta: GlobalContextMeta<React.ComponentProps<T>>) {\n root.__PlasmicContextRegistry.push({ component, meta });\n}\n","const root = globalThis as any;\n\nexport interface BasicTrait {\n label?: string;\n type: \"text\" | \"number\" | \"boolean\";\n}\n\nexport interface ChoiceTrait {\n label?: string;\n type: \"choice\";\n options: string[];\n}\n\nexport type TraitMeta = BasicTrait | ChoiceTrait;\n\nexport interface TraitRegistration {\n trait: string;\n meta: TraitMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicTraitRegistry: TraitRegistration[];\n }\n}\n\nif (root.__PlasmicTraitRegistry == null) {\n root.__PlasmicTraitRegistry = [];\n}\n\nexport default function registerTrait(trait: string, meta: TraitMeta) {\n root.__PlasmicTraitRegistry.push({\n trait,\n meta,\n });\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 * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerRenderErrorListener, setPlasmicRootNode } from \"./canvas-host\";\nimport * as hostModule from \"./exports\";\nimport { setRepeatedElementFn } from \"./repeatedElement\";\n\n// All exports must come from \"./exports\"\nexport * from \"./exports\";\n\nconst root = globalThis as any;\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 hostModule,\n hostUtils: {\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n },\n\n // For backwards compatibility:\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n ...hostModule,\n };\n}\n"],"names":["isString","x","ensure","msg","undefined","Error","useForceUpdate","useState","setTick","update","useCallback","tick","root","globalThis","__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","usePlasmicCanvasContext","_PlasmicCanvasHost","isFrameAttached","window","parent","isCanvas","match","isLive","shouldRenderStudio","querySelector","forceUpdate","push","index","indexOf","splice","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","locationHash","URLSearchParams","plasmicContextValue","componentName","ReactDOM","ErrorBoundary","key","Provider","encodeURIComponent","href","style","width","height","border","position","top","left","zIndex","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","renderErrorListeners","registerRenderErrorListener","listener","state","getDerivedStateFromError","error","componentDidCatch","render","message","children","type","dangerouslySetInnerHTML","__html","tuple","args","DataContext","createContext","applySelector","rawData","selector","curData","split","useSelector","useDataEnv","useSelectors","selectors","Object","fromEntries","entries","filter","map","useContext","DataProvider","name","data","existingEnv","DataCtxReader","$ctx","__PlasmicFetcherRegistry","registerFetcher","fetcher","meta","__PlasmicComponentRegistry","registerComponent","component","__PlasmicContextRegistry","registerGlobalContext","__PlasmicTraitRegistry","registerTrait","trait","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","fn","console","log","hostModule","hostUtils"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("react"),n=(e=t)&&"object"==typeof e&&"default"in e?e.default:e,r=require("react-dom");function o(){return(o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function a(e,t){return(a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}require("@plasmicapp/preamble");var s=globalThis;null==s.__PlasmicHostVersion&&(s.__PlasmicHostVersion="2");var l=[],u=new function(e){var t=this;this.value=null,this.set=function(e){t.value=e,l.forEach((function(e){return e()}))},this.get=function(){return t.value}}(null);function c(){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 p=0;function f(e){p++,u.set(e)}var m=t.createContext(!1),d=function(){return t.useContext(m)};function v(){var e,n,o,a=!!window.parent,i=!(null==(e=location.hash)||!e.match(/\bcanvas=true\b/)),s=!(null==(n=location.hash)||!n.match(/\blive=true\b/))||!a,f=a&&!document.querySelector("#plasmic-studio-tag")&&!i&&!s,d=(o=t.useState(0)[1],t.useCallback((function(){o((function(e){return e+1}))}),[]));if(t.useLayoutEffect((function(){return l.push(d),function(){var e=l.indexOf(d);e>=0&&l.splice(e,1)}}),[d]),t.useEffect((function(){var e,t;f&&a&&window.parent!==window&&(e=document.createElement("script"),t=c(),e.src=t+"/static/js/studio.js",document.body.appendChild(e))}),[f,a]),t.useEffect((function(){if(!f&&!document.querySelector("#getlibs")&&s){var e=document.createElement("script");e.id="getlibs",e.src=c()+"/static/js/getlibs.js",e.async=!1,e.onload=function(){null==window.__GetlibsReadyResolver||window.__GetlibsReadyResolver()},document.head.append(e)}}),[f]),!a)return null;if(i||s){var v=document.querySelector("#plasmic-app.__wab_user-body");v||((v=document.createElement("div")).id="plasmic-app",v.classList.add("__wab_user-body"),document.body.appendChild(v));var h=new URLSearchParams(location.hash),b=!!i&&{componentName:h.get("componentName")};return r.createPortal(t.createElement(g,{key:""+p},t.createElement(m.Provider,{value:b},u.get())),v,"plasmic-app")}return f&&window.parent===window?t.createElement("iframe",{src:"https://docs.plasmic.app/app-content/app-host-ready#appHostUrl="+encodeURIComponent(location.href),style:{width:"100vw",height:"100vh",border:"none",position:"fixed",top:0,left:0,zIndex:99999999}}):null}var h=function(e){var n=e.enableWebpackHmr,r=t.useState(null),o=r[0],a=r[1];return t.useEffect((function(){a(t.createElement(v,null))}),[]),t.createElement(t.Fragment,null,!n&&t.createElement(_,null),o)},b=[];function y(e){return b.push(e),function(){var t=b.indexOf(e);t>=0&&b.splice(t,1)}}var g=function(e){var n,r;function o(t){var n;return(n=e.call(this,t)||this).state={},n}r=e,(n=o).prototype=Object.create(r.prototype),n.prototype.constructor=n,a(n,r),o.getDerivedStateFromError=function(e){return{error:e}};var i=o.prototype;return i.componentDidCatch=function(e){b.forEach((function(t){return t(e)}))},i.render=function(){return this.state.error?t.createElement("div",null,"Error: ",""+this.state.error.message):this.props.children},o}(t.Component);function _(){return null}var x=t.createContext(void 0);function C(e,t){if(t){for(var n,r=e,o=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return i(e,void 0);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,void 0):void 0}}(e))){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(t.split("."));!(n=o()).done;){var a;r=null==(a=r)?void 0:a[n.value]}return r}}function E(e){return C(P(),e)}function w(e){void 0===e&&(e={});var t=P();return Object.fromEntries(Object.entries(e).filter((function(e){return!!e[0]&&!!e[1]})).map((function(e){return function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t}(e[0],C(t,e[1]))})))}function P(){return t.useContext(x)}function R(e){var t,r,a=e.name,i=e.data,s=e.children,l=null!=(t=P())?t:{};return a?n.createElement(x.Provider,{value:o({},l,(r={},r[a]=i,r))},s):n.createElement(n.Fragment,null,s)}function S(e){return(0,e.children)(P())}var j=globalThis;function O(e,t){j.__PlasmicFetcherRegistry.push({fetcher:e,meta:t})}j.__PlasmicFetcherRegistry=[];var D=globalThis;function F(e,t){D.__PlasmicComponentRegistry.push({component:e,meta:t})}null==D.__PlasmicComponentRegistry&&(D.__PlasmicComponentRegistry=[]);var A,T,q=globalThis;function H(e,t){q.__PlasmicContextRegistry.push({component:e,meta:t})}function L(e,t){return U(e,t)}null==q.__PlasmicContextRegistry&&(q.__PlasmicContextRegistry=[]);var U=function(e,n){return e?n:Array.isArray(n)?n.map((function(t){return L(e,t)})):n&&t.isValidElement(n)&&"string"!=typeof n?t.cloneElement(n):n},I=globalThis,M=null!=(A=null==I||null==(T=I.__Sub)?void 0:T.setRepeatedElementFn)?A:function(e){U=e},k={__proto__:null,PlasmicCanvasContext:m,PlasmicCanvasHost:h,usePlasmicCanvasContext:d,unstable_registerFetcher:O,registerComponent:F,registerGlobalContext:H,repeatedElement:L,DataContext:x,applySelector:C,useSelector:E,useSelectors:w,useDataEnv:P,DataProvider:R,DataCtxReader:S},G=globalThis;null==G.__Sub&&(console.log("Plasmic: Setting up app host dependencies"),G.__Sub=o({React:t,ReactDOM:r,hostModule:k,hostUtils:{setPlasmicRootNode:f,registerRenderErrorListener:y,setRepeatedElementFn:M},setPlasmicRootNode:f,registerRenderErrorListener:y,setRepeatedElementFn:M},k)),exports.DataContext=x,exports.DataCtxReader=S,exports.DataProvider=R,exports.PlasmicCanvasContext=m,exports.PlasmicCanvasHost=h,exports.applySelector=C,exports.registerComponent=F,exports.registerGlobalContext=H,exports.repeatedElement=L,exports.unstable_registerFetcher=O,exports.useDataEnv=P,exports.usePlasmicCanvasContext=d,exports.useSelector=E,exports.useSelectors=w;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("react"),r=(e=t)&&"object"==typeof e&&"default"in e?e.default:e,n=require("react-dom");function o(){return(o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function a(e,t){return(a=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}require("@plasmicapp/preamble");var s=globalThis;null==s.__PlasmicHostVersion&&(s.__PlasmicHostVersion="2");var l=[],u=new function(e){var t=this;this.value=null,this.set=function(e){t.value=e,l.forEach((function(e){return e()}))},this.get=function(){return t.value}}(null);function c(){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 p=0;function m(e){p++,u.set(e)}var f=t.createContext(!1),d=function(){return t.useContext(f)};function v(){var e,r,o,a=!!window.parent,i=!(null==(e=location.hash)||!e.match(/\bcanvas=true\b/)),s=!(null==(r=location.hash)||!r.match(/\blive=true\b/))||!a,m=a&&!document.querySelector("#plasmic-studio-tag")&&!i&&!s,d=(o=t.useState(0)[1],t.useCallback((function(){o((function(e){return e+1}))}),[]));if(t.useLayoutEffect((function(){return l.push(d),function(){var e=l.indexOf(d);e>=0&&l.splice(e,1)}}),[d]),t.useEffect((function(){var e,t;m&&a&&window.parent!==window&&(e=document.createElement("script"),t=c(),e.src=t+"/static/js/studio.js",document.body.appendChild(e))}),[m,a]),t.useEffect((function(){if(!m&&!document.querySelector("#getlibs")&&s){var e=document.createElement("script");e.id="getlibs",e.src=c()+"/static/js/getlibs.js",e.async=!1,e.onload=function(){null==window.__GetlibsReadyResolver||window.__GetlibsReadyResolver()},document.head.append(e)}}),[m]),!a)return null;if(i||s){var v=document.querySelector("#plasmic-app.__wab_user-body");v||((v=document.createElement("div")).id="plasmic-app",v.classList.add("__wab_user-body"),document.body.appendChild(v));var h=new URLSearchParams(location.hash),g=!!i&&{componentName:h.get("componentName")};return n.createPortal(t.createElement(_,{key:""+p},t.createElement(f.Provider,{value:g},u.get())),v,"plasmic-app")}return m&&window.parent===window?t.createElement("iframe",{src:"https://docs.plasmic.app/app-content/app-host-ready#appHostUrl="+encodeURIComponent(location.href),style:{width:"100vw",height:"100vh",border:"none",position:"fixed",top:0,left:0,zIndex:99999999}}):null}var h=function(e){var r=e.enableWebpackHmr,n=t.useState(null),o=n[0],a=n[1];return t.useEffect((function(){a(t.createElement(v,null))}),[]),t.createElement(t.Fragment,null,!r&&t.createElement(b,null),o)},g=[];function y(e){return g.push(e),function(){var t=g.indexOf(e);t>=0&&g.splice(t,1)}}var _=function(e){var r,n;function o(t){var r;return(r=e.call(this,t)||this).state={},r}n=e,(r=o).prototype=Object.create(n.prototype),r.prototype.constructor=r,a(r,n),o.getDerivedStateFromError=function(e){return{error:e}};var i=o.prototype;return i.componentDidCatch=function(e){g.forEach((function(t){return t(e)}))},i.render=function(){return this.state.error?t.createElement("div",null,"Error: ",""+this.state.error.message):this.props.children},o}(t.Component);function b(){return null}var x=t.createContext(void 0);function C(e,t){if(t){for(var r,n=e,o=function(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return i(e,void 0);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(e,void 0):void 0}}(e))){r&&(e=r);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(t.split("."));!(r=o()).done;){var a;n=null==(a=n)?void 0:a[r.value]}return n}}function E(e){return C(w(),e)}function P(e){void 0===e&&(e={});var t=w();return Object.fromEntries(Object.entries(e).filter((function(e){return!!e[0]&&!!e[1]})).map((function(e){return function(){for(var e=arguments.length,t=new Array(e),r=0;r<e;r++)t[r]=arguments[r];return t}(e[0],C(t,e[1]))})))}function w(){return t.useContext(x)}function R(e){var t,n,a=e.name,i=e.data,s=e.children,l=null!=(t=w())?t:{};return a?r.createElement(x.Provider,{value:o({},l,(n={},n[a]=i,n))},s):r.createElement(r.Fragment,null,s)}function S(e){return(0,e.children)(w())}var j=globalThis;function O(e,t){j.__PlasmicFetcherRegistry.push({fetcher:e,meta:t})}j.__PlasmicFetcherRegistry=[];var T=globalThis;function D(e,t){T.__PlasmicComponentRegistry.push({component:e,meta:t})}null==T.__PlasmicComponentRegistry&&(T.__PlasmicComponentRegistry=[]);var F=globalThis;function A(e,t){F.__PlasmicContextRegistry.push({component:e,meta:t})}null==F.__PlasmicContextRegistry&&(F.__PlasmicContextRegistry=[]);var q,H,L=globalThis;function U(e,t){L.__PlasmicTraitRegistry.push({trait:e,meta:t})}function I(e,t){return M(e,t)}null==L.__PlasmicTraitRegistry&&(L.__PlasmicTraitRegistry=[]);var M=function(e,r){return e?r:Array.isArray(r)?r.map((function(t){return I(e,t)})):r&&t.isValidElement(r)&&"string"!=typeof r?t.cloneElement(r):r},k=globalThis,G=null!=(q=null==k||null==(H=k.__Sub)?void 0:H.setRepeatedElementFn)?q:function(e){M=e},N={__proto__:null,PlasmicCanvasContext:f,PlasmicCanvasHost:h,usePlasmicCanvasContext:d,unstable_registerFetcher:O,registerComponent:D,registerGlobalContext:A,registerTrait:U,repeatedElement:I,DataContext:x,applySelector:C,useSelector:E,useSelectors:P,useDataEnv:w,DataProvider:R,DataCtxReader:S},V=globalThis;null==V.__Sub&&(console.log("Plasmic: Setting up app host dependencies"),V.__Sub=o({React:t,ReactDOM:n,hostModule:N,hostUtils:{setPlasmicRootNode:m,registerRenderErrorListener:y,setRepeatedElementFn:G},setPlasmicRootNode:m,registerRenderErrorListener:y,setRepeatedElementFn:G},N)),exports.DataContext=x,exports.DataCtxReader=S,exports.DataProvider=R,exports.PlasmicCanvasContext=f,exports.PlasmicCanvasHost=h,exports.applySelector=C,exports.registerComponent=D,exports.registerGlobalContext=A,exports.registerTrait=U,exports.repeatedElement=I,exports.unstable_registerFetcher=O,exports.useDataEnv=w,exports.usePlasmicCanvasContext=d,exports.useSelector=E,exports.useSelectors=P;
2
2
  //# sourceMappingURL=host.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.cjs.production.min.js","sources":["../src/canvas-host.tsx","../src/lang-utils.ts","../src/useForceUpdate.ts","../src/common.ts","../src/data.tsx","../src/fetcher.ts","../src/registerComponent.ts","../src/registerGlobalContext.ts","../src/repeatedElement.ts","../src/index.ts"],"sourcesContent":["// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { ensure } from \"./lang-utils\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\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;\nexport function 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 * If not, return false.\n * If so, return an object with more information about the component\n */\nexport const PlasmicCanvasContext =\n React.createContext<\n | {\n componentName: string | null;\n }\n | boolean\n >(false);\nexport const usePlasmicCanvasContext = () =>\n React.useContext(PlasmicCanvasContext);\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 const locationHash = new URLSearchParams(location.hash);\n const plasmicContextValue = isCanvas\n ? {\n componentName: locationHash.get(\"componentName\"),\n }\n : false;\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={plasmicContextValue}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <iframe\n src={`https://docs.plasmic.app/app-content/app-host-ready#appHostUrl=${encodeURIComponent(\n location.href\n )}`}\n style={{\n width: \"100vw\",\n height: \"100vh\",\n border: \"none\",\n position: \"fixed\",\n top: 0,\n left: 0,\n zIndex: 99999999,\n }}\n ></iframe>\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 const { enableWebpackHmr } = props;\n const [node, setNode] =\n React.useState<React.ReactElement<any, any> | null>(null);\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n };\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nexport function 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","export const tuple = <T extends any[]>(...args: T): T => args;\n","import React, { createContext, ReactNode, useContext } from \"react\";\nimport { tuple } from \"./common\";\n\nexport type DataDict = Record<string, any>;\n\nexport const DataContext = createContext<DataDict | undefined>(undefined);\n\nexport function applySelector(\n rawData: DataDict | undefined,\n selector: string | undefined\n): any {\n if (!selector) {\n return undefined;\n }\n let curData = rawData;\n for (const key of selector.split(\".\")) {\n curData = curData?.[key];\n }\n return curData;\n}\n\nexport type SelectorDict = Record<string, string | undefined>;\n\nexport function useSelector(selector: string | undefined): any {\n const rawData = useDataEnv();\n return applySelector(rawData, selector);\n}\n\nexport function useSelectors(selectors: SelectorDict = {}): any {\n const rawData = useDataEnv();\n return Object.fromEntries(\n Object.entries(selectors)\n .filter(([key, selector]) => !!key && !!selector)\n .map(([key, selector]) => tuple(key, applySelector(rawData, selector)))\n );\n}\n\nexport function useDataEnv() {\n return useContext(DataContext);\n}\n\nexport interface DataProviderProps {\n name?: string;\n data?: any;\n children?: ReactNode;\n}\n\nexport function DataProvider({ name, data, children }: DataProviderProps) {\n const existingEnv = useDataEnv() ?? {};\n if (!name) {\n return <>{children}</>;\n } else {\n return (\n <DataContext.Provider value={{ ...existingEnv, [name]: data }}>\n {children}\n </DataContext.Provider>\n );\n }\n}\n\nexport function DataCtxReader({\n children,\n}: {\n children: ($ctx: DataDict | undefined) => ReactNode;\n}) {\n const $ctx = useDataEnv();\n return children($ctx);\n}\n","import { PrimitiveType } from \"./registerComponent\";\n\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 readOnly?: boolean | ContextDependentConfig<P, boolean>;\n}\n\ntype DefaultValueOrExpr<P, T> =\n | {\n defaultExpr?: undefined;\n defaultExprHint?: undefined;\n defaultValue?: T;\n defaultValueHint?: T | ContextDependentConfig<P, T | undefined>;\n }\n | {\n defaultValue?: undefined;\n defaultValueHint?: undefined;\n defaultExpr?: string;\n defaultExprHint?: string;\n };\n\ntype StringTypeBase<P> = PropTypeBase<P> & DefaultValueOrExpr<P, string>;\n\nexport type StringType<P> =\n | \"string\"\n | ((\n | {\n type: \"string\";\n control?: \"default\" | \"large\";\n }\n | {\n type: \"code\";\n lang: \"css\" | \"html\" | \"javascript\" | \"json\";\n }\n | {\n type: \"code\";\n lang: \"graphql\";\n endpoint: string | ContextDependentConfig<P, string>;\n method?: string | ContextDependentConfig<P, string>;\n headers?: object | ContextDependentConfig<P, object>;\n variables?: object | ContextDependentConfig<P, object>;\n }\n ) &\n StringTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n } & DefaultValueOrExpr<P, boolean> &\n PropTypeBase<P>);\n\ntype NumberTypeBase<P> = PropTypeBase<P> &\n DefaultValueOrExpr<P, number> & {\n type: \"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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n } & DefaultValueOrExpr<P, any> &\n PropTypeBase<P>)\n | ({\n type: \"array\";\n } & DefaultValueOrExpr<P, any[]> &\n PropTypeBase<P>)\n | ({\n type: \"dataSource\";\n dataSource: \"airtable\" | \"cms\";\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n | ContextDependentConfig<\n P,\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n >;\n}\n\nexport type ChoiceType<P> = (\n | ({\n multiSelect?: false;\n } & DefaultValueOrExpr<P, string>)\n | ({\n multiSelect: true;\n } & DefaultValueOrExpr<P, string[]>)\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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n } & PropTypeBase<P> &\n DefaultValueOrExpr<P, any>);\n\ntype SlotType<P> =\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 /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n /**\n * Whether the slot is repeated, i.e., is rendered multiple times using\n * repeatedElement().\n */\n isRepeated?: boolean;\n } & Omit<\n DefaultValueOrExpr<P, PlasmicElement | PlasmicElement[]>,\n \"defaultValueHint\" | \"defaultExpr\" | \"defaultExprHint\"\n >);\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n } & DefaultValueOrExpr<P, 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<P>;\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 description of the component to be shown in Studio.\n */\n description?: 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 * Whether the component can be used as an attachment to an element.\n */\n isAttachment?: boolean;\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 GlobalContextMeta<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 description of the context to be shown in Studio.\n */\n description?: 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 GlobalContextRegistration {\n component: React.ComponentType<any>;\n meta: GlobalContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: GlobalContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerGlobalContext<\n T extends React.ComponentType<any>\n>(component: T, meta: GlobalContextMeta<React.ComponentProps<T>>) {\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 * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerRenderErrorListener, setPlasmicRootNode } from \"./canvas-host\";\nimport * as hostModule from \"./exports\";\nimport { setRepeatedElementFn } from \"./repeatedElement\";\n\n// All exports must come from \"./exports\"\nexport * from \"./exports\";\n\nconst root = globalThis as any;\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 hostModule,\n hostUtils: {\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n },\n\n // For backwards compatibility:\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n ...hostModule,\n };\n}\n"],"names":["root","globalThis","__PlasmicHostVersion","rootChangeListeners","plasmicRootNode","value","val","_this","forEach","f","getPlasmicOrigin","x","msg","isString","Error","ensure","URL","location","hash","replace","searchParams","get","renderCount","setPlasmicRootNode","node","set","PlasmicCanvasContext","React","usePlasmicCanvasContext","_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","locationHash","URLSearchParams","plasmicContextValue","componentName","ReactDOM","ErrorBoundary","key","Provider","encodeURIComponent","href","style","width","height","border","position","top","left","zIndex","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","renderErrorListeners","registerRenderErrorListener","listener","state","getDerivedStateFromError","error","componentDidCatch","render","this","message","children","DataContext","createContext","undefined","applySelector","rawData","selector","curData","split","_curData","useSelector","useDataEnv","useSelectors","selectors","Object","fromEntries","entries","filter","map","args","tuple","useContext","DataProvider","name","data","existingEnv","DataCtxReader","registerFetcher","fetcher","meta","__PlasmicFetcherRegistry","registerComponent","component","__PlasmicComponentRegistry","registerGlobalContext","__PlasmicContextRegistry","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","_root$__Sub","fn","console","log","hostModule","hostUtils"],"mappings":"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"}
1
+ {"version":3,"file":"host.cjs.production.min.js","sources":["../src/canvas-host.tsx","../src/lang-utils.ts","../src/useForceUpdate.ts","../src/common.ts","../src/data.tsx","../src/fetcher.ts","../src/registerComponent.ts","../src/registerGlobalContext.ts","../src/registerTrait.ts","../src/repeatedElement.ts","../src/index.ts"],"sourcesContent":["// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { ensure } from \"./lang-utils\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\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;\nexport function 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 * If not, return false.\n * If so, return an object with more information about the component\n */\nexport const PlasmicCanvasContext =\n React.createContext<\n | {\n componentName: string | null;\n }\n | boolean\n >(false);\nexport const usePlasmicCanvasContext = () =>\n React.useContext(PlasmicCanvasContext);\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 const locationHash = new URLSearchParams(location.hash);\n const plasmicContextValue = isCanvas\n ? {\n componentName: locationHash.get(\"componentName\"),\n }\n : false;\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={plasmicContextValue}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <iframe\n src={`https://docs.plasmic.app/app-content/app-host-ready#appHostUrl=${encodeURIComponent(\n location.href\n )}`}\n style={{\n width: \"100vw\",\n height: \"100vh\",\n border: \"none\",\n position: \"fixed\",\n top: 0,\n left: 0,\n zIndex: 99999999,\n }}\n ></iframe>\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 const { enableWebpackHmr } = props;\n const [node, setNode] =\n React.useState<React.ReactElement<any, any> | null>(null);\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n };\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nexport function 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","export const tuple = <T extends any[]>(...args: T): T => args;\n","import React, { createContext, ReactNode, useContext } from \"react\";\nimport { tuple } from \"./common\";\n\nexport type DataDict = Record<string, any>;\n\nexport const DataContext = createContext<DataDict | undefined>(undefined);\n\nexport function applySelector(\n rawData: DataDict | undefined,\n selector: string | undefined\n): any {\n if (!selector) {\n return undefined;\n }\n let curData = rawData;\n for (const key of selector.split(\".\")) {\n curData = curData?.[key];\n }\n return curData;\n}\n\nexport type SelectorDict = Record<string, string | undefined>;\n\nexport function useSelector(selector: string | undefined): any {\n const rawData = useDataEnv();\n return applySelector(rawData, selector);\n}\n\nexport function useSelectors(selectors: SelectorDict = {}): any {\n const rawData = useDataEnv();\n return Object.fromEntries(\n Object.entries(selectors)\n .filter(([key, selector]) => !!key && !!selector)\n .map(([key, selector]) => tuple(key, applySelector(rawData, selector)))\n );\n}\n\nexport function useDataEnv() {\n return useContext(DataContext);\n}\n\nexport interface DataProviderProps {\n name?: string;\n data?: any;\n children?: ReactNode;\n}\n\nexport function DataProvider({ name, data, children }: DataProviderProps) {\n const existingEnv = useDataEnv() ?? {};\n if (!name) {\n return <>{children}</>;\n } else {\n return (\n <DataContext.Provider value={{ ...existingEnv, [name]: data }}>\n {children}\n </DataContext.Provider>\n );\n }\n}\n\nexport function DataCtxReader({\n children,\n}: {\n children: ($ctx: DataDict | undefined) => ReactNode;\n}) {\n const $ctx = useDataEnv();\n return children($ctx);\n}\n","import { PrimitiveType } from \"./registerComponent\";\n\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 readOnly?: boolean | ContextDependentConfig<P, boolean>;\n}\n\ntype DefaultValueOrExpr<P, T> =\n | {\n defaultExpr?: undefined;\n defaultExprHint?: undefined;\n defaultValue?: T;\n defaultValueHint?: T | ContextDependentConfig<P, T | undefined>;\n }\n | {\n defaultValue?: undefined;\n defaultValueHint?: undefined;\n defaultExpr?: string;\n defaultExprHint?: string;\n };\n\ntype StringTypeBase<P> = PropTypeBase<P> & DefaultValueOrExpr<P, string>;\n\nexport type StringType<P> =\n | \"string\"\n | ((\n | {\n type: \"string\";\n control?: \"default\" | \"large\";\n }\n | {\n type: \"code\";\n lang: \"css\" | \"html\" | \"javascript\" | \"json\";\n }\n | {\n type: \"code\";\n lang: \"graphql\";\n endpoint: string | ContextDependentConfig<P, string>;\n method?: string | ContextDependentConfig<P, string>;\n headers?: object | ContextDependentConfig<P, object>;\n variables?: object | ContextDependentConfig<P, object>;\n }\n ) &\n StringTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n } & DefaultValueOrExpr<P, boolean> &\n PropTypeBase<P>);\n\ntype NumberTypeBase<P> = PropTypeBase<P> &\n DefaultValueOrExpr<P, number> & {\n type: \"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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n } & DefaultValueOrExpr<P, any> &\n PropTypeBase<P>)\n | ({\n type: \"array\";\n } & DefaultValueOrExpr<P, any[]> &\n PropTypeBase<P>)\n | ({\n type: \"dataSource\";\n dataSource: \"airtable\" | \"cms\";\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n | ContextDependentConfig<\n P,\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n >;\n}\n\nexport type ChoiceType<P> = (\n | ({\n multiSelect?: false;\n } & DefaultValueOrExpr<P, string>)\n | ({\n multiSelect: true;\n } & DefaultValueOrExpr<P, string[]>)\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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n } & PropTypeBase<P> &\n DefaultValueOrExpr<P, any>);\n\ntype SlotType<P> =\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 /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n /**\n * Whether the slot is repeated, i.e., is rendered multiple times using\n * repeatedElement().\n */\n isRepeated?: boolean;\n } & Omit<\n DefaultValueOrExpr<P, PlasmicElement | PlasmicElement[]>,\n \"defaultValueHint\" | \"defaultExpr\" | \"defaultExprHint\"\n >);\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n } & DefaultValueOrExpr<P, 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<P>;\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 description of the component to be shown in Studio.\n */\n description?: 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 * Whether the component can be used as an attachment to an element.\n */\n isAttachment?: boolean;\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 GlobalContextMeta<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 description of the context to be shown in Studio.\n */\n description?: 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 GlobalContextRegistration {\n component: React.ComponentType<any>;\n meta: GlobalContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: GlobalContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerGlobalContext<\n T extends React.ComponentType<any>\n>(component: T, meta: GlobalContextMeta<React.ComponentProps<T>>) {\n root.__PlasmicContextRegistry.push({ component, meta });\n}\n","const root = globalThis as any;\n\nexport interface BasicTrait {\n label?: string;\n type: \"text\" | \"number\" | \"boolean\";\n}\n\nexport interface ChoiceTrait {\n label?: string;\n type: \"choice\";\n options: string[];\n}\n\nexport type TraitMeta = BasicTrait | ChoiceTrait;\n\nexport interface TraitRegistration {\n trait: string;\n meta: TraitMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicTraitRegistry: TraitRegistration[];\n }\n}\n\nif (root.__PlasmicTraitRegistry == null) {\n root.__PlasmicTraitRegistry = [];\n}\n\nexport default function registerTrait(trait: string, meta: TraitMeta) {\n root.__PlasmicTraitRegistry.push({\n trait,\n meta,\n });\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 * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerRenderErrorListener, setPlasmicRootNode } from \"./canvas-host\";\nimport * as hostModule from \"./exports\";\nimport { setRepeatedElementFn } from \"./repeatedElement\";\n\n// All exports must come from \"./exports\"\nexport * from \"./exports\";\n\nconst root = globalThis as any;\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 hostModule,\n hostUtils: {\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n },\n\n // For backwards compatibility:\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n ...hostModule,\n };\n}\n"],"names":["root","globalThis","__PlasmicHostVersion","rootChangeListeners","plasmicRootNode","value","val","_this","forEach","f","getPlasmicOrigin","x","msg","isString","Error","ensure","URL","location","hash","replace","searchParams","get","renderCount","setPlasmicRootNode","node","set","PlasmicCanvasContext","React","usePlasmicCanvasContext","_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","locationHash","URLSearchParams","plasmicContextValue","componentName","ReactDOM","ErrorBoundary","key","Provider","encodeURIComponent","href","style","width","height","border","position","top","left","zIndex","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","renderErrorListeners","registerRenderErrorListener","listener","state","getDerivedStateFromError","error","componentDidCatch","render","this","message","children","DataContext","createContext","undefined","applySelector","rawData","selector","curData","split","_curData","useSelector","useDataEnv","useSelectors","selectors","Object","fromEntries","entries","filter","map","args","tuple","useContext","DataProvider","name","data","existingEnv","DataCtxReader","registerFetcher","fetcher","meta","__PlasmicFetcherRegistry","registerComponent","component","__PlasmicComponentRegistry","registerGlobalContext","__PlasmicContextRegistry","registerTrait","trait","__PlasmicTraitRegistry","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","_root$__Sub","fn","console","log","hostModule","hostUtils"],"mappings":"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"}
package/dist/host.esm.js CHANGED
@@ -428,6 +428,19 @@ function registerGlobalContext(component, meta) {
428
428
  });
429
429
  }
430
430
 
431
+ var root$4 = globalThis;
432
+
433
+ if (root$4.__PlasmicTraitRegistry == null) {
434
+ root$4.__PlasmicTraitRegistry = [];
435
+ }
436
+
437
+ function registerTrait(trait, meta) {
438
+ root$4.__PlasmicTraitRegistry.push({
439
+ trait: trait,
440
+ meta: meta
441
+ });
442
+ }
443
+
431
444
  var _root$__Sub$setRepeat, _root$__Sub;
432
445
  /**
433
446
  * Allows a component from Plasmic Studio to be repeated.
@@ -462,8 +475,8 @@ var repeatedElementFn = function repeatedElementFn(isPrimary, elt) {
462
475
  return elt;
463
476
  };
464
477
 
465
- var root$4 = globalThis;
466
- var setRepeatedElementFn = (_root$__Sub$setRepeat = root$4 == null ? void 0 : (_root$__Sub = root$4.__Sub) == null ? void 0 : _root$__Sub.setRepeatedElementFn) != null ? _root$__Sub$setRepeat : function (fn) {
478
+ var root$5 = globalThis;
479
+ var setRepeatedElementFn = (_root$__Sub$setRepeat = root$5 == null ? void 0 : (_root$__Sub = root$5.__Sub) == null ? void 0 : _root$__Sub.setRepeatedElementFn) != null ? _root$__Sub$setRepeat : function (fn) {
467
480
  repeatedElementFn = fn;
468
481
  };
469
482
 
@@ -477,6 +490,7 @@ var hostModule = {
477
490
  unstable_registerFetcher: registerFetcher,
478
491
  registerComponent: registerComponent,
479
492
  registerGlobalContext: registerGlobalContext,
493
+ registerTrait: registerTrait,
480
494
  repeatedElement: repeatedElement,
481
495
  DataContext: DataContext,
482
496
  applySelector: applySelector,
@@ -487,13 +501,13 @@ var hostModule = {
487
501
  DataCtxReader: DataCtxReader
488
502
  };
489
503
 
490
- var root$5 = globalThis;
504
+ var root$6 = globalThis;
491
505
 
492
- if (root$5.__Sub == null) {
506
+ if (root$6.__Sub == null) {
493
507
  // Creating a side effect here by logging, so that vite won't
494
508
  // ignore this block for whatever reason
495
509
  console.log("Plasmic: Setting up app host dependencies");
496
- root$5.__Sub = /*#__PURE__*/_extends({
510
+ root$6.__Sub = /*#__PURE__*/_extends({
497
511
  React: React,
498
512
  ReactDOM: ReactDOM,
499
513
  hostModule: hostModule,
@@ -509,5 +523,5 @@ if (root$5.__Sub == null) {
509
523
  }, hostModule);
510
524
  }
511
525
 
512
- export { DataContext, DataCtxReader, DataProvider, PlasmicCanvasContext, PlasmicCanvasHost, applySelector, registerComponent, registerGlobalContext, repeatedElement, registerFetcher as unstable_registerFetcher, useDataEnv, usePlasmicCanvasContext, useSelector, useSelectors };
526
+ export { DataContext, DataCtxReader, DataProvider, PlasmicCanvasContext, PlasmicCanvasHost, applySelector, registerComponent, registerGlobalContext, registerTrait, repeatedElement, registerFetcher as unstable_registerFetcher, useDataEnv, usePlasmicCanvasContext, useSelector, useSelectors };
513
527
  //# sourceMappingURL=host.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.esm.js","sources":["../src/lang-utils.ts","../src/useForceUpdate.ts","../src/canvas-host.tsx","../src/common.ts","../src/data.tsx","../src/fetcher.ts","../src/registerComponent.ts","../src/registerGlobalContext.ts","../src/repeatedElement.ts","../src/index.ts"],"sourcesContent":["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","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { ensure } from \"./lang-utils\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\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;\nexport function 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 * If not, return false.\n * If so, return an object with more information about the component\n */\nexport const PlasmicCanvasContext =\n React.createContext<\n | {\n componentName: string | null;\n }\n | boolean\n >(false);\nexport const usePlasmicCanvasContext = () =>\n React.useContext(PlasmicCanvasContext);\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 const locationHash = new URLSearchParams(location.hash);\n const plasmicContextValue = isCanvas\n ? {\n componentName: locationHash.get(\"componentName\"),\n }\n : false;\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={plasmicContextValue}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <iframe\n src={`https://docs.plasmic.app/app-content/app-host-ready#appHostUrl=${encodeURIComponent(\n location.href\n )}`}\n style={{\n width: \"100vw\",\n height: \"100vh\",\n border: \"none\",\n position: \"fixed\",\n top: 0,\n left: 0,\n zIndex: 99999999,\n }}\n ></iframe>\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 const { enableWebpackHmr } = props;\n const [node, setNode] =\n React.useState<React.ReactElement<any, any> | null>(null);\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n };\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nexport function 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","export const tuple = <T extends any[]>(...args: T): T => args;\n","import React, { createContext, ReactNode, useContext } from \"react\";\nimport { tuple } from \"./common\";\n\nexport type DataDict = Record<string, any>;\n\nexport const DataContext = createContext<DataDict | undefined>(undefined);\n\nexport function applySelector(\n rawData: DataDict | undefined,\n selector: string | undefined\n): any {\n if (!selector) {\n return undefined;\n }\n let curData = rawData;\n for (const key of selector.split(\".\")) {\n curData = curData?.[key];\n }\n return curData;\n}\n\nexport type SelectorDict = Record<string, string | undefined>;\n\nexport function useSelector(selector: string | undefined): any {\n const rawData = useDataEnv();\n return applySelector(rawData, selector);\n}\n\nexport function useSelectors(selectors: SelectorDict = {}): any {\n const rawData = useDataEnv();\n return Object.fromEntries(\n Object.entries(selectors)\n .filter(([key, selector]) => !!key && !!selector)\n .map(([key, selector]) => tuple(key, applySelector(rawData, selector)))\n );\n}\n\nexport function useDataEnv() {\n return useContext(DataContext);\n}\n\nexport interface DataProviderProps {\n name?: string;\n data?: any;\n children?: ReactNode;\n}\n\nexport function DataProvider({ name, data, children }: DataProviderProps) {\n const existingEnv = useDataEnv() ?? {};\n if (!name) {\n return <>{children}</>;\n } else {\n return (\n <DataContext.Provider value={{ ...existingEnv, [name]: data }}>\n {children}\n </DataContext.Provider>\n );\n }\n}\n\nexport function DataCtxReader({\n children,\n}: {\n children: ($ctx: DataDict | undefined) => ReactNode;\n}) {\n const $ctx = useDataEnv();\n return children($ctx);\n}\n","import { PrimitiveType } from \"./registerComponent\";\n\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 readOnly?: boolean | ContextDependentConfig<P, boolean>;\n}\n\ntype DefaultValueOrExpr<P, T> =\n | {\n defaultExpr?: undefined;\n defaultExprHint?: undefined;\n defaultValue?: T;\n defaultValueHint?: T | ContextDependentConfig<P, T | undefined>;\n }\n | {\n defaultValue?: undefined;\n defaultValueHint?: undefined;\n defaultExpr?: string;\n defaultExprHint?: string;\n };\n\ntype StringTypeBase<P> = PropTypeBase<P> & DefaultValueOrExpr<P, string>;\n\nexport type StringType<P> =\n | \"string\"\n | ((\n | {\n type: \"string\";\n control?: \"default\" | \"large\";\n }\n | {\n type: \"code\";\n lang: \"css\" | \"html\" | \"javascript\" | \"json\";\n }\n | {\n type: \"code\";\n lang: \"graphql\";\n endpoint: string | ContextDependentConfig<P, string>;\n method?: string | ContextDependentConfig<P, string>;\n headers?: object | ContextDependentConfig<P, object>;\n variables?: object | ContextDependentConfig<P, object>;\n }\n ) &\n StringTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n } & DefaultValueOrExpr<P, boolean> &\n PropTypeBase<P>);\n\ntype NumberTypeBase<P> = PropTypeBase<P> &\n DefaultValueOrExpr<P, number> & {\n type: \"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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n } & DefaultValueOrExpr<P, any> &\n PropTypeBase<P>)\n | ({\n type: \"array\";\n } & DefaultValueOrExpr<P, any[]> &\n PropTypeBase<P>)\n | ({\n type: \"dataSource\";\n dataSource: \"airtable\" | \"cms\";\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n | ContextDependentConfig<\n P,\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n >;\n}\n\nexport type ChoiceType<P> = (\n | ({\n multiSelect?: false;\n } & DefaultValueOrExpr<P, string>)\n | ({\n multiSelect: true;\n } & DefaultValueOrExpr<P, string[]>)\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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n } & PropTypeBase<P> &\n DefaultValueOrExpr<P, any>);\n\ntype SlotType<P> =\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 /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n /**\n * Whether the slot is repeated, i.e., is rendered multiple times using\n * repeatedElement().\n */\n isRepeated?: boolean;\n } & Omit<\n DefaultValueOrExpr<P, PlasmicElement | PlasmicElement[]>,\n \"defaultValueHint\" | \"defaultExpr\" | \"defaultExprHint\"\n >);\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n } & DefaultValueOrExpr<P, 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<P>;\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 description of the component to be shown in Studio.\n */\n description?: 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 * Whether the component can be used as an attachment to an element.\n */\n isAttachment?: boolean;\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 GlobalContextMeta<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 description of the context to be shown in Studio.\n */\n description?: 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 GlobalContextRegistration {\n component: React.ComponentType<any>;\n meta: GlobalContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: GlobalContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerGlobalContext<\n T extends React.ComponentType<any>\n>(component: T, meta: GlobalContextMeta<React.ComponentProps<T>>) {\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 * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerRenderErrorListener, setPlasmicRootNode } from \"./canvas-host\";\nimport * as hostModule from \"./exports\";\nimport { setRepeatedElementFn } from \"./repeatedElement\";\n\n// All exports must come from \"./exports\"\nexport * from \"./exports\";\n\nconst root = globalThis as any;\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 hostModule,\n hostUtils: {\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n },\n\n // For backwards compatibility:\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n ...hostModule,\n };\n}\n"],"names":["isString","x","ensure","msg","undefined","Error","useForceUpdate","useState","setTick","update","useCallback","tick","root","globalThis","__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","usePlasmicCanvasContext","_PlasmicCanvasHost","isFrameAttached","window","parent","isCanvas","match","isLive","shouldRenderStudio","querySelector","forceUpdate","push","index","indexOf","splice","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","locationHash","URLSearchParams","plasmicContextValue","componentName","ReactDOM","ErrorBoundary","key","Provider","encodeURIComponent","href","style","width","height","border","position","top","left","zIndex","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","renderErrorListeners","registerRenderErrorListener","listener","state","getDerivedStateFromError","error","componentDidCatch","render","message","children","process","env","NODE_ENV","type","dangerouslySetInnerHTML","__html","tuple","args","DataContext","createContext","applySelector","rawData","selector","curData","split","useSelector","useDataEnv","useSelectors","selectors","Object","fromEntries","entries","filter","map","useContext","DataProvider","name","data","existingEnv","DataCtxReader","$ctx","__PlasmicFetcherRegistry","registerFetcher","fetcher","meta","__PlasmicComponentRegistry","registerComponent","component","__PlasmicContextRegistry","registerGlobalContext","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","fn","console","log","hostModule","hostUtils"],"mappings":"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"}
1
+ {"version":3,"file":"host.esm.js","sources":["../src/lang-utils.ts","../src/useForceUpdate.ts","../src/canvas-host.tsx","../src/common.ts","../src/data.tsx","../src/fetcher.ts","../src/registerComponent.ts","../src/registerGlobalContext.ts","../src/registerTrait.ts","../src/repeatedElement.ts","../src/index.ts"],"sourcesContent":["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","// tslint:disable:ordered-imports\n// organize-imports-ignore\nimport \"@plasmicapp/preamble\";\n\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { ensure } from \"./lang-utils\";\nimport useForceUpdate from \"./useForceUpdate\";\nconst root = globalThis as any;\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;\nexport function 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 * If not, return false.\n * If so, return an object with more information about the component\n */\nexport const PlasmicCanvasContext =\n React.createContext<\n | {\n componentName: string | null;\n }\n | boolean\n >(false);\nexport const usePlasmicCanvasContext = () =>\n React.useContext(PlasmicCanvasContext);\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 const locationHash = new URLSearchParams(location.hash);\n const plasmicContextValue = isCanvas\n ? {\n componentName: locationHash.get(\"componentName\"),\n }\n : false;\n return ReactDOM.createPortal(\n <ErrorBoundary key={`${renderCount}`}>\n <PlasmicCanvasContext.Provider value={plasmicContextValue}>\n {plasmicRootNode.get()}\n </PlasmicCanvasContext.Provider>\n </ErrorBoundary>,\n appDiv,\n \"plasmic-app\"\n );\n }\n if (shouldRenderStudio && window.parent === window) {\n return (\n <iframe\n src={`https://docs.plasmic.app/app-content/app-host-ready#appHostUrl=${encodeURIComponent(\n location.href\n )}`}\n style={{\n width: \"100vw\",\n height: \"100vh\",\n border: \"none\",\n position: \"fixed\",\n top: 0,\n left: 0,\n zIndex: 99999999,\n }}\n ></iframe>\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 const { enableWebpackHmr } = props;\n const [node, setNode] =\n React.useState<React.ReactElement<any, any> | null>(null);\n React.useEffect(() => {\n setNode(<_PlasmicCanvasHost />);\n }, []);\n return (\n <>\n {!enableWebpackHmr && <DisableWebpackHmr />}\n {node}\n </>\n );\n };\n\ntype RenderErrorListener = (err: Error) => void;\nconst renderErrorListeners: RenderErrorListener[] = [];\nexport function 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","export const tuple = <T extends any[]>(...args: T): T => args;\n","import React, { createContext, ReactNode, useContext } from \"react\";\nimport { tuple } from \"./common\";\n\nexport type DataDict = Record<string, any>;\n\nexport const DataContext = createContext<DataDict | undefined>(undefined);\n\nexport function applySelector(\n rawData: DataDict | undefined,\n selector: string | undefined\n): any {\n if (!selector) {\n return undefined;\n }\n let curData = rawData;\n for (const key of selector.split(\".\")) {\n curData = curData?.[key];\n }\n return curData;\n}\n\nexport type SelectorDict = Record<string, string | undefined>;\n\nexport function useSelector(selector: string | undefined): any {\n const rawData = useDataEnv();\n return applySelector(rawData, selector);\n}\n\nexport function useSelectors(selectors: SelectorDict = {}): any {\n const rawData = useDataEnv();\n return Object.fromEntries(\n Object.entries(selectors)\n .filter(([key, selector]) => !!key && !!selector)\n .map(([key, selector]) => tuple(key, applySelector(rawData, selector)))\n );\n}\n\nexport function useDataEnv() {\n return useContext(DataContext);\n}\n\nexport interface DataProviderProps {\n name?: string;\n data?: any;\n children?: ReactNode;\n}\n\nexport function DataProvider({ name, data, children }: DataProviderProps) {\n const existingEnv = useDataEnv() ?? {};\n if (!name) {\n return <>{children}</>;\n } else {\n return (\n <DataContext.Provider value={{ ...existingEnv, [name]: data }}>\n {children}\n </DataContext.Provider>\n );\n }\n}\n\nexport function DataCtxReader({\n children,\n}: {\n children: ($ctx: DataDict | undefined) => ReactNode;\n}) {\n const $ctx = useDataEnv();\n return children($ctx);\n}\n","import { PrimitiveType } from \"./registerComponent\";\n\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 readOnly?: boolean | ContextDependentConfig<P, boolean>;\n}\n\ntype DefaultValueOrExpr<P, T> =\n | {\n defaultExpr?: undefined;\n defaultExprHint?: undefined;\n defaultValue?: T;\n defaultValueHint?: T | ContextDependentConfig<P, T | undefined>;\n }\n | {\n defaultValue?: undefined;\n defaultValueHint?: undefined;\n defaultExpr?: string;\n defaultExprHint?: string;\n };\n\ntype StringTypeBase<P> = PropTypeBase<P> & DefaultValueOrExpr<P, string>;\n\nexport type StringType<P> =\n | \"string\"\n | ((\n | {\n type: \"string\";\n control?: \"default\" | \"large\";\n }\n | {\n type: \"code\";\n lang: \"css\" | \"html\" | \"javascript\" | \"json\";\n }\n | {\n type: \"code\";\n lang: \"graphql\";\n endpoint: string | ContextDependentConfig<P, string>;\n method?: string | ContextDependentConfig<P, string>;\n headers?: object | ContextDependentConfig<P, object>;\n variables?: object | ContextDependentConfig<P, object>;\n }\n ) &\n StringTypeBase<P>);\n\nexport type BooleanType<P> =\n | \"boolean\"\n | ({\n type: \"boolean\";\n } & DefaultValueOrExpr<P, boolean> &\n PropTypeBase<P>);\n\ntype NumberTypeBase<P> = PropTypeBase<P> &\n DefaultValueOrExpr<P, number> & {\n type: \"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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type JSONLikeType<P> =\n | \"object\"\n | ({\n type: \"object\";\n } & DefaultValueOrExpr<P, any> &\n PropTypeBase<P>)\n | ({\n type: \"array\";\n } & DefaultValueOrExpr<P, any[]> &\n PropTypeBase<P>)\n | ({\n type: \"dataSource\";\n dataSource: \"airtable\" | \"cms\";\n } & PropTypeBase<P>);\n\ninterface ChoiceTypeBase<P> extends PropTypeBase<P> {\n type: \"choice\";\n options:\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n | ContextDependentConfig<\n P,\n | string[]\n | {\n label: string;\n value: string | number | boolean;\n }[]\n >;\n}\n\nexport type ChoiceType<P> = (\n | ({\n multiSelect?: false;\n } & DefaultValueOrExpr<P, string>)\n | ({\n multiSelect: true;\n } & DefaultValueOrExpr<P, string[]>)\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\n/**\n * Expects defaultValue to be a JSON-compatible value\n */\nexport type CustomType<P> =\n | CustomControl<P>\n | ({\n type: \"custom\";\n control: CustomControl<P>;\n } & PropTypeBase<P> &\n DefaultValueOrExpr<P, any>);\n\ntype SlotType<P> =\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 /**\n * Whether the \"empty slot\" placeholder should be hidden in the canvas.\n */\n hidePlaceholder?: boolean;\n /**\n * Whether the slot is repeated, i.e., is rendered multiple times using\n * repeatedElement().\n */\n isRepeated?: boolean;\n } & Omit<\n DefaultValueOrExpr<P, PlasmicElement | PlasmicElement[]>,\n \"defaultValueHint\" | \"defaultExpr\" | \"defaultExprHint\"\n >);\n\ntype ImageUrlType<P> =\n | \"imageUrl\"\n | ({\n type: \"imageUrl\";\n } & DefaultValueOrExpr<P, 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<P>;\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 description of the component to be shown in Studio.\n */\n description?: 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 * Whether the component can be used as an attachment to an element.\n */\n isAttachment?: boolean;\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 GlobalContextMeta<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 description of the context to be shown in Studio.\n */\n description?: 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 GlobalContextRegistration {\n component: React.ComponentType<any>;\n meta: GlobalContextMeta<any>;\n}\n\ndeclare global {\n interface Window {\n __PlasmicContextRegistry: GlobalContextRegistration[];\n }\n}\n\nif (root.__PlasmicContextRegistry == null) {\n root.__PlasmicContextRegistry = [];\n}\n\nexport default function registerGlobalContext<\n T extends React.ComponentType<any>\n>(component: T, meta: GlobalContextMeta<React.ComponentProps<T>>) {\n root.__PlasmicContextRegistry.push({ component, meta });\n}\n","const root = globalThis as any;\n\nexport interface BasicTrait {\n label?: string;\n type: \"text\" | \"number\" | \"boolean\";\n}\n\nexport interface ChoiceTrait {\n label?: string;\n type: \"choice\";\n options: string[];\n}\n\nexport type TraitMeta = BasicTrait | ChoiceTrait;\n\nexport interface TraitRegistration {\n trait: string;\n meta: TraitMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicTraitRegistry: TraitRegistration[];\n }\n}\n\nif (root.__PlasmicTraitRegistry == null) {\n root.__PlasmicTraitRegistry = [];\n}\n\nexport default function registerTrait(trait: string, meta: TraitMeta) {\n root.__PlasmicTraitRegistry.push({\n trait,\n meta,\n });\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 * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { registerRenderErrorListener, setPlasmicRootNode } from \"./canvas-host\";\nimport * as hostModule from \"./exports\";\nimport { setRepeatedElementFn } from \"./repeatedElement\";\n\n// All exports must come from \"./exports\"\nexport * from \"./exports\";\n\nconst root = globalThis as any;\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 hostModule,\n hostUtils: {\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n },\n\n // For backwards compatibility:\n setPlasmicRootNode,\n registerRenderErrorListener,\n setRepeatedElementFn,\n ...hostModule,\n };\n}\n"],"names":["isString","x","ensure","msg","undefined","Error","useForceUpdate","useState","setTick","update","useCallback","tick","root","globalThis","__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","usePlasmicCanvasContext","_PlasmicCanvasHost","isFrameAttached","window","parent","isCanvas","match","isLive","shouldRenderStudio","querySelector","forceUpdate","push","index","indexOf","splice","scriptElt","id","async","onload","__GetlibsReadyResolver","head","append","appDiv","classList","add","locationHash","URLSearchParams","plasmicContextValue","componentName","ReactDOM","ErrorBoundary","key","Provider","encodeURIComponent","href","style","width","height","border","position","top","left","zIndex","PlasmicCanvasHost","props","enableWebpackHmr","setNode","DisableWebpackHmr","renderErrorListeners","registerRenderErrorListener","listener","state","getDerivedStateFromError","error","componentDidCatch","render","message","children","process","env","NODE_ENV","type","dangerouslySetInnerHTML","__html","tuple","args","DataContext","createContext","applySelector","rawData","selector","curData","split","useSelector","useDataEnv","useSelectors","selectors","Object","fromEntries","entries","filter","map","useContext","DataProvider","name","data","existingEnv","DataCtxReader","$ctx","__PlasmicFetcherRegistry","registerFetcher","fetcher","meta","__PlasmicComponentRegistry","registerComponent","component","__PlasmicContextRegistry","registerGlobalContext","__PlasmicTraitRegistry","registerTrait","trait","repeatedElement","isPrimary","elt","repeatedElementFn","Array","isArray","v","isValidElement","cloneElement","setRepeatedElementFn","__Sub","fn","console","log","hostModule","hostUtils"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAASA,QAAT,CAAkBC,CAAlB;AACE,SAAO,OAAOA,CAAP,KAAa,QAApB;AACD;;SAIeC,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;;SCduBK;AACtB,kBAAoBC,QAAQ,CAAC,CAAD,CAA5B;AAAA,MAASC,OAAT;;AACA,MAAMC,MAAM,GAAGC,WAAW,CAAC;AACzBF,IAAAA,OAAO,CAAC,UAACG,IAAD;AAAA,aAAUA,IAAI,GAAG,CAAjB;AAAA,KAAD,CAAP;AACD,GAFyB,EAEvB,EAFuB,CAA1B;AAGA,SAAOF,MAAP;AACD;;ACAD,IAAMG,IAAI,GAAGC,UAAb;;AAQA,IAAID,IAAI,CAACE,oBAAL,IAA6B,IAAjC,EAAuC;AACrCF,EAAAA,IAAI,CAACE,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,SAAO1B,MAAM,CACXqB,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,SAAgBC,mBAAmBC;AACjC;AACA;AACAF,EAAAA,WAAW;AACXjB,EAAAA,eAAe,CAACoB,GAAhB,CAAoBD,IAApB;AACD;AAED;;;;;;AAKA,IAAaE,oBAAoB,gBAC/BC,aAAA,CAKE,KALF,CADK;AAOP,IAAaC,uBAAuB,GAAG,SAA1BA,uBAA0B;AAAA,SACrCD,UAAA,CAAiBD,oBAAjB,CADqC;AAAA,CAAhC;;AAGP,SAASG,kBAAT;;;AACE;AACA;AACA;AACA;AACA,MAAMC,eAAe,GAAG,CAAC,CAACC,MAAM,CAACC,MAAjC;AACA,MAAMC,QAAQ,GAAG,CAAC,oBAACxB,QAAQ,CAACC,IAAV,aAAC,eAAewB,KAAf,CAAqB,iBAArB,CAAD,CAAlB;AACA,MAAMC,MAAM,GAAG,CAAC,qBAAC1B,QAAQ,CAACC,IAAV,aAAC,gBAAewB,KAAf,CAAqB,eAArB,CAAD,CAAD,IAA2C,CAACJ,eAA3D;AACA,MAAMM,kBAAkB,GACtBN,eAAe,IACf,CAACd,QAAQ,CAACqB,aAAT,CAAuB,qBAAvB,CADD,IAEA,CAACJ,QAFD,IAGA,CAACE,MAJH;AAKA,MAAMG,WAAW,GAAGhD,cAAc,EAAlC;AACAqC,EAAAA,eAAA,CAAsB;AACpB5B,IAAAA,mBAAmB,CAACwC,IAApB,CAAyBD,WAAzB;AACA,WAAO;AACL,UAAME,KAAK,GAAGzC,mBAAmB,CAAC0C,OAApB,CAA4BH,WAA5B,CAAd;;AACA,UAAIE,KAAK,IAAI,CAAb,EAAgB;AACdzC,QAAAA,mBAAmB,CAAC2C,MAApB,CAA2BF,KAA3B,EAAkC,CAAlC;AACD;AACF,KALD;AAMD,GARD,EAQG,CAACF,WAAD,CARH;AASAX,EAAAA,SAAA,CAAgB;AACd,QAAIS,kBAAkB,IAAIN,eAAtB,IAAyCC,MAAM,CAACC,MAAP,KAAkBD,MAA/D,EAAuE;AACrEjB,MAAAA,sBAAsB;AACvB;AACF,GAJD,EAIG,CAACsB,kBAAD,EAAqBN,eAArB,CAJH;AAKAH,EAAAA,SAAA,CAAgB;AACd,QAAI,CAACS,kBAAD,IAAuB,CAACpB,QAAQ,CAACqB,aAAT,CAAuB,UAAvB,CAAxB,IAA8DF,MAAlE,EAA0E;AACxE,UAAMQ,SAAS,GAAG3B,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAAlB;AACA0B,MAAAA,SAAS,CAACC,EAAV,GAAe,SAAf;AACAD,MAAAA,SAAS,CAACxB,GAAV,GAAgBb,gBAAgB,KAAK,uBAArC;AACAqC,MAAAA,SAAS,CAACE,KAAV,GAAkB,KAAlB;;AACAF,MAAAA,SAAS,CAACG,MAAV,GAAmB;AAChBf,QAAAA,MAAc,CAACgB,sBAAf,oBAAAhB,MAAc,CAACgB,sBAAf;AACF,OAFD;;AAGA/B,MAAAA,QAAQ,CAACgC,IAAT,CAAcC,MAAd,CAAqBN,SAArB;AACD;AACF,GAXD,EAWG,CAACP,kBAAD,CAXH;;AAYA,MAAI,CAACN,eAAL,EAAsB;AACpB,WAAO,IAAP;AACD;;AACD,MAAIG,QAAQ,IAAIE,MAAhB,EAAwB;AACtB,QAAIe,MAAM,GAAGlC,QAAQ,CAACqB,aAAT,CAAuB,8BAAvB,CAAb;;AACA,QAAI,CAACa,MAAL,EAAa;AACXA,MAAAA,MAAM,GAAGlC,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAT;AACAiC,MAAAA,MAAM,CAACN,EAAP,GAAY,aAAZ;AACAM,MAAAA,MAAM,CAACC,SAAP,CAAiBC,GAAjB,CAAqB,iBAArB;AACApC,MAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0B6B,MAA1B;AACD;;AACD,QAAMG,YAAY,GAAG,IAAIC,eAAJ,CAAoB7C,QAAQ,CAACC,IAA7B,CAArB;AACA,QAAM6C,mBAAmB,GAAGtB,QAAQ,GAChC;AACEuB,MAAAA,aAAa,EAAEH,YAAY,CAACxC,GAAb,CAAiB,eAAjB;AADjB,KADgC,GAIhC,KAJJ;AAKA,WAAO4C,YAAA,CACL9B,aAAA,CAAC+B,aAAD;AAAeC,MAAAA,GAAG,OAAKrC;KAAvB,EACEK,aAAA,CAACD,oBAAoB,CAACkC,QAAtB;AAA+B3D,MAAAA,KAAK,EAAEsD;KAAtC,EACGlD,eAAe,CAACQ,GAAhB,EADH,CADF,CADK,EAMLqC,MANK,EAOL,aAPK,CAAP;AASD;;AACD,MAAId,kBAAkB,IAAIL,MAAM,CAACC,MAAP,KAAkBD,MAA5C,EAAoD;AAClD,WACEJ,aAAA,SAAA;AACER,MAAAA,GAAG,sEAAoE0C,kBAAkB,CACvFpD,QAAQ,CAACqD,IAD8E;AAGzFC,MAAAA,KAAK,EAAE;AACLC,QAAAA,KAAK,EAAE,OADF;AAELC,QAAAA,MAAM,EAAE,OAFH;AAGLC,QAAAA,MAAM,EAAE,MAHH;AAILC,QAAAA,QAAQ,EAAE,OAJL;AAKLC,QAAAA,GAAG,EAAE,CALA;AAMLC,QAAAA,IAAI,EAAE,CAND;AAOLC,QAAAA,MAAM,EAAE;AAPH;KAJT,CADF;AAgBD;;AACD,SAAO,IAAP;AACD;;AAqBD,IAAaC,iBAAiB,GAC5B,SADWA,iBACX,CAACC,KAAD;AACE,MAAQC,gBAAR,GAA6BD,KAA7B,CAAQC,gBAAR;;AACA,wBACE9C,QAAA,CAAoD,IAApD,CADF;AAAA,MAAOH,IAAP;AAAA,MAAakD,OAAb;;AAEA/C,EAAAA,SAAA,CAAgB;AACd+C,IAAAA,OAAO,CAAC/C,aAAA,CAACE,kBAAD,MAAA,CAAD,CAAP;AACD,GAFD,EAEG,EAFH;AAGA,SACEF,aAAA,SAAA,MAAA,EACG,CAAC8C,gBAAD,IAAqB9C,aAAA,CAACgD,iBAAD,MAAA,CADxB,EAEGnD,IAFH,CADF;AAMD,CAdI;AAiBP,IAAMoD,oBAAoB,GAA0B,EAApD;AACA,SAAgBC,4BAA4BC;AAC1CF,EAAAA,oBAAoB,CAACrC,IAArB,CAA0BuC,QAA1B;AACA,SAAO;AACL,QAAMtC,KAAK,GAAGoC,oBAAoB,CAACnC,OAArB,CAA6BqC,QAA7B,CAAd;;AACA,QAAItC,KAAK,IAAI,CAAb,EAAgB;AACdoC,MAAAA,oBAAoB,CAAClC,MAArB,CAA4BF,KAA5B,EAAmC,CAAnC;AACD;AACF,GALD;AAMD;;IAUKkB;;;AAIJ,yBAAYc,KAAZ;;;AACE,yCAAMA,KAAN;AACA,WAAKO,KAAL,GAAa,EAAb;;AACD;;gBAEMC,2BAAP,kCAAgCC,KAAhC;AACE,WAAO;AAAEA,MAAAA,KAAK,EAALA;AAAF,KAAP;AACD;;;;SAEDC,oBAAA,2BAAkBD,KAAlB;AACEL,IAAAA,oBAAoB,CAACzE,OAArB,CAA6B,UAAC2E,QAAD;AAAA,aAAcA,QAAQ,CAACG,KAAD,CAAtB;AAAA,KAA7B;AACD;;SAEDE,SAAA;AACE,QAAI,KAAKJ,KAAL,CAAWE,KAAf,EAAsB;AACpB,aAAOtD,aAAA,MAAA,MAAA,WAAA,OAAgB,KAAKoD,KAAL,CAAWE,KAAX,CAAiBG,OAAjC,CAAP;AACD,KAFD,MAEO;AACL,aAAO,KAAKZ,KAAL,CAAWa,QAAlB;AACD;AACF;;;EAvByB1D;;AA0B5B,SAASgD,iBAAT;AACE,MAAIW,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAA7B,EAA2C;AACzC,WAAO,IAAP;AACD;;AACD,SACE7D,aAAA,SAAA;AACE8D,IAAAA,IAAI,EAAC;AACLC,IAAAA,uBAAuB,EAAE;AACvBC,MAAAA,MAAM;AADiB;GAF3B,CADF;AAsBD;;AC1QM,IAAMC,KAAK,GAAG,SAARA,KAAQ;AAAA,oCAAqBC,IAArB;AAAqBA,IAAAA,IAArB;AAAA;;AAAA,SAAoCA,IAApC;AAAA,CAAd;;ICKMC,WAAW,gBAAGC,aAAa,CAAuB3G,SAAvB,CAAjC;AAEP,SAAgB4G,cACdC,SACAC;AAEA,MAAI,CAACA,QAAL,EAAe;AACb,WAAO9G,SAAP;AACD;;AACD,MAAI+G,OAAO,GAAGF,OAAd;;AACA,uDAAkBC,QAAQ,CAACE,KAAT,CAAe,GAAf,CAAlB,wCAAuC;AAAA;;AAAA,QAA5BzC,GAA4B;AACrCwC,IAAAA,OAAO,eAAGA,OAAH,qBAAG,SAAUxC,GAAV,CAAV;AACD;;AACD,SAAOwC,OAAP;AACD;AAID,SAAgBE,YAAYH;AAC1B,MAAMD,OAAO,GAAGK,UAAU,EAA1B;AACA,SAAON,aAAa,CAACC,OAAD,EAAUC,QAAV,CAApB;AACD;AAED,SAAgBK,aAAaC;MAAAA;AAAAA,IAAAA,YAA0B;;;AACrD,MAAMP,OAAO,GAAGK,UAAU,EAA1B;AACA,SAAOG,MAAM,CAACC,WAAP,CACLD,MAAM,CAACE,OAAP,CAAeH,SAAf,EACGI,MADH,CACU;AAAA,QAAEjD,GAAF;AAAA,QAAOuC,QAAP;AAAA,WAAqB,CAAC,CAACvC,GAAF,IAAS,CAAC,CAACuC,QAAhC;AAAA,GADV,EAEGW,GAFH,CAEO;AAAA,QAAElD,GAAF;AAAA,QAAOuC,QAAP;AAAA,WAAqBN,KAAK,CAACjC,GAAD,EAAMqC,aAAa,CAACC,OAAD,EAAUC,QAAV,CAAnB,CAA1B;AAAA,GAFP,CADK,CAAP;AAKD;AAED,SAAgBI;AACd,SAAOQ,UAAU,CAAChB,WAAD,CAAjB;AACD;AAQD,SAAgBiB;;;MAAeC,aAAAA;MAAMC,aAAAA;MAAM5B,iBAAAA;AACzC,MAAM6B,WAAW,kBAAGZ,UAAU,EAAb,0BAAmB,EAApC;;AACA,MAAI,CAACU,IAAL,EAAW;AACT,WAAOrF,4BAAA,wBAAA,MAAA,EAAG0D,QAAH,CAAP;AACD,GAFD,MAEO;AAAA;;AACL,WACE1D,4BAAA,CAACmE,WAAW,CAAClC,QAAb;AAAsB3D,MAAAA,KAAK,eAAOiH,WAAP,6BAAqBF,IAArB,IAA4BC,IAA5B;KAA3B,EACG5B,QADH,CADF;AAKD;AACF;AAED,SAAgB8B;MACd9B,iBAAAA;AAIA,MAAM+B,IAAI,GAAGd,UAAU,EAAvB;AACA,SAAOjB,QAAQ,CAAC+B,IAAD,CAAf;AACD;;ACjED,IAAMxH,MAAI,GAAGC,UAAb;AAyCAD,MAAI,CAACyH,wBAAL,GAAgC,EAAhC;AAEA,SAAgBC,gBAAgBC,SAAkBC;AAChD5H,EAAAA,MAAI,CAACyH,wBAAL,CAA8B9E,IAA9B,CAAmC;AAAEgF,IAAAA,OAAO,EAAPA,OAAF;AAAWC,IAAAA,IAAI,EAAJA;AAAX,GAAnC;AACD;;ACzCD,IAAM5H,MAAI,GAAGC,UAAb;;AAwWA,IAAID,MAAI,CAAC6H,0BAAL,IAAmC,IAAvC,EAA6C;AAC3C7H,EAAAA,MAAI,CAAC6H,0BAAL,GAAkC,EAAlC;AACD;;AAED,SAAwBC,kBACtBC,WACAH;AAEA5H,EAAAA,MAAI,CAAC6H,0BAAL,CAAgClF,IAAhC,CAAqC;AAAEoF,IAAAA,SAAS,EAATA,SAAF;AAAaH,IAAAA,IAAI,EAAJA;AAAb,GAArC;AACD;;AC7WD,IAAM5H,MAAI,GAAGC,UAAb;;AAkFA,IAAID,MAAI,CAACgI,wBAAL,IAAiC,IAArC,EAA2C;AACzChI,EAAAA,MAAI,CAACgI,wBAAL,GAAgC,EAAhC;AACD;;AAED,SAAwBC,sBAEtBF,WAAcH;AACd5H,EAAAA,MAAI,CAACgI,wBAAL,CAA8BrF,IAA9B,CAAmC;AAAEoF,IAAAA,SAAS,EAATA,SAAF;AAAaH,IAAAA,IAAI,EAAJA;AAAb,GAAnC;AACD;;ACpGD,IAAM5H,MAAI,GAAGC,UAAb;;AA0BA,IAAID,MAAI,CAACkI,sBAAL,IAA+B,IAAnC,EAAyC;AACvClI,EAAAA,MAAI,CAACkI,sBAAL,GAA8B,EAA9B;AACD;;AAED,SAAwBC,cAAcC,OAAeR;AACnD5H,EAAAA,MAAI,CAACkI,sBAAL,CAA4BvF,IAA5B,CAAiC;AAC/ByF,IAAAA,KAAK,EAALA,KAD+B;AAE/BR,IAAAA,IAAI,EAAJA;AAF+B,GAAjC;AAID;;;ACjCD;;;;;;;;;;;AAUA,SAAwBS,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,CAACtB,GAAJ,CAAQ,UAAC0B,CAAD;AAAA,aAAON,eAAe,CAACC,SAAD,EAAYK,CAAZ,CAAtB;AAAA,KAAR,CAAR;AACD;;AACD,MAAIJ,GAAG,IAAIK,cAAc,CAACL,GAAD,CAArB,IAA8B,OAAOA,GAAP,KAAe,QAAjD,EAA2D;AACzD,WAAQM,YAAY,CAACN,GAAD,CAApB;AACD;;AACD,SAAOA,GAAP;AACD,CAXD;;AAaA,IAAMvI,MAAI,GAAGC,UAAb;AACA,AAAO,IAAM6I,oBAAoB,4BAC/B9I,MAD+B,mCAC/BA,MAAI,CAAE+I,KADyB,qBAC/B,YAAaD,oBADkB,oCAE/B,UAAUE,EAAV;AACER,EAAAA,iBAAiB,GAAGQ,EAApB;AACD,CAJI;;;;;;;;;;;;;;;;;;;;;;;ACrBP,IAAMhJ,MAAI,GAAGC,UAAb;;AAEA,IAAID,MAAI,CAAC+I,KAAL,IAAc,IAAlB,EAAwB;AACtB;AACA;AACAE,EAAAA,OAAO,CAACC,GAAR,CAAY,2CAAZ;AACAlJ,EAAAA,MAAI,CAAC+I,KAAL;AACEhH,IAAAA,KAAK,EAALA,KADF;AAEE8B,IAAAA,QAAQ,EAARA,QAFF;AAGEsF,IAAAA,UAAU,EAAVA,UAHF;AAIEC,IAAAA,SAAS,EAAE;AACTzH,MAAAA,kBAAkB,EAAlBA,kBADS;AAETsD,MAAAA,2BAA2B,EAA3BA,2BAFS;AAGT6D,MAAAA,oBAAoB,EAApBA;AAHS,KAJb;AAUE;AACAnH,IAAAA,kBAAkB,EAAlBA,kBAXF;AAYEsD,IAAAA,2BAA2B,EAA3BA,2BAZF;AAaE6D,IAAAA,oBAAoB,EAApBA;AAbF,KAcKK,UAdL;AAgBD;;;;"}
@@ -0,0 +1,20 @@
1
+ export interface BasicTrait {
2
+ label?: string;
3
+ type: "text" | "number" | "boolean";
4
+ }
5
+ export interface ChoiceTrait {
6
+ label?: string;
7
+ type: "choice";
8
+ options: string[];
9
+ }
10
+ export declare type TraitMeta = BasicTrait | ChoiceTrait;
11
+ export interface TraitRegistration {
12
+ trait: string;
13
+ meta: TraitMeta;
14
+ }
15
+ declare global {
16
+ interface Window {
17
+ __PlasmicTraitRegistry: TraitRegistration[];
18
+ }
19
+ }
20
+ export default function registerTrait(trait: string, meta: TraitMeta): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasmicapp/host",
3
- "version": "1.0.43",
3
+ "version": "1.0.44",
4
4
  "description": "plasmic library for app hosting",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -8,7 +8,8 @@
8
8
  "files": [
9
9
  "dist",
10
10
  "registerComponent",
11
- "registerGlobalContext"
11
+ "registerGlobalContext",
12
+ "registerTrait"
12
13
  ],
13
14
  "size-limit": [
14
15
  {
@@ -55,5 +56,5 @@
55
56
  "react": ">=16.8.0",
56
57
  "react-dom": ">=16.8.0"
57
58
  },
58
- "gitHead": "89ecf01cc166b8af87a4441d0a8624c6d807068c"
59
+ "gitHead": "c7dc4de9512e635061037a5937e12e57280c3700"
59
60
  }
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var root = globalThis;
6
+ if (root.__PlasmicTraitRegistry == null) {
7
+ root.__PlasmicTraitRegistry = [];
8
+ }
9
+ function registerTrait(trait, meta) {
10
+ root.__PlasmicTraitRegistry.push({
11
+ trait: trait,
12
+ meta: meta,
13
+ });
14
+ }
15
+
16
+ exports['default'] = registerTrait;
17
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/registerTrait.ts"],"sourcesContent":["const root = globalThis as any;\n\nexport interface BasicTrait {\n label?: string;\n type: \"text\" | \"number\" | \"boolean\";\n}\n\nexport interface ChoiceTrait {\n label?: string;\n type: \"choice\";\n options: string[];\n}\n\nexport type TraitMeta = BasicTrait | ChoiceTrait;\n\nexport interface TraitRegistration {\n trait: string;\n meta: TraitMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicTraitRegistry: TraitRegistration[];\n }\n}\n\nif (root.__PlasmicTraitRegistry == null) {\n root.__PlasmicTraitRegistry = [];\n}\n\nexport default function registerTrait(trait: string, meta: TraitMeta) {\n root.__PlasmicTraitRegistry.push({\n trait,\n meta,\n });\n}\n"],"names":[],"mappings":";;;;AAAA,IAAM,IAAI,GAAG,UAAiB,CAAC;AA0B/B,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,EAAE;IACvC,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;CAClC;SAEuB,aAAa,CAAC,KAAa,EAAE,IAAe;IAClE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;QAC/B,KAAK,OAAA;QACL,IAAI,MAAA;KACL,CAAC,CAAC;AACL;;;;"}
@@ -0,0 +1,13 @@
1
+ var root = globalThis;
2
+ if (root.__PlasmicTraitRegistry == null) {
3
+ root.__PlasmicTraitRegistry = [];
4
+ }
5
+ function registerTrait(trait, meta) {
6
+ root.__PlasmicTraitRegistry.push({
7
+ trait: trait,
8
+ meta: meta,
9
+ });
10
+ }
11
+
12
+ export { registerTrait as default };
13
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/registerTrait.ts"],"sourcesContent":["const root = globalThis as any;\n\nexport interface BasicTrait {\n label?: string;\n type: \"text\" | \"number\" | \"boolean\";\n}\n\nexport interface ChoiceTrait {\n label?: string;\n type: \"choice\";\n options: string[];\n}\n\nexport type TraitMeta = BasicTrait | ChoiceTrait;\n\nexport interface TraitRegistration {\n trait: string;\n meta: TraitMeta;\n}\n\ndeclare global {\n interface Window {\n __PlasmicTraitRegistry: TraitRegistration[];\n }\n}\n\nif (root.__PlasmicTraitRegistry == null) {\n root.__PlasmicTraitRegistry = [];\n}\n\nexport default function registerTrait(trait: string, meta: TraitMeta) {\n root.__PlasmicTraitRegistry.push({\n trait,\n meta,\n });\n}\n"],"names":[],"mappings":"AAAA,IAAM,IAAI,GAAG,UAAiB,CAAC;AA0B/B,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,EAAE;IACvC,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;CAClC;SAEuB,aAAa,CAAC,KAAa,EAAE,IAAe;IAClE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;QAC/B,KAAK,OAAA;QACL,IAAI,MAAA;KACL,CAAC,CAAC;AACL;;;;"}
@@ -0,0 +1,20 @@
1
+ export interface BasicTrait {
2
+ label?: string;
3
+ type: "text" | "number" | "boolean";
4
+ }
5
+ export interface ChoiceTrait {
6
+ label?: string;
7
+ type: "choice";
8
+ options: string[];
9
+ }
10
+ export declare type TraitMeta = BasicTrait | ChoiceTrait;
11
+ export interface TraitRegistration {
12
+ trait: string;
13
+ meta: TraitMeta;
14
+ }
15
+ declare global {
16
+ interface Window {
17
+ __PlasmicTraitRegistry: TraitRegistration[];
18
+ }
19
+ }
20
+ export default function registerTrait(trait: string, meta: TraitMeta): void;
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "dist/index.cjs.js",
3
+ "types": "dist/registerTrait.d.ts",
4
+ "module": "dist/index.esm.js"
5
+ }